[Powered by Google Translate] [Section 8 - Plus confortable] [Rob Bowden - Université de Harvard] [C'est CS50. - CS50.TV] Ces notes de sections semaines vont être assez court, donc je vais juste continuer à parler, vous les gars vont continuer à poser des questions, et nous allons essayer de remplir autant de temps que possible. Beaucoup de gens pensent que ce pset n'est pas forcément difficile, mais c'est très long. La spécification pset lui-même prend une heure à lire. Nous vous donnons une bonne partie du SQL, vous pourriez avoir besoin d'utiliser. Nous vous guidera à travers beaucoup de lui, il ne devrait pas être trop mauvais. Quelqu'un at-il commencé ou fini? C'est le pset dernier. Oh, mon Dieu. Habituellement, il s'agit d'un JavaScript uns après cela, mais les choses changent calendrier rend tout 1 semaine plus courte, et nous n'avons plus de pset JavaScript. Je ne sais pas comment cela affecte si JavaScript est va apparaître sur l'examen ou Quiz 1. J'imagine que ce sera quelque chose que vous avez besoin de savoir des choses de haut niveau sur JavaScript, mais je doute que nous venions de vous donner directement le code JavaScript puisque vous n'avez pas eu un pset en elle. Mais ce sera chose pour examen questionnaire semaine prochaine. Section des questions. Un grand nombre de ce genre de choses est un peu mal formulée, mais nous allons expliquer pourquoi. Contrairement au C, PHP est un "typé dynamiquement" la langue. Qu'est-ce que cela veut dire, demandez-vous? Eh bien, disons au revoir à tous ceux char, float, int, et d'autres mots clés dont vous avez besoin pour utiliser lors de la déclaration des variables et des fonctions en C. En PHP, le type d'une variable est déterminée par la valeur qu'il est actuellement retenue. Donc, avant de taper ce code dans un fichier nommé dynamic.php, PHP est typé dynamiquement. C'est vrai. Je suis en désaccord avec le fait que cela signifie que nous disons au revoir à char, float, int, et d'autres mots clés. La différence exacte entre typé dynamiquement et l'alternative, qui est typé statiquement, c'est que typage dynamique, l'ensemble de votre vérification de type et d'autres choses qui se passe au moment de l'exécution, alors que statiquement typé, il arrive au moment de la compilation. Le mot statique en général semble signifier des choses de compilation. Je pense qu'il ya d'autres utilisations pour elle, mais en C lorsque vous déclarez une variable statique, sa mémoire est allouée au moment de la compilation. Ici, à typage dynamique signifie simplement que - En C, si vous essayez d'ajouter une chaîne et un entier, lorsque vous compilez-le, il va se plaindre parce qu'il va dire que vous ne pouvez pas ajouter un int et un pointeur. Il n'est tout simplement pas une opération valide. C'est une autre chose que nous aurons dans un instant. Mais ce genre de vérification, le fait qu'elle se plaint au moment de la compilation, est la vérification de type statique. Il ya des langues où vous n'avez pas besoin de dire char, float, int, et toutes ces choses, mais la langue peut dire à partir du contexte de la chose quel type il est censé être, mais il est toujours typé statiquement. Donc, si vous prenez 51, OCaml, vous n'avez jamais besoin d'utiliser un de ces types, mais elle ne sera au moment de la compilation que vous ne pouvez pas faire cela parce que vous mélangez un entier et une chaîne. Typage dynamique signifie simplement que parfois au cours de l'exécution que vous allez recevoir une plainte. Si vous avez également utilisé Java avant, en général, presque toutes les langues de type C va être statiquement typé, donc C, C + +, Java, tous ceux qui sont généralement typé statiquement. En Java, lorsque vous compilez quelque chose et que vous dites chaîne s est égal à quelque chose de nouveau qui n'est pas une chaîne, qui va se plaindre parce que ces types n'ont tout simplement pas à la hauteur. Cela va se plaindre au moment de la compilation. Mais elle a aussi un peu de temps dynamique des choses comme si vous essayer de lancer quelque chose à un type qui est plus spécifique que le type actuel, il n'y a rien qu'il puisse faire au moment de la compilation pour vérifier si cette fonte va réussir. Java possède également un certain type dynamique vérifiant que dès qu'il arrive à cette ligne de code quand il est réellement l'exécuter, il va faire le casting, vérifier si cette fonte était valide en premier lieu, et si ce n'était pas le cas, alors il va se plaindre que vous avez un type non valide. Type dynamique vérification. Tapez ceci dans un fichier appelé dynamic.php. Dynamic.php. Je vais décompresser ce formatage. Nous disposons d'une variable, nous l'avons mis à l'entier 7, alors nous allons l'imprimer et% s - Oh, nous imprimons le type de celui-ci, de sorte gettype va retourner le type de la variable. Nous sommes en train d'imprimer le type maintes et maintes fois. Nous venons de php.dynamic.php. Nous allons voir qu'elle varie d'un entier en chaîne en valeur booléenne que nous traversons. En C il n'existe pas de type de données Boolean, il n'existe pas de type de données chaîne. Il ya char * et booléenne tend simplement à être int ou char ou quelque chose. En PHP ces types existent, et c'est un des grands avantages de PHP sur C - que les opérations de chaîne sont infiniment plus facile en PHP que C. Ils ont juste travailler. Donc, nous reviendrons ici. Nous avons couru dynamic.php. Cela indique à l'interpréteur PHP, php appelé, pour exécuter le code PHP dans dynamic.php. Si vous avez des erreurs dans le fichier, l'interprète vous le diront! L'interprète, c'est une autre grande différence entre PHP et C. En C, vous devez compiler quelque chose et puis vous exécutez ce fichier compilé. En PHP, vous ne jamais compiler quoi que ce soit. Ainsi, l'interpréteur PHP est fondamentalement juste la lecture ligne par ligne. Il frappe var = 7, puis il frappe printf puis il frappe var puis il frappe printf et ainsi de suite. Il ya un peu de la compilation, il le fait, et il met en cache les résultats donc si vous exécutez le script plus tard, vous pouvez le faire certains, mais au fond, c'est une ligne trier par ligne de chose. Cela signifie que beaucoup des optimisations que nous obtenons en C, comme la compilation, c'est juste généralement le compilateur peut faire beaucoup de trucs pour vous. Il peut prendre les variables inutilisées, il peut faire toutes ces sortes de choses, il peut faire la récursivité terminale. En PHP, vous n'allez pas obtenir cet avantage car il va juste commencer à exécuter ligne par ligne par ligne, et il ne reconnaît pas vraiment ces choses aussi facilement car ce n'est pas 1 pass compilation big sur la chose, puis l'exécution; c'est juste ligne par ligne. Donc, c'est l'interprète. Retour à notre typage dynamique: assez cool, hein? Vous avez certainement ne pouvait pas le faire en C! Maintenant, voyez si vous pouvez déterminer le type de chacune des valeurs suivantes. Voir ce pour référence. Donc, 3,50. Quel type pensez-vous que ça va être? Voici les types que nous avons. Nous avons bools, entiers, flottants, chaînes, tableaux, objets, puis les ressources, ce qui est assez vague. Je pense qu'il ya effectivement un exemple ici. Ensuite, il ya la valeur NULL. NULL est un type spécial. Contrairement au C où NULL est juste un pointeur avec l'adresse 0, en PHP, NULL est son propre type où la seule chose valable de ce type est NULL. Cela est beaucoup plus utile pour la vérification d'erreur. En C, où nous avons eu ce problème où si vous retournera NULL, ça veut dire que vous êtes de retour un pointeur NULL NULL ou utiliser pour signifier erreur tout ou partie de cette confusion que nous avions à un moment donné. Ici, renvoyer NULL signifie généralement une erreur. Beaucoup de choses retournent également false à l'erreur. Mais le point est le type NULL, la seule chose que du type NULL est NULL. Puis rappel est comme vous pouvez définir des fonctions anonymes. Vous n'avez pas à donner à la fonction d'un nom, mais vous n'aurez pas à faire face à cela ici. En regardant les types qu'ils ne s'attendent que nous sachions, que pensez-vous du type de 3.50 est? >> [L'élève] Float. Ouais. Alors ici, que pensez-vous du type de ce que c'est? >> [L'élève] Array. Ouais. La première est une float, le second est un tableau. Notez que ce tableau n'est pas comme un tableau C où vous avez l'index 0 a une certaine valeur, l'indice 1 a une certaine valeur. Ici les indices sont a, b et c et les valeurs sont 1, 2, et 3. En PHP il n'ya pas de différence entre un tableau associatif et tout un réseau régulier comme on aurait pu penser qu'il en C. Il ya juste cela, et sous le capot un réseau régulier est juste un tableau associatif où 0 correspond à une certaine valeur de la même façon une carte à une certaine valeur. Pour cette raison, PHP peut être assez mauvais pour vraiment rapides de code / benchmarking des choses puisque dans C lorsque vous utilisez un tableau, vous savez que l'accès à un membre est la constante de temps. En PHP d'accéder à un membre est qui sait combien de temps? C'est probablement constante si elle hachages correctement. Qui sait ce qu'il fait réellement sous le capot? Vous avez vraiment besoin de regarder la mise en œuvre de voir comment il va s'en occuper. Alors fopen. Je pense ici nous allons simplement PHP fopen manuel de regarder le type de retour. Nous voyons ici que vous pouvez regarder à peu près n'importe quelle fonction dans le manuel PHP et c'est en quelque sorte la page de manuel de PHP. Le type de retour va être des ressources. C'est pourquoi je l'ai cherché, parce que nous n'avons pas vraiment définir des ressources. L'idée de la ressource, en C, vous sorte de se FILE * ou que ce soit; PHP, la ressource est votre FILE *. C'est ce que vous allez lire à partir, c'est ce que vous allez écrire à. Il est généralement externe, donc c'est une ressource que vous pouvez tirer les choses et jeter des choses à. Et enfin, quel est le type de la valeur NULL? >> [L'élève] NULL. Ouais. Donc, la seule chose qui vaut NULL est NULL. NULL est NULL. Une des caractéristiques de système de type PHP (pour le meilleur ou pour le pire) est sa capacité à jongler avec les types. Lorsque vous écrivez une ligne de code PHP qui combine les valeurs des différents types, PHP va essayer de faire la chose sensée. Essayez chacune des lignes suivantes de code PHP. Qu'est-ce une impression? Est-ce que vous attendiez? Pourquoi ou pourquoi pas? Ce fait à propos de PHP est ce qu'il fait ce que nous appelons faiblement typé. Faiblement typé et fortement typé, il ya différentes utilisations de ces termes, mais la plupart des gens utilisent faiblement typé et fortement typé à dire ce genre de chose où ("1" + 2); qui fonctionne. En C qui ne fonctionnerait pas. Vous pouvez imaginer ce ne fonctionne pas. Beaucoup de gens mélangent le typage dynamique et typage faible et typage statique et le typage fort. Python est un autre exemple d'une langue qui est typé dynamiquement. Vous pouvez jeter autour des différents types de variables et il va déterminer lors de l'exécution des vérifications d'erreur. En Python il va exécuter cela et il verra ("1" + 2); et cela va échouer, car il dit que vous ne pouvez pas ajouter une chaîne et un entier. En PHP, ce qui est tout aussi typé dynamiquement, ce qui ne manquera pas. Typage faible a à voir avec le fait qu'il fait des choses avec des types qui n'ont pas vraiment de sens nécessairement. Donc ("1" + 2), je ne peux imaginer que d'être la chaîne de 12, je ne peux imaginer qu'il soit la chaîne 3, Je ne peux imaginer qu'il soit l'entier 3. Ce n'est pas forcément bien défini, et nous allons probablement voir ici que lorsque nous imprimons ("1" + 2), il va probablement finir par être différent que l'impression (1 + "2"). Et cela tend à être, à mon avis, pour le pire. Ici, nous pouvons essayer de celles-ci. Un autre petit truc à propos de PHP est que vous n'avez pas besoin d'écrire le fichier. Il ne dirigent cette mode commande. Donc php-r, alors on peut jeter dans la commande ici: "Print ('1 '+ 2);» et je vais jeter une nouvelle ligne. Cet imprimé 3. On dirait qu'il imprime 3 et c'est l'entier 3. Alors maintenant, nous allons essayer dans l'autre sens: "Impression (1 + '2 '); On obtient 3, et est-elle aussi va être entier 3? Honnêtement, je n'en ai aucune idée. On dirait que c'est cohérent. Il n'y a jamais aucune chance que ce soit le 12 cordes ou quelque chose comme ça parce que PHP, contrairement à JavaScript et Java aussi, dispose d'un exploitant distinct pour la concaténation. Concaténation en PHP est dot. Donc impression (1 '2 '.); Va nous donner 12. Cela tend à créer une confusion, où les gens essaient de faire quelque chose comme str + = une autre chose qu'ils veulent ajouter à la fin de leur chaîne, et cela va à l'échec. Vous devez faire str. = Alors n'oubliez pas de concaténation en PHP est un point. D'autres choses à essayer: print ("CS" + 50); Je vous ai dit qu'il n'y a aucun espoir de ce résultat CS50 depuis concaténation n'est pas +. Que pensez-vous que cela va finir par être? Honnêtement, je n'ai absolument aucune idée. On dirait que c'est juste 50. Il voit la corde, et je parie que si nous mettons 123CS - Il voit la première chaîne, il essaie de lire un entier de lui ou d'elle un certain nombre. Dans ce cas, il voit 123CS. "Cela n'a pas de sens comme un entier, donc je vais juste penser à 123." Donc 123 + 50 va être 173. Et là, il commence à lire cela comme un nombre entier. Il ne voit rien, il traite simplement comme 0. Donc, 0 + 50 va être 50. Ce que je suis en supposant que va faire quelque chose de similaire. Je pense 99. Oui, parce que ça va prendre la première - Ainsi, 99. Ici (7.10), si ce n'était C, qu'est-ce que revenir? [L'élève] 1. Oui >>, il serait 1 car 10/7 divise 2 entiers. Un entier divisé par un entier va retourner un entier. Il ne peut pas retourner 1 quelque point que ce serait, donc il va juste revenir 1. Ici, l'impression (10/7), il va interpréter ce fait. Et cela signifie que si vous voulez vraiment faire l'arrondi entier et des trucs comme ça, vous devez faire impression (plancher (10/7)); En C, c'est probablement bizarre que vous pouvez compter sur troncature entier régulièrement, mais en PHP, vous ne pouvez pas car il sera automatiquement transformer en un flotteur. Et puis (7 + true); que pensez-vous que ça va être? Je devine que 8 si elle va interpréter vrai que 1. Il semble que c'est 8. Donc tout ce que nous avons fait dans les 10 dernières minutes, vous devez absolument jamais faire. Vous verrez du code qui fait cela. Il n'a pas besoin d'être aussi simple que cela. Vous pourriez avoir 2 variables, et 1 variable se trouve être une chaîne et l'autre variable se trouve être un int, et puis vous ajoutez ces variables entre elles. Depuis PHP est typé dynamiquement et il ne fera pas de vérification de type pour vous et depuis il est faiblement typé et depuis il va juste jeter automatiquement ces choses ensemble et tout marchera bien, il est difficile même de savoir que cette variable doit être une chaîne de maintenant, si je ne devrais pas ajouter à cette variable, qui est un entier. La meilleure pratique est de savoir si une variable est une chaîne, gardez-le comme une chaîne pour toujours. Si une variable est de type int, le garder comme un int pour toujours. Si vous voulez traiter avec des entiers et des chaînes, vous pouvez utiliser varsint - c'est JavaScript. Intval. Je le fais tout le temps. PHP et JavaScript je mélange tout. Donc intval va retourner la valeur entière d'une variable. Si nous passons "d'impression (intval ('123 ')); vous obtenez 123. Intval lui-même ne va pas faire la vérification pour nous que c'est exclusivement un entier. Le manuel PHP, il existe des fonctions tellement nombreux disponibles, alors voici ce que je pense que j'utiliserais est is_numeric premier. Je devine que retourné false. C'est une autre chose que nous devons aller plus est. === Donc is_numeric ('123df »), vous ne penseriez pas que is_numeric. En C il vous faudra parcourir tous les caractères et vérifier si chaque caractère est un chiffre ou que ce soit. Voici is_numeric va le faire pour nous, et il retourne false. Alors, quand j'ai imprimé qui, a imprimé rien, donc ici je compare cela à voir, ne vous arrive d'être faux? Et maintenant c'est l'impression 1. Apparemment, il affiche 1 comme véritable lieu d'imprimer vrai que vrai. Je me demande si je fais print_r. Non, cela ne fonctionne toujours 1. Pour en revenir à ===, == existe toujours, et si vous parlez à Tommy, il dira == est parfaitement bien. Je vais dire que == est terrible et il ne faut jamais utiliser ==. La différence est que == compare des choses où il peut être vrai même si elles ne sont pas du même type, tandis === compare des choses et d'abord il vérifie qu'ils sont du même type? Oui. Bon, maintenant je vais voir si elles réellement comparer à être égaux. Vous obtenez des choses bizarres comme 10 égale - Voyons voir ce que cela dit. Donc ('10 '== '1 e1'); Cela renvoie vrai. Quelqu'un at-il devine pourquoi cette retourne vrai? Il ne s'agit pas seulement de cela. C'est peut-être un indice. Mais si je change que pour un f - bon sang! Je continuer à utiliser des guillemets doubles. La raison pour laquelle les guillemets sont de me crier dessus parce que je l'ai mis entre guillemets. Ainsi, j'ai pu échapper les guillemets ici, mais apostrophes rendre plus facile. Donc ('10 '== '1 f1'); n'imprime pas vrai. ('10 '== '1 E1'); imprime vrai. [L'élève] Est-ce hex? >> Ce n'est pas hexagonale, mais il est proche que c'est comme - 1e1, la notation scientifique. Il reconnaît que 1e1 1 * 10 ^ 1 ou peu importe. Ce sont des nombres entiers égaux. Si nous ne faisons === alors ça va être faux. En fait, je n'ai aucune idée si nous ne faisons que dire == (10 et '10abc ');? Très bien. Donc, c'est vrai. Donc, tout comme lorsque vous l'avez fait (10 + '10abc '), et il serait de 20, ici (10 '10abc == '); est vrai. Pire encore sont des choses comme (faux == NULL); est vrai ou (false == 0); est vrai, (false == []); Il ya des cas étranges de - C'est un de ces cas étranges. Notez que (false == []); est vrai. ('0 '== False); est vrai. ('0 '== []); Est fausse. Donc == n'est en aucune façon transitive. a peut être égal à b et a peut être égal à c, mais b peut ne pas être égale à c. C'est une abomination à moi, et vous devriez toujours utiliser. === [L'élève] Pouvons-nous faire! == Ainsi? >> [Bowden] Oui. L'équivalent serait! = Et! ==. Il s'agit en fait élevé dans la spécification pset où un grand nombre de fonctions renvoient - Le manuel PHP est bon à ce sujet. Il met dans une grande boîte rouge, "Ceci renvoie false si il ya une erreur." Mais 0 scrutin est une chose tout à fait raisonnable d'y retourner. Pensez à n'importe quelle fonction qui devrait retourner un entier. Disons que cette fonction est supposée compter le nombre de lignes dans un fichier ou quelque chose. Dans des circonstances normales, vous passez cette fonction dans un fichier et il va retourner un entier qui représente le nombre de lignes. Donc 0 est un nombre tout à fait raisonnable si le fichier est tout simplement vide. Mais que faire si vous lui transmettez un fichier non valide et la fonction qui arrive à retourner faux si vous lui passez un fichier non valide? Si vous venez de faire == vous n'êtes pas différencier le cas entre fichier non valide et le fichier vide. Toujours utiliser ===. C'est tout cela. En PHP, le type de tableau est différent de ce que vous êtes habitué à en C. En effet, vous avez déjà noté ce ci-dessus quand vous avez vu que c'est de type tableau. La syntaxe est nouveau support de PHP 5.4, qui est la dernière version de PHP. Avant ce que vous avez toujours eu à écrire array ('a' -> 1, 'b' -> 2. C'était le constructeur pour un tableau. Maintenant, PHP est enfin venu autour de la syntaxe agréable de seulement crochets, qui est juste tellement mieux que tableau. Mais compte tenu de PHP 5.4 est la version la plus récente, vous pouvez rencontrer des endroits qui n'ont même pas de PHP 5.3. Durant l'été, nous sommes tombés sur cette question où PHP 5.3 était ce que nous avions sur l'appareil, mais le serveur que nous avons déployé toute notre carnet de notes et de soumettre, et tout ça à PHP est 5,4. Ne sachant pas cela, nous avons développé en 5.3, poussé à 5,4, et maintenant, tout d'un coup, rien de notre code fonctionne car il est arrivé à modifications ont été apportées entre 5,3 et 5,4 qui ne sont pas rétro-compatible, et nous devons aller et fixer l'ensemble de nos choses qui ne fonctionnent pas pour PHP 5.4. Pour cette classe, puisque l'appareil ne doivent PHP 5.4, il est tout à fait possible d'utiliser des crochets. Mais si vous cherchez des choses autour de l'Internet, si vous cherchez un peu de genre de trucs ensemble, très probablement vous allez voir le sort sur la syntaxe constructeur de tableau depuis qui a été autour depuis PHP est né et la syntaxe crochet a été autour depuis les deux derniers mois ou chaque fois 5,4 est venu autour. C'est ainsi que vous l'index. Tout comme dans la façon dont vous le feriez C indice entre crochets comme $ array [0], $ array [1], $ array [2], vous indexez la même façon si vous arrive d'avoir vos indices étant chaînes. Tableau afin $ array ['a'] et $ ['b']. $ Array [b]. Pourquoi serait-ce mal? Il va probablement générer un avertissement, mais encore du travail. PHP a tendance à le faire. Il a tendance à tout simplement: «Je vais vous mettre en garde à ce sujet, mais je vais juste continuer »Et faire tout ce que je peux." Il se traduiront probablement ce à une chaîne, mais il est possible qu'à un moment donné dans le passé, quelqu'un a dit b définissent comme «BONJOUR TOUT LE MONDE". Alors maintenant, b pourrait être une constante de type tableau et $ [b] sera effectivement faire "BONJOUR TOUT LE MONDE". Je pense qu'à ce moment-là, ou du moins nos paramètres de PHP, si vous essayez d'index dans un tableau et que la clé n'existe pas, ce sera un échec. Je ne pense pas que cela va simplement vous mettre en garde. Ou au moins vous pouvez le configurer de sorte qu'il n'est pas juste vous mettre en garde, il ne parvient pas tout droit vers le haut. La façon dont vous vérifier pour voir si il ya effectivement un tel indice est isset. Donc isset ($ array ['BONJOUR TOUT LE MONDE']) renvoie false. isset ($ array ['b']) renverra vrai. Vous pouvez mélanger ces syntaxes. Je suis assez sûr de ce que ce tableau finirait par être est - Nous pouvons le tester. Oh, j'ai besoin PHPWord. Ce mélange est la syntaxe vous permet de spécifier ce que la clé est et vous ne spécifiez pas ce que la clé est. Ainsi, 3 à droite ici est une valeur. Vous n'avez pas dit explicitement ce que sa clé va être. Que pensez-vous de sa clé va être? [L'élève] 0. >> Je devine 0 uniquement parce que c'est la première que nous n'avons pas spécifié. Nous pouvons en fait faire une ou deux de ces cas. Donc print_r est d'imprimer récursive. Il permet d'imprimer le tableau entier. Il imprimer sous-réseaux du réseau s'il y en avait. Donc print_r ($ array); php.test.php. Il ne ressemble elle lui a donné 0. Il ya vraiment quelque chose à garder à l'esprit ici, mais nous allons y revenir dans un instant. Mais que faire si il m'arrive de faire cet indice 1? PHP ne fait pas de distinction entre les indices des chaînes et des indices entiers, sorte à ce point que je viens de définir un index 1 et je peux faire les deux $ array [1] et $ array ['1 '] et ce sera le même indice et la même clé. Alors maintenant, que pensez-vous 3 va être? >> [L'élève] 2. >> [Bowden] Je devine 2. Ouais. Il est 2. Et si nous faisions cela est 10, c'est 4? Que pensez-vous de l'indice de 3 va être? Je pense 11. Ma conjecture quant à ce que PHP ne - et je crois que j'ai vu cela auparavant - est il ne cesse de trace de ce que le plus grand index numérique il est utilisé jusqu'à présent est. Il ne va jamais d'attribuer un indice chaîne à 3. Ce sera toujours un index numérique. Ainsi, il conserve la trace de la plus haute il est assigné à ce jour, qui se trouve être 10, et il va donner 11 à 3. Ce que j'ai dit avant, remarquez la façon dont elle est l'impression de ce tableau. Elle imprime 10 Touche, touche 4, clé de 11, clé d. Ou encore, faisons - Je suppose que je n'ai pas mis un 0, mais c'est l'impression 1, 2, 3, 4. Que faire si je passe ici? Ou encore, fait passer ces 2. Maintenant, il imprime 2, 1, 3, 4. Tableaux PHP ne sont pas exactement comme votre table de hachage régulière. Il est parfaitement raisonnable de les considérer comme des tables de hachage 99% du temps. Mais dans vos tables de hachage ça n'a aucun sens de l'ordre dans lequel les choses ont été insérés. Donc dès que vous l'insérez dans votre table de hachage, supposons qu'il n'ya pas de liste, et vous pourriez juger dans une liste chaînée qui a été insérée en premier. Mais ici, nous avons inséré première 2 et il sait quand il a l'impression de ce tableau que 2 vient en premier. Il n'a pas l'imprimer dans n'importe quel ordre. La structure des données techniques que c'est en utilisant une carte ordonné, il mappe les touches aux valeurs et il se souvient de l'ordre dans lequel ces clés ont été insérés. Fondamentalement, c'est à des complications où il est ennuyeux de fait - Disons que vous avez un tableau 0, 1, 2, 3, 4, 5 et vous voulez sortir indice 2. Une façon de le faire, nous allons voir à quoi ça ressemble. 0, 2, 1, 3, 4. Unset arrive à désarmer les deux variables et les indices de tableau. Donc unset ($ array [2]); Maintenant, ce qui est ce que ça va ressembler? 2 est tout simplement disparu, de sorte que c'est tout à fait correct. Plus gênant, si vous voulez que les choses vraiment être comme un tableau. Je vais mettre des nombres aléatoires. Maintenant, remarquez mes indices. Je veux juste être comme un tableau C où elle passe de 0 à length - 1 et je peux parcourir en tant que telle. Mais dès que je désarmer le deuxième indice, ce qui était dans l'indice 3 ne pas devenir l'index 2. Au contraire, il supprime simplement que l'indice et maintenant vous allez 0, 1, 3, 4. Ceci est tout à fait raisonnable. C'est juste ennuyeux et vous avez à faire des choses comme épissure tableau. Ouais. [L'élève] Que se passerait-il si vous aviez une boucle for et que vous voulez passer en revue tous les éléments? Quand il a frappé 2, ne serait-il céder jamais? Itération sur un tableau. Il ya 2 façons de le faire. Vous pouvez utiliser une boucle for régulière. Il s'agit d'une autre complexité de PHP. La plupart des langues, je dirais, avoir une sorte de longueur ou len ou quelque chose indiquant la longueur d'un tableau. En PHP, il est chef d'accusation. Donc count ($ array); $ i + +) Disons simplement print ($ array [$ i]); Notice: Undefined offset: 2. Il va tout simplement à l'échec. C'est la raison pour laquelle, la plupart du temps, vous n'aurez jamais besoin d'itérer sur un tableau comme celui-ci. Il serait peut-être exagéré, mais vous n'avez jamais besoin d'itérer sur un tableau comme celui-ci parce que PHP fournit la syntaxe foreach où foreach ($ array que $ item). Maintenant, si nous imprimons ($ item); - nous allons en discuter dans un instant - qui fonctionne parfaitement bien. La façon dont foreach travaille est le premier argument est le tableau que vous itération sur. Et le deuxième argument, le point, à travers chaque passage de la boucle for il va prendre la chose suivante dans le tableau. Alors rappelez-vous le tableau a une commande. La première fois par la boucle for, point va de 123 alors ce sera 12 puis ce sera 13 puis ce sera 23 puis ce sera 213. Les choses deviennent vraiment bizarre quand tu fais quelque chose comme foreach. Voyons voir ce qui se passe parce que vous ne devriez jamais faire cela. Et si nous unset ($ array [1]); Cela a probablement été prévu. Vous n'êtes itération sur ce tableau, et chaque fois que vous désarmer le premier indice. Donc, pour l'indice 0, la première chose, élément prend la valeur 0, donc ça va être 123. Mais à l'intérieur de la boucle for nous unset index 1, ce qui signifie que 12 est disparu. Donc imprimer. PHP_EOL. PHP_EOL retour à la ligne est juste, mais il est techniquement plus portable depuis sauts de ligne dans Windows est différente de retours à la ligne sur Mac et UNIX. Sous Windows saut de ligne est \ r \ n, alors que partout ailleurs elle tend simplement à être \ n. PHP_EOL est configuré de telle sorte qu'il utilise quelle que soit la nouvelle ligne de votre système est. Alors que d'imprimer. Il ne faut pas print_r ($ array) à la fin. Je n'avais aucune idée que ce serait le comportement. Point prend toujours la valeur 12, même si nous désarmer 12 avant que nous ayons jamais eu à le à partir du tableau. Ne prenez pas mon mot à ce sujet, mais il semble que foreach crée une copie du tableau puis ouvrage prend toutes les valeurs de cette copie. Donc, même si vous modifiez le tableau à l'intérieur de la boucle for, il ne s'en soucient pas. Article prendra les valeurs d'origine. Essayons désactivation. Que faire si ce n'est $ array [1] = "bonjour"; Même si nous mettons «bonjour» dans le tableau, le point ne prend jamais sur cette valeur. Il ya une autre syntaxe pour les boucles foreach où vous mettez 2 variables séparées par une flèche. Cette première variable va être la clé de cette valeur, et cette deuxième variable va être le même article précise. Ceci est sans intérêt ici, mais si nous revenons à notre cas original de 'a' -> 1, «B» -> 1, ici nous venons de parcourir, pour chaque tableau comme élément, élément qui va de 1 à chaque fois. Mais si nous voulons aussi connaître la clé associée à cet élément puis nous as $ key -> $ item. Alors maintenant, nous pouvons faire imprimer ($ key. ':'. Maintenant, c'est une itération sur chaque touche et de l'impression et sa valeur associée. Une chose supplémentaire que nous pouvons faire dans le foreach boucles est que vous pourriez voir cette syntaxe. Esperluettes avant les noms de variables ont tendance à être la façon dont PHP fait référence. Lorsque des références sont très semblables aux pointeurs, vous n'avez pas de pointeurs, de sorte que vous n'avez jamais traiter directement la mémoire. Mais vous avez des références où la variable 1 se réfère à la même chose que d'une autre variable. A l'intérieur d'ici faisons $ item. Revenons à 1, 10. Faisons $ item + +; Cela existe encore en PHP. Vous pouvez toujours faire + +. php.test.php. Je dois l'imprimer. print_r ($ array); Nous imprimons 2, 11. Si je venais de faire foreach ($ array que $ item) puis article sera la valeur 1 la première fois à travers la boucle. Il sera incrémenté de 1 à 2, puis nous avons terminé. Alors il faudra passer par le deuxième passage de la boucle et que le point est de 10. Il produit des incréments de 11, puis c'est juste jeté. Ensuite, nous print_r ($ array), et nous allons voir que ce n'est que de 1, 10. Ainsi, l'augmentation que nous avons fait a été perdu. Mais foreach ($ array as & $ item) maintenant cet article est la même rubrique que ce droit ici. C'est la même chose. Donc, $ item + + modifie gamme 0. Fondamentalement, vous pouvez également faire: $ k -> array $ item et vous pouvez faire [$ k] + +; Donc, une autre façon de le faire, nous sommes libres de modifier l'article, mais cela ne modifie pas notre tableau original. Mais si nous utilisons k, qui est notre clé, alors nous pouvons simplement index dans notre tableau en utilisant cette clé et incrémenter que. Cette plus directement modifie notre tableau original. Vous pouvez le faire même si pour une raison quelconque vous voulez la possibilité de modifier - En fait, c'est tout à fait raisonnable. Vous ne voulez pas avoir à écrire $ array [$ k] + +, vous avez juste envie d'écrire $ item + + mais vous avez toujours voulu dire if ($ k === 'a') puis incrémenter élément, puis imprimez notre tableau. Alors maintenant, qu'est-ce que nous nous attendons à print_r faire? Quelles sont les valeurs doivent être imprimés? [Élève] 2 et 10. >> [Bowden] Ce n'est que si la clé était «a» peut-on réellement imprimer cela. Vous avez sans doute très rarement, voire jamais, auront besoin de définir des fonctions en PHP, mais vous pourriez voir quelque chose de similaire dans laquelle vous définissez une fonction comme quelque fonction. Habituellement, vous dirais ($ foo, $ bar), puis le définir comme autre chose. Mais si je fais ça, ça veut dire que tout ce qui appelle que ce soit, quel que soit appelle baz, de sorte que le premier argument passé à baz peut être modifié. Faisons $ foo + +; et à l'intérieur d'ici faisons baz ($ item); Maintenant que nous appelons une fonction. L'argument est pris en référence, ce qui signifie que si nous le modifier nous sommes modifiant la chose qui a été adoptée po Et l'impression de ce que nous attendons - à moins que j'ai foiré la syntaxe - nous avons obtenu 2, 11, si elle a été effectivement incrémenté. Notez que nous besoin de références dans 2 endroits. Que faire si j'ai fait cela? Qu'est-ce que cela signifie? [L'élève] Il va changer. Ouais >>. L'article est juste une copie de la valeur dans le tableau. Alors élément va changer à 2, mais le tableau ['a'] sera toujours 1. Ou si je fais cela? Maintenant élément est envoyé en copie à baz. Ainsi, la copie de l'argument sera incrémenté à 2, mais l'article lui-même n'a jamais été incrémenté à 2. Et le point est la même chose que support de réseau que ce soit, si ce tableau n'a jamais été incrémenté. Donc, ces deux endroits ont besoin. PHP est généralement assez intelligente à ce sujet. Vous pourriez penser que je veux passer par référence - Ce fut d'ailleurs une question sur l'un des psets. C'était une chose Questions.txt où il est dit, Pourquoi pourriez-vous vouloir transmettre cette structure par référence? Quelle a été la réponse à cette question? [L'élève] Donc, vous n'avez pas à copier quelque chose de grand. Ouais >>. Une structure ne peut être arbitrairement grand, et quand vous passez la structure en tant qu'argument il a besoin de copier cette struct entier à passer à la fonction, tandis que si vous venez de passer la structure par référence alors il a juste besoin de copier une adresse de 4 octets comme argument à la fonction. PHP est un peu plus intelligent que ça. Si j'ai une fonction et je lui passer un tableau de 1.000 choses, ça veut dire que ça va avoir à copier tous les 1.000 de ces choses pour passer dans la fonction? Il n'a pas à le faire immédiatement. Si l'intérieur de cette fonction, il ne modifie en fait foo, si ($ foo === 'bonjour') return true.; Notez que nous n'avons jamais été réellement modifié l'intérieur argument de cette fonction, ce qui signifie que tout ce qui a été adoptée en tant que foo n'a jamais besoin d'être copiés car ce n'est pas le modifier. Ainsi, la manière de PHP sont les arguments sont toujours passés par référence jusqu'à ce que vous essayez de la modifier. Maintenant, si je dis $ foo + +, il va maintenant faire une copie de l'original foo et modifier la copie. Cela permet d'économiser un peu de temps. Si vous n'avez jamais toucher cette vaste massif, vous n'avez jamais le modifier, il n'a pas besoin de faire la copie, tandis que si nous venons de mettre cette esperluette ce qui signifie qu'il n'a même pas le copier même si vous ne les modifiez. Ce comportement est appelé copie-sur-écriture. Vous le verrez dans d'autres endroits, surtout si vous prenez un cours de système d'exploitation. Copy-on-write est un modèle assez habituel où vous n'avez pas besoin de faire une copie de quelque chose à moins qu'elle soit réellement changer. Ouais. [L'élève] Et si vous aviez l'augmentation à l'intérieur de l'épreuve, si seulement 1 élément sur 1000 devrait être changé? Je ne suis pas sûr. Je pense qu'il serait copier l'ensemble de chose, mais il est possible qu'il est assez intelligent pour cela - En fait, ce que je pense, c'est imaginer que nous avions un tableau qui ressemble à ceci: $ tableau2 = [ Ensuite, l'indice «a» est un tableau de [1 2 3 4], et l'indice «b» est un tableau de ce que. J'ai besoin de virgules entre tous ces éléments. Imaginez, il ya des virgules. Ensuite, 'c' est la valeur 3. D'accord. Maintenant, disons que nous faisons baz $ (tableau2 $); où baz ne prend pas cela en référence. Donc, $ foo ['c'] + +; Il s'agit d'un exemple où nous passons comme argument tableau2 puis on la modification d'un indice spécifique de la matrice en l'incrémentant. Honnêtement, je n'ai aucune idée de ce que PHP va faire. Il peut facilement faire une copie de l'ensemble de chose, mais si elle est intelligente, il fera une copie de ces touches lorsque cela aura sa valeur distincte mais cela peut toujours pointer vers le même tableau 1,2,3,4 et cela peut toujours pointer vers le même tableau. Je vais l'iPad. Nous passons dans ce tableau où ce gars points à 3, cela indique gars à [1,2,3,4], ce mec points à [34, ...] Maintenant que nous la transmettre pour baz, nous modifions la présente. Si PHP est intelligent, il peut tout faire - Nous avions encore à copier de la mémoire, mais si il y avait ces sous-réseaux imbriqués énormes nous n'avons pas besoin de copier ceux-ci. Je ne sais pas si c'est ce qu'il fait, mais je ne peux l'imaginer faire cela. C'est aussi un avantage assez grand de C sur PHP. PHP rend la vie tellement plus facile pour beaucoup de choses, mais vous sorte de n'ai absolument aucune idée de la façon dont il exécute parce que je n'ai aucune idée de sous le capot quand il fait ces copies de choses, Oh, est ce que cela va être une copie constante de temps, est-ce juste va changer 1 aiguille, est ce que ça va être une copie ridiculement difficile linéaire? Que faire si on ne peut pas trouver de l'espace? Est-il alors nécessaire d'exécuter la collecte des déchets pour obtenir un peu plus d'espace? Et la collecte des ordures peut prendre arbitrairement longue. En C, vous n'avez pas à vous soucier de ces choses. Chaque ligne que vous pouvez vous écrivez raison à peu près de la façon dont il va procéder. Revenons à celles-ci. Comment est-ce bien ce que vous n'avez pas à traiter avec les fonctions de hachage, listes chaînées, ou quelque chose comme ça? Depuis que je travaille avec des tables de hachage est si facile maintenant, voici un casse-tête amusant de travailler. Ouvrez un fichier appelé unique.php et écrire un programme PHP (Aussi connu comme un "script"). Nous avons tendance à appeler les scripts si ce sont des choses courtes que vous exécutez la ligne de commande. Fondamentalement, n'importe quelle langue que vous ne compile pas, mais vous allez lancer l'exécutable à la ligne de commande, vous pouvez appeler ce script exécutable. Je pourrais tout aussi bien écrire un programme en C qui fait cela, mais je n'appelle pas cela un script depuis que je le compiler puis exécuter le fichier binaire. Mais ce programme PHP, nous allons appeler un script. Ou si nous l'avons écrit en Python ou en Perl ou Node.js ou l'une de ces choses, nous aimerions appeler tous les scripts, car vous les exécutez la ligne de commande mais nous ne les compiler. Nous pourrions le faire assez rapidement. Nous n'allons pas utiliser argv. Disons simplement souffler à travers cela. Appelez-il unique, écrire un programme. Vous pouvez supposer que l'entrée contient un mot par ligne. En fait, argv sera assez simples à utiliser. unique.php. La première chose d'abord, nous voulons vérifier si nous avons été passé 1 ligne de commande argument. Tout comme on peut s'y attendre argc et argv en C, nous avons encore ceux qui en PHP. Donc, si ($ argc! == 2) alors je ne traiterai pas l'impression d'un message ou quoi que ce soit. Je vais quitter, code d'erreur 1. Je pourrais aussi revenir 1. Rarement en PHP en êtes-vous de cet état où nous en sommes - Habituellement, vous êtes dans une fonction appelée par une fonction appelée par une fonction appelée par une fonction. Et si quelque chose va mal et vous voulez juste pour sortir tout entier, la sortie se termine juste le programme. Cela existe aussi en C. Si vous êtes dans une fonction dans une fonction dans une fonction dans une fonction et que vous voulez juste tuer le programme, vous pouvez appeler sortie et il va juste sortir. Mais en PHP, il est encore plus rare que nous sommes à ce niveau supérieur. Habituellement, nous sommes à l'intérieur une sorte de fonction, de sorte que nous appelons sortie de sorte que nous n'avons pas à revenir jusqu'à 1 chose qui se rend compte alors qu'il ya une erreur de sorte que si retourne jusqu'à ce que reconnaît qu'il ya eu une erreur. Nous ne voulons pas faire face à ça, donc exit (1); return (1); dans ce cas, serait équivalent. Alors ce que nous voulons, nous voulons ouvrir à fopen. Les arguments vont chercher assez similaire. Nous voulons fopen ($ argv [1], et nous voulons l'ouvrir en lecture. Qui retourne une ressource que nous allons appeler f. Cela semble assez similaire à la façon dont il le fait, sauf C nous n'avons pas à dire FILE *. Au lieu de cela nous disons simplement f $. D'accord. En fait, je pense que cela nous donne même une indication quant à la fonction PHP appelé fichier. Fichier PHP. Qu'est-ce que cela va faire est de lire un fichier entier dans un tableau. Vous n'avez même pas besoin de la fonction fopen. Ça va le faire pour vous. Donc, $ lignes = file ($ argv [1]); Maintenant, toutes les lignes du fichier sont en lignes. Maintenant, nous voulons trier les lignes. Comment peut-on trier les lignes? Nous trions les lignes. Et maintenant nous pouvons les imprimer ou que ce soit. Probablement le plus simple est foreach ($ lignes as $ ligne) echo $ ligne; [L'élève] Ne serions-nous encore franchir les lignes faisant référence à quelque chose en sorte? C'est là que sorte serait défini comme une sorte de fonction (& $ array). Lorsque vous appelez la fonction que vous n'avez pas le passer par référence. C'est la fonction qui le définit comme le prenant comme référence. C'est en fait exactement ce qui s'est passé lorsque nous mettons tout à nos serveurs quand nous sommes allés de 5,3 à 5,4. Jusqu'à 5.4, cela était parfaitement raisonnable. Une fonction ne vous attendez pas à le prendre comme référence, mais vous pouvez la passer comme référence donc si la fonction ne se produise pour le modifier, il est toujours modifié. Comme de 5,4, vous n'êtes pas censé le faire. Alors maintenant, la seule façon vous passez par référence est de savoir si la fonction ne fait explicitement. Si vous ne voulez pas le modifier, alors vous devez faire une copie $ = $ lignes et copie passe. Alors maintenant, les lignes seront préservés et copie en sera changé. php.unique.php. J'ai peut-être raté quelque chose. Unexpected 'sort'. Il va y avoir quelque chose qui fait ça pour nous. Ce n'est même pas là. Remarquez quand vous lisez le manuel que le premier argument devrait être un réseau et il a fallu par référence. Pourquoi est-ce plaindre à moi? Parce que j'ai ce genre de fonction encore ici que je ne veux pas. Bon, php.unique.php. Je n'ai pas réussi un argument parce que je n'ai pas un fichier. C'est php.unique.php sur test.php. Voici test.php tous imprimés dans un ordre bien triés. Notez que l'ordre de tri est un peu bizarre pour un fichier de code parce que toutes nos lignes vides vont venir en premier puis vont venir tout de nos 1 indentations au niveau puis viennent tous nos empreintes aucun. Ouais. >> [L'élève] Donc, pour le code source, il n'a pas été adopté par renvoi? Est-ce que généralement passés par valeur? [Bowden] Lorsque vous appelez une fonction, elle ne détermine s'il a été transmis par référence. C'est la définition de la fonction qui détermine si elle a été passée par référence. Et en regardant la définition de la fonction de tri ou simplement en regardant ce, il faut des arguments par référence. Donc, peu importe si vous voulez le prendre en référence, il le fait de prendre pour référence. Il modifie le tableau en place. Ce n'est tout simplement pas permis. Vous n'êtes pas autorisé à le faire. >> [L'élève] Oh, d'accord. [Bowden] Ce, en quelque sorte va prendre les lignes de référence et le modifier. Et encore, si vous ne voulez pas qu'il fasse cela, vous pouvez faire une copie de tri. Même dans ce cas, la copie n'est pas en fait une copie de lignes. Il souligne simplement la même chose jusqu'à ce qu'il soit modifié une première fois, où c'est premier va se modifier dans la fonction de tri, où, parce que c'est un copie-sur-écriture, maintenant une copie de copie va être faite. Vous pouvez aussi le faire. C'est l'endroit que vous pouvez voir et commercial. On le voit dans la boucle foreach, vous le voyez dans les déclarations de fonctions, et on le voit quand vient affecter les variables. Maintenant que nous avons accompli rien en faisant cela, parce copie et les lignes sont littéralement la même chose. Vous pouvez utiliser des lignes et de copier de façon interchangeable. Vous pouvez le faire unset ($ copie), et qui n'a pas les lignes non définies, vous venez de perdre votre référence à la même chose. Alors que sur ce point, maintenant des lignes est la seule façon vous pouvez accéder aux lignes. Des questions? Ouais. [Étudiant] Complètement hors sujet, mais vous n'avez pas à fermer PHP avec - >> Vous n'en ont pas. D'accord. [Bowden] J'irais même jusqu'à dire que c'est une mauvaise pratique pour les fermer. C'est probablement une exagération, surtout dans un script, mais nous allons voir ce qui se passe si je fais ça. Qui n'a rien fait. Que faire si je voulais - [soupir] J'ai besoin de passer un argument. Shoot. Je l'ai appelé tort. Donc php.unique.php avec un argument. Maintenant, je n'ai même pas besoin de cela. Je vais lui passer un argument valable. Cet imprimé ce que ça l'impression. Je suis d'impression et de copie copie n'existe pas. Donc lignes. Il imprimés tout, et puis notez tout ce ordure ici-bas, parce que dans tout ce que PHP est en dehors de balises PHP va juste être imprimé littéralement. C'est pourquoi le HTML, il est si gentil que je peux faire div blah, blah, blah classe ou que ce soit, blah, blah, blah, puis faire un peu de code PHP puis effectuez div fin. Et maintenant l'impression de ce que je obtenir mon div belle là-haut, tout ce que PHP imprimé, div en bas. Désastreuse quand quelque chose comme cela se produit, ce qui est assez commun, seulement un retour à la ligne parasite au niveau du fond du dossier. Vous ne penseriez pas que ce serait un gros problème jusqu'à ce que vous considérez le fait que les navigateurs - Comment redirige travail ou en fait tout le travail en-têtes, lorsque vous effectuez votre connexion à un site Web et le renvoie tous ces en-têtes et les choses comme réponse 200 ou réponse de redirection ou autre, têtes ne sont valables jusqu'à ce que le premier octet de données est envoyé. Vous pouvez rediriger des milliers de fois, mais dès que le premier octet de données est envoyé vous n'êtes pas censé rediriger à nouveau. Si vous avez un retour à la ligne perdue au fond d'un fichier et disons que vous utilisez cette fonction et que vous voulez - Disons que c'est un autre fichier qui est index.php et vous require_once quelque chose - Je ne peux pas penser à un bon exemple de cela. Le problème se produit lorsque cette ligne en bas se fait l'écho. Vous ne voulez rien avoir trouvé un écho encore. Même si vous n'avez pas l'intention de se faire quoi que ce soit fait l'écho, quelque chose ne se fait l'écho et maintenant que vous n'êtes pas censé envoyer têtes, pas plus et vous allez recevoir des plaintes. Vous n'avez tout simplement pas besoin de ces balises de fermeture. Si vous projetez de faire quelque chose avec HTML - et il est parfaitement raisonnable de le faire ici div quel que soit et puis, à ce stade, vous pouvez ou vous ne pouvez pas les inclure. Il n'a pas vraiment d'importance. Mais dans des scripts PHP, il est rare pour la refermer. Quand tout est en PHP, absolument tout, vous n'avez pas vraiment besoin de le fermer / vous ne devriez pas le fermer. Traiter avec des cordes est beaucoup plus agréable que chez C. En PHP, vous pouvez spécifier une chaîne avec des guillemets simples ou doubles. Avec des guillemets simples, vous ne pouvez pas utiliser "d'échappement" séquences. Constamment s'échapper, blah, blah, blah. Donc printf est très rare en PHP. Je suppose que je devrais utiliser printf si je voulais faire une sorte de chose - en pset 5 vous utilisé sprintf ou autre. Mais vous voulez faire 001.jpg 002.jpg et. Donc, pour ce genre de chose où je veux vraiment formater le texte je voudrais utiliser printf. Mais sinon, je voudrais simplement utiliser la concaténation de chaînes. Je n'ai jamais vraiment utiliser printf. Nous sommes en train de différencier les détails entre apostrophes et guillemets. La plus grande différence est que les guillemets simples, il sera imprimé littéralement. Il n'existe pas de type de données char en PHP, contrairement au C, alors cela équivaut à ce sujet. Ils sont tous les deux chaînes. Et la bonne chose à propos des chaînes de guillemets simples est que je pourrais dire 'Bonjour le monde!' blah, blah, blah, $ Wooo. Qu'est-ce qui se passe lorsque j'imprime c'est elle l'imprimer littéralement. Débarrassons-nous de toutes nos affaires. Alors echo $ str1; Elle a littéralement imprimé toutes ces choses: les signes de dollar, antislash n, on pourrait penser serait retours à la ligne - toutes ces choses, il imprime la lettre. La seule chose dont vous avez besoin pour échapper sont des apostrophes parce que sinon il pourrait penser qu'il a la fermeture des guillemets simples. Les guillemets doubles, complètement différents. Nous voyons déjà la coloration syntaxique est cluing nous sur ce qui va se passer très mal. php.unique. Undefined variable: wooo, car cela est interprété comme une variable appelée wooo. Guillemets vous permettent d'insérer des variables dans - Disons $ nom = "Rob"; Alors echo "Salut, mon nom est $ nom!"; Il reconnaît cela comme une variable. Quand je lance ça - et je vais insérer un saut de ligne - Salut, mon nom est Rob! et bonjour tout le monde! C'est parce que je n'ai jamais retiré l'impression de wooo ci-dessus. Il ya 1 peu plus loin que vous pouvez faire. $ Array = [1, 2, 3]; Que faire si je veux imprimer le premier indice du tableau? Vous faites $ array [0]. La coloration syntaxique est un indice. Quel est ce faire? php.unique. Salut, mon nom est 1! ce qui n'est pas ce que je voulais. La coloration syntaxique m'avez menti. Essayons 'a' -> 1, 'b' -> 2. C'est comme ça que je devrais écrire. Unexpected apostrophe (T_ENCAPSED blah, blah, blah, blah, blah). L'idée est que ce n'est pas reconnaître que cela fait partie du tableau. Ce n'est pas la reconnaissance de ce que tableau indexé par une lettre. Vous voulez faire cela entouré par des accolades, et maintenant tout ce qui est dans cette accolade sera interpolée, qui est le terme que nous utilisons pour l'insertion par magie ces variables dans les bons endroits. Maintenant, ce faisant, php.unique et Salut, mon nom est 1! comme prévu ou Salut, mon nom est Rob! Une chose qui est assez sympa à propos de guillemets simples, c'est que - Il ya un certain coût pour l'interpolation. Si vous utilisez des guillemets doubles, l'interprète doit aller sur cette chaîne, faire en sorte que, «Oh, voici une variable. Maintenant, j'ai besoin d'aller chercher cette variable et l'insérer ici." Même si vous n'utilisez pas toutes les variables, rien à l'intérieur de ces guillemets doit être interpolé, mais il sera toujours plus lent car il doit passer en revue les guillemets à la recherche de choses qui doivent être interpolées. Donc citations simples peuvent être un peu plus rapide si rien ne doit être interpolé, et j'ai tendance à utiliser des guillemets simples, même pour les «Salut, mon nom est '. $ Array ['a'] de toute façon. Cela va être équivalent à ce que nous avions auparavant. Mais c'est une question de préférence. Si vous utilisez PHP, vous avez probablement ne se soucient pas de la différence de vitesse. Il ne suffit pas de les raisonner pour commencer. Toutes les dernières questions? En fait, nous n'avons même pas passer à travers tout cela, mais ce genre de choses était ennuyeux. La dernière chose qui est plutôt agréable en PHP, c'est quand vous avez affaire avec le langage HTML, vous utiliserez un peu, de sorte que la syntaxe beau raccourci pour imprimer une variable. Sans mettre en PHP ici, c'est ce qu'on appelle les balises courtes. Officiellement à partir de PHP 5.4, cela est déconseillé. Il est recommandé de mettre php. Ceci est encore supporté, de tags courts avec le