1 00:00:00,000 --> 00:00:02,610 [Powered by Google Translate] [Sectie 8 - Meer Comfortabele] 2 00:00:02,610 --> 00:00:04,910 [Rob Bowden - Harvard University] 3 00:00:04,910 --> 00:00:07,070 [Dit is CS50. - CS50.TV] 4 00:00:11,520 --> 00:00:14,160 >> Deze week deel notities zullen zijn vrij kort, 5 00:00:14,160 --> 00:00:19,070 dus ik ga gewoon blijven praten, gaan jullie heen om te vragen blijven stellen, 6 00:00:19,070 --> 00:00:22,720 en we zullen proberen op te vullen zo veel mogelijk tijd. 7 00:00:22,720 --> 00:00:31,950 Veel mensen denken dat dit PSET niet per se moeilijk, maar het is erg lang. 8 00:00:31,950 --> 00:00:37,070 De PSET spec zelf duurt een uur te lezen. 9 00:00:40,530 --> 00:00:45,730 Wij geven u een groot deel van de SQL-je nodig zou kunnen hebben om te gebruiken. 10 00:00:45,730 --> 00:00:50,520 We lopen u door er veel van, dus het moet niet al te slecht. 11 00:00:50,520 --> 00:00:54,560 Heeft iemand gestart of beëindigd? 12 00:00:55,380 --> 00:00:59,710 Het is de laatste PSET. Oh, mijn God. 13 00:00:59,710 --> 00:01:05,400 Meestal is er een JavaScript-na dit, maar kalender dingen veranderen 14 00:01:05,400 --> 00:01:09,560 maakt alles 1 week korter, en we niet langer een JavaScript-PSET. 15 00:01:09,560 --> 00:01:12,310 Ik weet niet hoe dat van invloed is of JavaScript zal verschijnen op het examen 16 00:01:12,310 --> 00:01:15,510 of Quiz 1. 17 00:01:15,510 --> 00:01:22,260 Ik kan me voorstellen zal het iets als je nodig hebt om op hoog niveau dingen te weten over JavaScript, 18 00:01:22,260 --> 00:01:26,460 maar ik betwijfel of we zouden alleen maar geven u recht JavaScript-code 19 00:01:26,460 --> 00:01:28,720 omdat je nog niet had een PSET in. 20 00:01:28,720 --> 00:01:33,000 Maar dat zal dingen voor quiz beoordeling zijn volgende week. 21 00:01:33,000 --> 00:01:36,320 >> Sectie van vragen. 22 00:01:36,320 --> 00:01:43,870 Veel van deze dingen is enigszins slecht geformuleerde, maar we zullen bespreken waarom. 23 00:01:43,870 --> 00:01:50,220 In tegenstelling tot C, PHP is een "dynamisch getypeerde" taal. Wat betekent dit, vraag je? 24 00:01:50,220 --> 00:01:53,830 Nou ja, afscheid te nemen van al die char, float, int, en andere zoekwoorden die u moet gebruiken 25 00:01:53,830 --> 00:01:56,190 Bij de aangifte variabelen en functies in C. 26 00:01:56,190 --> 00:02:00,420 In PHP is een variabele van het type wordt bepaald door de waarde die het op dit moment is houdt. 27 00:02:00,420 --> 00:02:04,990 Dus voordat we typ deze code in een bestand genaamd dynamic.php, 28 00:02:04,990 --> 00:02:12,670 PHP wordt dynamisch getypt. Dat geldt. 29 00:02:12,670 --> 00:02:17,590 Ik ben het oneens met het feit dat dat betekent dat we afscheid zeggen aan char, float, int, 30 00:02:17,590 --> 00:02:20,620 en andere zoekwoorden. 31 00:02:20,620 --> 00:02:25,510 Het precieze verschil tussen dynamisch getypeerde en subsidiair, 32 00:02:25,510 --> 00:02:32,010 die statisch wordt getypt, is dat dynamisch getypt, al uw type checking en dat soort dingen 33 00:02:32,010 --> 00:02:37,350 gebeurt tijdens de uitvoering, terwijl statisch getypt het gebeurt tijdens het compileren. 34 00:02:37,350 --> 00:02:43,030 Het woord statische in het algemeen lijkt te betekenen compileren dingen. 35 00:02:43,030 --> 00:02:48,170 Ik denk dat er andere toepassingen voor, maar in C als je een statische variabele declareren, 36 00:02:48,170 --> 00:02:52,650 de opslag wordt toegewezen tijdens het compileren. 37 00:02:52,650 --> 00:02:59,260 Hier, dynamisch getypt betekent gewoon dat - 38 00:02:59,260 --> 00:03:04,350 In C als u probeert om een ​​string en een integer toe te voegen, als je het compileren, 39 00:03:04,350 --> 00:03:11,000 het gaat om te klagen omdat het gaat om te zeggen dat je niet kunt een int en een pointer toe te voegen. 40 00:03:11,000 --> 00:03:14,710 Het is gewoon niet een geldige operatie. 41 00:03:14,710 --> 00:03:21,170 Dat is een ander ding dat we om in een seconde. 42 00:03:21,170 --> 00:03:24,860 Maar dat soort controle, het feit dat het klaagt tijdens het compileren, 43 00:03:24,860 --> 00:03:29,220 is statisch type checking. 44 00:03:29,220 --> 00:03:35,220 Er zijn talen waar je niet hoeft te char, float, int zeggen, en al die dingen, 45 00:03:35,220 --> 00:03:40,940 maar de taal kan vertellen uit de context van de zaak welk type het zou moeten zijn, 46 00:03:40,940 --> 00:03:43,980 maar het is nog steeds statisch getypt. 47 00:03:43,980 --> 00:03:49,000 Dus als je 51, OCaml te nemen, hoeft u nooit een van deze soorten te gebruiken, 48 00:03:49,000 --> 00:03:58,700 maar het nog steeds tijdens het compileren zeggen dat je kunt dit niet doen omdat je het mengen van een int en een string. 49 00:03:58,700 --> 00:04:05,650 Dynamisch getypt betekent gewoon dat ergens tijdens runtime je gaat om een ​​klacht in te krijgen. 50 00:04:05,650 --> 00:04:13,430 Als u ook Java eerder gebruikt, in het algemeen, bijna elke C-type taal 51 00:04:13,430 --> 00:04:20,070 gaat statisch worden getypt, dus C, C + +, Java, al die zijn over het algemeen statisch getypt. 52 00:04:20,070 --> 00:04:22,910 Op Java als je compileren iets en je zegt 53 00:04:22,910 --> 00:04:26,670 snaar s is gelijk aan nieuwe iets dat niet is een string, 54 00:04:26,670 --> 00:04:28,950 dat gaat om te klagen omdat die types die gewoon niet met elkaar overeenkomen. 55 00:04:28,950 --> 00:04:31,180 Dat zal wel zijn ongenoegen tijdens het compileren. 56 00:04:31,180 --> 00:04:36,750 Maar het heeft ook een aantal dynamische tijd dingen zoals als je probeert om iets te werpen 57 00:04:36,750 --> 00:04:40,500 naar een type dat is meer specifiek dan de huidige type, 58 00:04:40,500 --> 00:04:45,610 er is niets dat kan doen tijdens het compileren tijd om te controleren of dat gegoten gaat lukken. 59 00:04:45,610 --> 00:04:51,130 Java heeft ook een dynamische typecontrole dat zodra het wordt dat coderegel 60 00:04:51,130 --> 00:04:54,130 wanneer het eigenlijk is uitgevoerd, gaat het om de cast te doen, 61 00:04:54,130 --> 00:04:56,260 controleren of dat gegoten geldig was in de eerste plaats, 62 00:04:56,260 --> 00:04:59,890 en als het niet was, dan dat het gaat om te klagen dat je een ongeldig type hebben. 63 00:04:59,890 --> 00:05:03,200 Dynamisch type checking. 64 00:05:03,200 --> 00:05:07,010 Typ deze in een bestand genaamd dynamic.php. 65 00:05:10,130 --> 00:05:12,380 Dynamic.php. 66 00:05:14,580 --> 00:05:17,190 Ik zal unzip dat bij het formatteren. 67 00:05:18,750 --> 00:05:21,880 We hebben een variabele, zetten we het aan de integer 7, 68 00:05:21,880 --> 00:05:27,930 dan gaan we het en% s af te drukken - 69 00:05:27,930 --> 00:05:32,830 Oh, we de aard van het afdrukken, zo gettype zal het type van de variabele terug. 70 00:05:32,830 --> 00:05:35,720 We zijn net het afdrukken van de soort over en weer. 71 00:05:35,720 --> 00:05:39,440 We hebben net php.dynamic.php. 72 00:05:39,440 --> 00:05:45,920 We zullen zien dat het verandert van integer naar string naar Booleaanse als we door. 73 00:05:45,920 --> 00:05:54,590 In C is er geen Boolean data type, er geen string data type. 74 00:05:54,590 --> 00:06:00,500 Er is char * en Booleaanse gewoon de neiging om int of char of iets dergelijks. 75 00:06:00,500 --> 00:06:05,690 In PHP deze soorten bestaan, en dat is een van de grote voordelen van PHP over C - 76 00:06:05,690 --> 00:06:13,290 die string operaties oneindig veel gemakkelijker in PHP dan C. Ze werken. 77 00:06:13,290 --> 00:06:18,290 >> Zo komen we hier terug. 78 00:06:18,290 --> 00:06:21,260 We renden dynamic.php. 79 00:06:21,260 --> 00:06:26,710 Dit vertelt de PHP-interpreter, genaamd php, aan de PHP code uitvoeren in dynamic.php. 80 00:06:26,710 --> 00:06:30,250 Als u fouten in het bestand, zal de tolk vertellen! 81 00:06:30,250 --> 00:06:39,110 De tolk, dit is een ander groot verschil tussen PHP en C. 82 00:06:39,110 --> 00:06:48,200 In C moet je iets samen te stellen en dan loop je dat gecompileerde bestand. 83 00:06:48,200 --> 00:06:50,490 In PHP je nooit compileren iets. 84 00:06:50,490 --> 00:06:57,200 Dus de PHP-interpreter is eigenlijk gewoon het lezen van deze regel voor regel. 85 00:06:57,200 --> 00:07:02,900 Het raakt var = 7 dan raakt printf dan raakt var dan raakt printf enzovoort. 86 00:07:02,900 --> 00:07:10,910 Er is een beetje van de samenstelling van het doet, en het slaat de resultaten 87 00:07:10,910 --> 00:07:15,510 dus als je het script later kunt u doen wat, 88 00:07:15,510 --> 00:07:19,280 maar in principe is het een regel voor regel soort dingen. 89 00:07:19,280 --> 00:07:25,280 Dat betekent dat veel van de optimalisaties die we in C, 90 00:07:25,280 --> 00:07:31,920 zoals het opstellen van, het is gewoon in het algemeen de compiler kan veel trucs voor u doen. 91 00:07:31,920 --> 00:07:36,110 Het kan nemen ongebruikte variabelen, kan het allemaal van dit soort dingen, 92 00:07:36,110 --> 00:07:38,660 het kan doen staart recursie. 93 00:07:38,660 --> 00:07:42,550 In PHP je niet van plan om dat voordeel te krijgen 94 00:07:42,550 --> 00:07:45,690 omdat het slechts gaat om het uitvoeren van lijn beginnen met het regel voor regel, 95 00:07:45,690 --> 00:07:49,950 en het niet echt herkent deze dingen zo gemakkelijk 96 00:07:49,950 --> 00:07:54,440 omdat het niet 1 grote compilatie pas over de zaak en dan uitvoering; 97 00:07:54,440 --> 00:07:56,860 het is gewoon regel voor regel. 98 00:08:00,730 --> 00:08:02,750 Dus dat is de tolk. 99 00:08:02,750 --> 00:08:06,840 >> Terug naar onze dynamische typen: pretty cool, he? 100 00:08:06,840 --> 00:08:08,640 U zeker niet kon doen dat in C! 101 00:08:08,640 --> 00:08:11,860 Nu, kijk of je kunt achterhalen van de aard van elk van de volgende waarden. 102 00:08:11,860 --> 00:08:14,760 Zie deze als referentie. 103 00:08:14,760 --> 00:08:19,420 Dus 3,50. Wat soort denk je dat gaat worden? 104 00:08:24,480 --> 00:08:26,370 Hier zijn de soorten die we hebben. 105 00:08:26,370 --> 00:08:30,430 We hebben bools, integers, floating points, strings, arrays, objecten, 106 00:08:30,430 --> 00:08:38,370 en dan middelen, die is een soort van vaag. 107 00:08:38,370 --> 00:08:41,010 Ik denk dat er hier eigenlijk een voorbeeld. 108 00:08:41,010 --> 00:08:43,740 Dan is er nog NULL. NULL is een speciaal type. 109 00:08:43,740 --> 00:08:47,140 In tegenstelling tot de C waar NULL is slechts een wijzer met het adres 0, 110 00:08:47,140 --> 00:08:54,930 in PHP, NULL is zijn eigen soort, waar de enige geldige ding van dat type is NULL. 111 00:08:57,560 --> 00:09:00,670 Dit is veel nuttiger voor foutcontrole. 112 00:09:00,670 --> 00:09:04,310 In C waar we dit probleem waar als u terugkeert NULL, 113 00:09:04,310 --> 00:09:08,660 betekent dat je een NULL pointer terug te keren of het gebruik van NULL aan een fout betekenen 114 00:09:08,660 --> 00:09:12,380 of dat alles verwarring hadden we op een gegeven moment. 115 00:09:12,380 --> 00:09:18,440 Hier, terug NULL betekent over het algemeen fout. 116 00:09:20,860 --> 00:09:27,300 Een heleboel dingen ook return false voor fouten. 117 00:09:27,300 --> 00:09:33,140 Maar het punt is de NULL-type, het enige wat van de NULL-type is NULL. 118 00:09:33,140 --> 00:09:40,090 Dan terugbellen is als kun je enkele anonieme functies. 119 00:09:40,090 --> 00:09:46,420 Je hoeft niet de functie een naam te geven, maar je hoeft niet hier te gaan met dat. 120 00:09:46,420 --> 00:09:53,940 Kijkend naar de types die ze verwachten dat we weten, 121 00:09:53,940 --> 00:09:59,000 wat denk je van het type van 3,50 is? >> [Student] Float. 122 00:09:59,000 --> 00:10:00,370 Ja. 123 00:10:00,370 --> 00:10:06,290 Dus dan hier, wat denk je het van dit type is? >> [Student] Array. 124 00:10:06,290 --> 00:10:09,890 Ja. De eerste was float, de tweede is een array. 125 00:10:09,890 --> 00:10:14,500 Merk op dat deze array niet als een C-array 126 00:10:14,500 --> 00:10:19,610 waar je index heeft 0 enige waarde heeft, index 1 heeft een bepaalde waarde. 127 00:10:19,610 --> 00:10:26,320 Hier de indices a, b en c en de waarden 1, 2 en 3. 128 00:10:26,320 --> 00:10:33,980 In PHP is er geen verschil tussen een associatieve array en op slechts een regelmatige reeks 129 00:10:33,980 --> 00:10:36,740 als je zou denken in C. 130 00:10:36,740 --> 00:10:43,040 Er is alleen dit, en onder de motorkap een regelmatige array is gewoon een associatieve array 131 00:10:43,040 --> 00:10:50,000 waarbij 0 kaarten om een ​​waarde op dezelfde manier een kaarten om een ​​bepaalde waarde. 132 00:10:50,000 --> 00:11:00,410 Om deze reden, kan PHP behoorlijk slecht zijn voor echt snel code / benchmarking dingen 133 00:11:00,410 --> 00:11:07,930 omdat in C wanneer u gebruik maakt van een array je weet dat het openen van een lid is constante tijd. 134 00:11:07,930 --> 00:11:11,860 In PHP toegang tot een lid is die weet hoeveel tijd? 135 00:11:11,860 --> 00:11:18,970 Het is waarschijnlijk constant als het hashes correct. 136 00:11:18,970 --> 00:11:21,620 Wie weet wat het werkelijk doet onder de motorkap? 137 00:11:21,620 --> 00:11:25,600 Je moet echt kijken naar de implementatie om te zien hoe het gaat om te gaan met dat. 138 00:11:25,600 --> 00:11:28,550 Dus dan fopen. 139 00:11:28,550 --> 00:11:36,420 Ik denk dat hier laten we gewoon PHP handleiding fopen te kijken naar de return type. 140 00:11:36,420 --> 00:11:41,260 We zien hier dat u kunt kijken op vrijwel elke functie in de PHP handleiding 141 00:11:41,260 --> 00:11:47,540 en dit is een soort van de man-pagina van PHP. 142 00:11:47,540 --> 00:11:51,060 De return type gaat worden bron. 143 00:11:51,060 --> 00:11:56,050 Dat is waarom ik heb het opgezocht, omdat we niet echt te definiëren bron. 144 00:11:56,050 --> 00:12:04,110 Het idee van hulpbronnen, in C je soort hebt een FILE * of wat dan ook; 145 00:12:04,110 --> 00:12:07,200 in PHP de resource is uw FILE *. 146 00:12:07,200 --> 00:12:10,360 Het is wat je gaat worden het lezen van, het is wat je gaat worden schriftelijk aan. 147 00:12:10,360 --> 00:12:20,710 Het is meestal extern, dus het is een bron die u dingen kunt trekken uit en gooi dingen te. 148 00:12:20,710 --> 00:12:26,520 En tot slot, wat is de aard van de NULL? >> [Student] NULL. 149 00:12:26,520 --> 00:12:30,650 Ja. Dus het enige dat is NULL NULL is. 150 00:12:30,650 --> 00:12:33,480 NULL NULL is. 151 00:12:35,490 --> 00:12:41,170 >> Een kenmerk van het type PHP-systeem (ten goede of ten kwade) is de mogelijkheid om soorten jongleren. 152 00:12:41,170 --> 00:12:44,390 Wanneer u een lijn van PHP-code die waarden van verschillende types combineert schrijven, 153 00:12:44,390 --> 00:12:46,670 PHP zal proberen om de verstandige ding te doen. 154 00:12:46,670 --> 00:12:48,920 Probeer elk van de volgende regels PHP code. Wat is afgedrukt? 155 00:12:48,920 --> 00:12:51,000 Is het wat je verwacht? Waarom wel of waarom niet? 156 00:12:51,000 --> 00:12:58,600 Dit feit over PHP is wat maakt het wat wij noemen zwak getypt. 157 00:12:58,600 --> 00:13:04,610 Zwak getypt en sterk getypt, 158 00:13:04,610 --> 00:13:06,840 Er zijn verschillende toepassingen voor deze termen, 159 00:13:06,840 --> 00:13:12,020 maar de meeste mensen gebruiken zwak getypt en strongly typed om dit soort dingen betekenen 160 00:13:12,020 --> 00:13:15,920 waarbij ("1" + 2), dat werkt. 161 00:13:15,920 --> 00:13:18,290 In C, dat niet zou werken. 162 00:13:18,290 --> 00:13:22,490 Je kunt je voorstellen dat niet werkt. 163 00:13:22,490 --> 00:13:29,200 Veel mensen verwarren dynamische typen en zwakke typering en statische typen en sterke typering. 164 00:13:29,200 --> 00:13:34,050 Python is een ander voorbeeld van een taal die dynamisch is getypt. 165 00:13:34,050 --> 00:13:41,770 U kunt gooien soorten in de variabelen en het gaat om te bepalen tijdens runtime 166 00:13:41,770 --> 00:13:44,680 een fout gecontroleerd te worden. 167 00:13:44,680 --> 00:13:50,740 In Python het gaat om deze uit te voeren en het zal zien ("1" + 2); 168 00:13:50,740 --> 00:13:55,920 en dit zal mislukken, omdat het zegt dat je niet toevoegen van een string en een integer. 169 00:13:55,920 --> 00:14:00,860 In PHP, dat is net zo dynamisch getypt, zal dit niet nalaten. 170 00:14:00,860 --> 00:14:04,220 Zwak typen heeft te maken met het feit dat dingen doet met types 171 00:14:04,220 --> 00:14:07,800 die niet echt noodzakelijk zinvol. 172 00:14:07,800 --> 00:14:17,420 Dus ("1" + 2), ik kan me voorstellen dat dat de string 12, ik kan me voorstellen dat de string 3, 173 00:14:17,420 --> 00:14:20,710 Ik kan me voorstellen dat het gehele getal 3. 174 00:14:20,710 --> 00:14:24,530 Het is niet per se goed gedefinieerd, en we waarschijnlijk gaan hier te zien 175 00:14:24,530 --> 00:14:29,140 dat wanneer we af te drukken ("1" + 2), het gaat waarschijnlijk om uiteindelijk op een verschillende 176 00:14:29,140 --> 00:14:32,320 dan afdrukken (1 + "2"). 177 00:14:32,320 --> 00:14:39,700 En dit heeft de neiging om, in mijn mening, voor het erger. 178 00:14:39,700 --> 00:14:44,240 Hier kunnen we proberen deze. 179 00:14:44,240 --> 00:14:48,740 Een ander trucje over PHP is dat je niet hoeft om daadwerkelijk in het bestand schrijven. 180 00:14:48,740 --> 00:14:52,790 Het maakt zijn voer je dit commando mode. 181 00:14:52,790 --> 00:14:57,710 Dus php-r, dan kunnen we gooien in het commando hier: 182 00:14:57,710 --> 00:15:06,610 "Print ('1 '+ 2)," en ik zal een nieuwe lijn te gooien. 183 00:15:19,550 --> 00:15:23,970 Deze gedrukte 3. 184 00:15:31,100 --> 00:15:35,330 Het lijkt erop dat deze wordt afgedrukt 3 en het is het gehele getal 3. 185 00:15:35,330 --> 00:15:38,420 Dus laten we nu de andere kant op proberen rond: 186 00:15:38,420 --> 00:15:42,970 "Print (1 + '2 '); 187 00:15:45,560 --> 00:15:50,490 We krijgen 3, en wordt het ook gaat worden geheel getal 3? Ik heb eerlijk gezegd geen idee. 188 00:15:50,490 --> 00:15:54,030 Het lijkt erop dat dat consistent is. 189 00:15:54,030 --> 00:15:59,550 Er is nooit enige kans van het feit dat het de string 12 of iets dergelijks 190 00:15:59,550 --> 00:16:08,080 omdat PHP, in tegenstelling tot JavaScript en Java ook, 191 00:16:08,080 --> 00:16:11,670 heeft een aparte operator voor concatenatie. 192 00:16:11,670 --> 00:16:14,930 Aaneenschakeling in PHP is dot. 193 00:16:14,930 --> 00:16:22,950 Dus afdrukken (1 '2 '.); Gaat om ons 12. 194 00:16:25,790 --> 00:16:32,420 Dit leidt meestal tot verwarring waar mensen proberen iets te doen, zoals str + = 195 00:16:32,420 --> 00:16:37,840 iets anders dat ze willen op voeg toe aan het einde van hun string, en dat gaat mislukken. 196 00:16:37,840 --> 00:16:40,770 Je moet str doen. = 197 00:16:42,000 --> 00:16:46,240 Dus vergeet niet concatenatie in PHP is een punt. 198 00:16:46,240 --> 00:16:52,100 Andere dingen om te proberen: drukken ("CS" + 50); 199 00:16:55,750 --> 00:17:03,610 Ik heb u verteld dat er geen hoop dat dit leidt tot CS50 200 00:17:03,610 --> 00:17:06,119 aangezien aaneenschakeling niet +. 201 00:17:06,119 --> 00:17:08,440 Wat denk je dat dit gaat om uiteindelijk op een? 202 00:17:10,359 --> 00:17:13,460 Ik ben eerlijk gezegd heb absoluut geen idee. 203 00:17:14,250 --> 00:17:16,460 Het lijkt erop dat het is gewoon 50. 204 00:17:16,460 --> 00:17:21,490 Het ziet de string, en ik wed dat als we 123CS - 205 00:17:21,490 --> 00:17:29,640 Het ziet de eerste reeks, probeert te lezen een geheel getal van het of een nummer uit het. 206 00:17:29,640 --> 00:17:31,710 In dit geval ziet 123CS. 207 00:17:31,710 --> 00:17:35,190 "Dat niet zinvol als een geheel getal, dus ik ga gewoon te denken aan 123." 208 00:17:35,190 --> 00:17:38,580 Dus 123 + 50 gaat worden 173. 209 00:17:38,580 --> 00:17:40,740 En hier begint het lezen van deze als een geheel getal. 210 00:17:40,740 --> 00:17:45,690 Het doet er niet iets te zien, dus het gewoon als 0 behandeld. Dus 0 + 50 gaat worden 50. 211 00:17:45,690 --> 00:17:51,600 Dit Ik neem aan dat gaat om iets dergelijks te doen. 212 00:17:51,600 --> 00:17:54,310 Ik denk 99. 213 00:17:54,310 --> 00:17:57,580 Ja, omdat het gaat om de eerste te nemen - 214 00:18:12,880 --> 00:18:15,730 Zo 99. 215 00:18:15,730 --> 00:18:21,970 Hier (10/7), als dit C, wat zou dat terug? 216 00:18:23,700 --> 00:18:29,630 [Student] 1. >> Ja, zou het 1 omdat 10/7 verdeelt 2 gehele getallen. 217 00:18:29,630 --> 00:18:32,910 Een geheel getal gedeeld door een geheel getal gaat een integer terug. 218 00:18:32,910 --> 00:18:37,750 Het kan niet terugkeren 1 punt wat dat ook zou zijn, dus het is gewoon op 1 terug te keren. 219 00:18:37,750 --> 00:18:46,120 Hier afdrukken (10/7), het gaat om daadwerkelijk te interpreteren dat. 220 00:18:46,120 --> 00:18:53,760 En dat betekent dat als je echt wilt integer afronding en dat soort dingen doen, zoals dat, 221 00:18:53,760 --> 00:18:59,950 u de afdrukken (vloer (10/7)) doen; 222 00:18:59,950 --> 00:19:08,460 In C is het waarschijnlijk raar dat je regelmatig kunt vertrouwen op integer truncatie, 223 00:19:08,460 --> 00:19:12,260 maar in PHP kun je niet want het zal automatisch veranderen in een vlotter. 224 00:19:13,430 --> 00:19:17,610 En dan (7 + true); wat denk je dat gaat worden? 225 00:19:18,550 --> 00:19:23,640 Ik gok 8 als het gaat om echte interpreteren als 1. 226 00:19:23,640 --> 00:19:25,740 Het lijkt erop dat het is 8. 227 00:19:25,740 --> 00:19:31,710 >> Dus alles wat we hebben gedaan in de laatste 10 minuten moet je absoluut nooit doen. 228 00:19:31,710 --> 00:19:39,870 U ziet code die dit doet. 229 00:19:39,870 --> 00:19:42,700 Het hoeft niet zo eenvoudig als deze. 230 00:19:42,700 --> 00:19:47,240 Je zou kunnen hebben 2 variabelen, en 1 variabele toevallig een string 231 00:19:47,240 --> 00:19:51,310 en de andere variabele toevallig een int, en dan moet je bij elkaar optellen van deze variabelen. 232 00:19:51,310 --> 00:20:00,120 Omdat PHP wordt dynamisch getypt en zal elk type controle niet voor u doen 233 00:20:00,120 --> 00:20:03,640 en omdat het zwak getypt en omdat het gewoon automatisch samen te gooien deze dingen 234 00:20:03,640 --> 00:20:11,490 en alles zal gewoon werken, is het moeilijk om zelfs weten dat deze variabele moet een string nu, 235 00:20:11,490 --> 00:20:14,930 dus ik niet toevoegen aan deze variabele, een integer. 236 00:20:18,780 --> 00:20:24,560 Best practice is als een variabele is een string, het voor altijd bewaren als een string. 237 00:20:24,560 --> 00:20:26,980 Als een variabele is een int, het voor altijd bewaren als een int. 238 00:20:26,980 --> 00:20:30,770 Als je wilt om te gaan met gehele getallen en strings, 239 00:20:30,770 --> 00:20:36,970 kunt u gebruik maken varsint - dat is JavaScript nodig. 240 00:20:36,970 --> 00:20:42,520 Intval. Ik doe dit de hele tijd. PHP en JavaScript ik meng alles. 241 00:20:42,520 --> 00:20:47,600 Dus intval gaat de integer waarde van een variabele terug. 242 00:20:47,600 --> 00:20:56,550 Als we passeren in "print (intval ('123 ')), je krijgt 123. 243 00:21:06,820 --> 00:21:15,850 Intval zelf is niet van plan om de cheque voor ons dat het uitsluitend is een geheel getal te doen. 244 00:21:15,850 --> 00:21:20,460 De PHP handleiding, er zijn net zo veel functies die beschikbaar zijn, 245 00:21:20,460 --> 00:21:26,560 dus even ik denk dat wat ik zou gebruiken is in de eerste is_numeric. 246 00:21:26,560 --> 00:21:32,590 Ik gok dat valse geretourneerd. 247 00:21:32,590 --> 00:21:35,780 Dat is een ander ding dat we moeten gaan dan is. === 248 00:21:37,850 --> 00:21:44,020 Dus is_numeric ('123df '), zou je niet denken dat als is_numeric. 249 00:21:44,020 --> 00:21:46,720 In C zou u itereren over alle tekens 250 00:21:46,720 --> 00:21:50,410 en controleer om te zien of elk teken is het cijfer of wat dan ook. 251 00:21:50,410 --> 00:21:53,850 Hier is_numeric gaat dat voor ons doen, 252 00:21:53,850 --> 00:21:56,520 en het is terug te keren vals. 253 00:21:56,520 --> 00:22:02,120 Dus toen ik dat afgedrukt, afgedrukt niets, dus hier ben ik te vergelijken om te zien, 254 00:22:02,120 --> 00:22:05,490 heb je toevallig niet waar? En dus nu is het af te drukken 1. 255 00:22:05,490 --> 00:22:10,060 Blijkbaar print programma 1 als ware in plaats van af te drukken waar als waar. 256 00:22:10,060 --> 00:22:15,790 Ik vraag me af als ik dat doe print_r. Nee, dat is nog steeds 1. 257 00:22:15,790 --> 00:22:26,760 >> Terug te gaan naar ===, == bestaat nog steeds, 258 00:22:26,760 --> 00:22:32,260 en als je praat met Tommy hij zal zeggen == is perfect in orde. 259 00:22:32,260 --> 00:22:37,700 Ik ga om te zeggen dat == is verschrikkelijk en moet je nooit gebruiken. == 260 00:22:37,700 --> 00:22:44,870 Het verschil is dat == dingen vergelijkt 261 00:22:44,870 --> 00:22:48,450 waar het kan waar zijn, zelfs als ze niet van hetzelfde type, 262 00:22:48,450 --> 00:22:53,810 terwijl === vergelijkt dingen en eerst controles zijn ze van hetzelfde type? 263 00:22:53,810 --> 00:22:58,010 Ja. Oke, nu ga ik om te zien of ze eigenlijk te vergelijken met gelijk. 264 00:22:58,010 --> 00:23:08,890 Je krijgt rare dingen als 10 is gelijk aan - laten we eens kijken wat dat zegt. 265 00:23:08,890 --> 00:23:15,570 So ('10 '== '1 e1'); 266 00:23:15,570 --> 00:23:17,980 Dit geeft true. 267 00:23:17,980 --> 00:23:21,420 Heeft iemand enig gissingen waarom dit geeft true? 268 00:23:25,180 --> 00:23:27,120 Het gaat niet alleen over dat. Misschien is dit een hint. 269 00:23:27,120 --> 00:23:33,170 Maar als ik dat veranderen in een f - verdorie! Ik blijf met dubbele aanhalingstekens. 270 00:23:33,170 --> 00:23:38,780 De reden dat de dubbele aanhalingstekens zijn schreeuwen tegen mij is, want ik heb dit in dubbele aanhalingstekens. 271 00:23:38,780 --> 00:23:43,850 Dus ik kon ontsnappen aan de dubbele aanhalingstekens in hier, maar enkele aanhalingstekens maken het makkelijker. 272 00:23:43,850 --> 00:23:49,120 Dus ('10 '== '1 f1'); wordt niet afgedrukt waar. ('10 '== '1 E1'); print waar. 273 00:23:49,120 --> 00:23:56,330 [Student] Is het hex? >> Het is niet hex, maar het is dichtbij dat het is alsof - 274 00:23:56,330 --> 00:24:01,060 1E1, wetenschappelijke notatie. 275 00:24:01,060 --> 00:24:07,950 Het erkent 1E1 als 1 * 10 ^ 1 of wat dan ook. 276 00:24:07,950 --> 00:24:11,510 Deze getallen zijn gelijk. 277 00:24:11,510 --> 00:24:15,930 Als we dat doen === dan dat het gaat om vals te zijn. 278 00:24:15,930 --> 00:24:28,490 Ik heb eigenlijk geen idee of we doen == hoe zit het met (10 en '10abc ');? Oke. Dus dat is waar. 279 00:24:28,490 --> 00:24:35,940 Dus net als wanneer je (10 + '10abc ') deed, en het zou 20, 280 00:24:35,940 --> 00:24:38,800 here (10 == '10abc); waar. 281 00:24:38,800 --> 00:24:45,350 Nog erger zijn dingen als (valse == NULL); waar is 282 00:24:45,350 --> 00:24:52,210 of (valse == 0); waar is, (valse == []); 283 00:24:52,210 --> 00:25:00,970 Er zijn rare gevallen van - Dat is een van die rare gevallen. 284 00:25:00,970 --> 00:25:08,110 Merk op dat (valse == []); is waar. 285 00:25:08,110 --> 00:25:11,950 ('0 '== False); is waar. 286 00:25:11,950 --> 00:25:16,090 ('0 '== []); Is vals. 287 00:25:16,090 --> 00:25:19,090 Dus == is op geen enkele wijze transitieve. 288 00:25:19,090 --> 00:25:26,830 een gelijk kan zijn aan b en kan gelijk zijn aan c, 289 00:25:26,830 --> 00:25:29,340 b maar misschien niet gelijk aan c. 290 00:25:29,340 --> 00:25:35,580 Dat is een gruwel voor mij, en je moet altijd gebruik maken. === 291 00:25:35,580 --> 00:25:38,590 [Student] Kunnen we doen! == Ook? >> [Bowden] Ja. 292 00:25:38,590 --> 00:25:44,600 Het equivalent zou zijn! = En! ==. 293 00:25:44,600 --> 00:25:48,230 Dit is eigenlijk opgevoed in de PSET spec 294 00:25:48,230 --> 00:25:52,000 waar veel functies terugkeer - 295 00:25:52,000 --> 00:25:53,890 De PHP handleiding is goed over. 296 00:25:53,890 --> 00:25:59,140 Het zet in een grote rode doos, "Dit zal valse terugkeren als er een fout opgetreden." 297 00:25:59,140 --> 00:26:03,940 Maar terug 0 is een volkomen redelijke zaak om terug te keren. 298 00:26:03,940 --> 00:26:08,250 Denken aan een functie die naar verwachting een integer terug. 299 00:26:11,250 --> 00:26:17,880 Laten we zeggen dat deze functie wordt verondersteld het aantal regels tellen in een bestand of zoiets. 300 00:26:17,880 --> 00:26:23,490 Onder normale omstandigheden passeert u deze functie een bestand 301 00:26:23,490 --> 00:26:27,120 en het gaat naar een integer die het aantal lijnen vertegenwoordigt terug te keren. 302 00:26:27,120 --> 00:26:30,820 Dus 0 is een volkomen redelijk aantal als het bestand is gewoon leeg. 303 00:26:30,820 --> 00:26:36,810 Maar wat als je passeert het een ongeldig bestand en de functie gebeurt er met return false 304 00:26:36,810 --> 00:26:38,860 als je langs het een ongeldig bestand? 305 00:26:38,860 --> 00:26:46,500 Als je gewoon doen == je niet het differentiëren van de zaak tussen ongeldig bestand en leeg bestand. 306 00:26:48,870 --> 00:26:51,350 Gebruik altijd. === 307 00:26:55,690 --> 00:26:58,000 Dat is alles wat van. 308 00:26:58,000 --> 00:27:01,660 >> In PHP, de array type is anders dan wat je gewend bent in C. 309 00:27:01,660 --> 00:27:06,650 Inderdaad, kan je al gemerkt hebben dat dit boven toen je zag dat dit van het type array. 310 00:27:06,650 --> 00:27:15,640 De beugel syntax is nieuw met ingang van PHP 5.4, dat is de nieuwste versie van PHP. 311 00:27:15,640 --> 00:27:36,960 Voordat deze moest je altijd scala schrijven ('a' -> 1, 'b' -> 2. 312 00:27:36,960 --> 00:27:41,160 Dat was de constructor voor een array. 313 00:27:41,160 --> 00:27:45,950 Nu PHP is eindelijk gekomen om naar het mooie syntaxis van slechts vierkante haakjes, 314 00:27:45,950 --> 00:27:50,900 dat is gewoon zo veel beter dan array. 315 00:27:50,900 --> 00:27:54,480 Maar gezien PHP 5.4 is de nieuwste versie, 316 00:27:54,480 --> 00:27:59,090 u kunt tegenkomen plaatsen die niet eens PHP 5.3. 317 00:27:59,090 --> 00:28:08,220 In de zomer kwamen we deze kwestie waar PHP 5.3 was wat we hadden op het apparaat, 318 00:28:08,220 --> 00:28:14,480 maar de server dat we allemaal onze klasboek ingezet en legt en al dat spul te 319 00:28:14,480 --> 00:28:16,750 PHP was 5,4. 320 00:28:16,750 --> 00:28:23,060 Niet wetend dat dit, ontwikkelden wij in 5.3, duwde tot 5,4, 321 00:28:23,060 --> 00:28:25,660 en nu ineens geen van onze code werkt 322 00:28:25,660 --> 00:28:28,680 want er is er gebeurd met zijn veranderingen tussen 5.3 en 5.4 323 00:28:28,680 --> 00:28:31,030 die niet backwards compatible, 324 00:28:31,030 --> 00:28:35,770 en we hebben om te gaan en al onze spullen die niet werken voor PHP 5.4 vast te stellen. 325 00:28:39,210 --> 00:28:42,320 Voor deze klasse, omdat het apparaat heeft wel PHP 5.4, 326 00:28:42,320 --> 00:28:45,490 het is prima te gebruiken tussen vierkante haken. 327 00:28:47,240 --> 00:28:50,440 Maar als je op zoek bent naar dingen op op het internet, 328 00:28:50,440 --> 00:28:54,880 als u op zoek bent naar omhoog een soort van array dingen, waarschijnlijk zul je zien 329 00:28:54,880 --> 00:29:02,020 de spreuk uit constructor Array-syntaxis want dat is al sinds PHP is geboren 330 00:29:02,020 --> 00:29:07,340 en vierkante haken syntax is al voor de afgelopen paar maanden 331 00:29:07,340 --> 00:29:10,020 of wanneer 5,4 kwam rond. 332 00:29:10,020 --> 00:29:12,710 Dit is hoe je index. 333 00:29:12,710 --> 00:29:30,610 Net als in C hoe je dat zou doen index tussen vierkante haken als $ array [0], $ array [1], $ array [2], 334 00:29:30,610 --> 00:29:36,320 u index op dezelfde manier als je toevallig om uw indexen zijn snaren. 335 00:29:36,320 --> 00:29:40,440 Dus $ array ['a'] en $ array ['b']. 336 00:29:40,440 --> 00:29:47,410 $ Array [b]. Waarom zou dit verkeerd zijn? 337 00:29:52,490 --> 00:29:59,870 Het zal waarschijnlijk een waarschuwing, maar nog steeds werken. PHP heeft de neiging om dat te doen. 338 00:29:59,870 --> 00:30:04,890 Het heeft de neiging om gewoon, "Ik ga om u te waarschuwen over dit, maar ik ga gewoon om door te gaan 339 00:30:04,890 --> 00:30:07,550 "En doen wat ik kan." 340 00:30:07,550 --> 00:30:11,500 Het zal waarschijnlijk vertalen naar een string, 341 00:30:11,500 --> 00:30:15,000 maar het is mogelijk dat op een bepaald punt in het verleden zei iemand 342 00:30:15,000 --> 00:30:20,180 definiëren b om zijn 'hello world'. 343 00:30:20,180 --> 00:30:28,740 Dus nu b kan een constante en $ array [b] ook daadwerkelijk moeten doen 'hello world'. 344 00:30:28,740 --> 00:30:32,380 Ik denk dat op dit punt, of op zijn minst onze PHP-instellingen, 345 00:30:32,380 --> 00:30:37,870 als u probeert index in een array en die sleutel niet bestaat, zal het mislukken. 346 00:30:37,870 --> 00:30:40,150 Ik denk niet dat het zal je gewoon te waarschuwen. 347 00:30:40,150 --> 00:30:44,560 Of op zijn minst je kunt het zo instellen dat het niet alleen waarschuwen, het is gewoon recht omhoog mislukt. 348 00:30:44,560 --> 00:30:49,290 >> De manier waarop je controleren om te zien of er daadwerkelijk zo'n index is isset. 349 00:30:49,290 --> 00:30:54,690 Dus isset ($ array ['hello world']) zal terugkeren vals. 350 00:30:54,690 --> 00:30:59,160 isset ($ array ['b']) zal terugkeren waar. 351 00:31:06,830 --> 00:31:09,880 U kunt de mix van deze syntaxis. 352 00:31:15,060 --> 00:31:22,440 Ik ben er vrij zeker van wat deze array zou uiteindelijk op een is - We kunnen testen het uit. 353 00:31:43,290 --> 00:31:45,700 Oh, ik heb PHPWord. 354 00:31:53,960 --> 00:32:00,260 Dit is het mengen van de syntaxis waar u specificeren wat de sleutel is 355 00:32:00,260 --> 00:32:03,330 en u niet aangeven wat de sleutel is. 356 00:32:03,330 --> 00:32:05,520 Dus 3 hier is een waarde. 357 00:32:05,520 --> 00:32:08,080 U heeft niet expliciet gezegd wat de belangrijkste zal zijn. 358 00:32:08,080 --> 00:32:11,670 Wat denk je dat de belangrijkste zal zijn? 359 00:32:11,670 --> 00:32:21,410 [Student] 0. >> Ik gok 0 alleen omdat het de eerste die we niet hebben opgegeven. 360 00:32:21,410 --> 00:32:23,500 We kunnen eigenlijk doen een paar van deze gevallen. 361 00:32:23,500 --> 00:32:28,030 Dus print_r is recursief af te drukken. Het drukt het hele array. 362 00:32:28,030 --> 00:32:32,700 Het zou afdrukken subarrays van de matrix of er nog. 363 00:32:32,700 --> 00:32:36,630 Dus print_r ($ array); php.test.php. 364 00:32:36,630 --> 00:32:38,810 Het maakt lijkt het gaf het 0. 365 00:32:38,810 --> 00:32:43,530 Er is eigenlijk iets om hier in gedachten te houden, maar we zullen ze terug te vinden in een tweede. 366 00:32:43,530 --> 00:32:45,850 Maar wat als ik toevallig deze index 1 te maken? 367 00:32:45,850 --> 00:32:51,170 PHP maakt geen onderscheid tussen snaar indices en integer indices, 368 00:32:51,170 --> 00:33:00,280 dus op dit punt dat ik heb zojuist gedefinieerd een index 1 en ik kan zowel $ array [1] en $ array ['1 '] doen 369 00:33:00,280 --> 00:33:06,250 en wordt dezelfde index en dezelfde sleutel. 370 00:33:06,250 --> 00:33:13,000 Dus nu wat denk je dat 3 gaat worden? >> [Student] 2. >> [Bowden] Ik gok 2. 371 00:33:16,000 --> 00:33:18,690 Ja. Het is 2. 372 00:33:18,690 --> 00:33:24,790 Wat als we dit deden is 10, dit is 4? Wat denk je dat de index van 3 gaat worden? 373 00:33:27,360 --> 00:33:29,110 Ik denk 11. 374 00:33:29,110 --> 00:33:33,060 Mijn gok over wat PHP doet - en ik denk dat ik dit eerder gezien - 375 00:33:33,060 --> 00:33:39,760 wordt het blijft gewoon bij wat de hoogste numerieke index het is tot nu toe gebruikt is. 376 00:33:39,760 --> 00:33:44,230 Het zal nooit een string-index toe te wijzen aan 3. Het zal altijd een numerieke index. 377 00:33:44,230 --> 00:33:47,690 Dus het houdt bij de hoogste een het is tot nu toe toegewezen, die toevallig ook 10, 378 00:33:47,690 --> 00:33:52,540 en het gaat tot 11 te geven aan 3. 379 00:33:52,540 --> 00:34:02,110 Wat ik al eerder zei, let op de manier waarop het wordt afgedrukt deze array. 380 00:34:02,110 --> 00:34:06,850 Hij drukt toets 10, toets 4, toets 11, toets d. 381 00:34:06,850 --> 00:34:09,790 Of zelfs laten we het doen - 382 00:34:15,760 --> 00:34:22,489 Ik denk dat ik niet een 0 te zetten, maar het is druk 1, 2, 3, 4. 383 00:34:22,489 --> 00:34:29,330 Wat als ik hier wisselen? Of laten we eigenlijk deze 2 te schakelen. 384 00:34:29,330 --> 00:34:31,940 Nu wordt afgedrukt 2, 1, 3, 4. 385 00:34:31,940 --> 00:34:41,270 PHP arrays zijn niet net als uw gewone hash-tabel. 386 00:34:41,270 --> 00:34:45,570 Het is volkomen redelijk om te denken dat ze hash tabellen 99% van de tijd. 387 00:34:45,570 --> 00:34:53,790 Maar in uw hash tabellen is er geen gevoel van de volgorde waarin dingen werden geplaatst. 388 00:34:53,790 --> 00:34:56,639 Dus zodra je plaats deze in uw hash-tabel, 389 00:34:56,639 --> 00:35:00,590 aannemen dat er geen gelinkte lijst en je kon beoordelen binnen een gekoppelde lijst 390 00:35:00,590 --> 00:35:03,980 die eerst werd ingebracht. 391 00:35:03,980 --> 00:35:10,060 Maar hier zijn we geplaatst 2 eerste en het weet wanneer het printen van de array die 2 eerste komt. 392 00:35:10,060 --> 00:35:13,090 Het maakt niet uitprinten in slechts een willekeurige volgorde. 393 00:35:13,090 --> 00:35:17,550 De technische gegevens structuur die het is gebruikt, is een geordende kaart, 394 00:35:17,550 --> 00:35:24,690 dus het in kaart toetsen om waarden en onthoudt de volgorde waarin deze toetsen werden ingebracht. 395 00:35:24,690 --> 00:35:31,600 Eigenlijk is het om een ​​aantal complicaties waar het is vervelend om daadwerkelijk - 396 00:35:31,600 --> 00:35:34,510 Laten we zeggen dat je een array 0, 1, 2, 3, 4, 5 397 00:35:34,510 --> 00:35:37,700 en je wilt tot het afsluiten van index 2. 398 00:35:37,700 --> 00:35:47,750 Een manier van doen, laten we eens kijken hoe dat eruit ziet. 399 00:35:47,750 --> 00:35:50,410 0, 2, 1, 3, 4. 400 00:35:50,410 --> 00:35:54,880 Unset gebeurt er met unset beide variabelen en array-indices. 401 00:35:54,880 --> 00:35:58,630 Dus unset ($ array [2]); 402 00:35:58,630 --> 00:36:03,430 Nu, wat is dit eruit komt te zien? 2 is gewoon weg, dus dat is prima. 403 00:36:03,430 --> 00:36:11,670 Meer vervelend is als je wilt dingen om daadwerkelijk als een array. 404 00:36:11,670 --> 00:36:14,910 Ik zet willekeurige getallen. 405 00:36:14,910 --> 00:36:20,400 Let nu op mijn indices. 406 00:36:20,400 --> 00:36:26,860 Ik wil dat het gewoon als een C-array waar het naartoe gaat van 0 tot lengte - 1 407 00:36:26,860 --> 00:36:30,810 en ik kan itereren over het als zodanig. 408 00:36:30,810 --> 00:36:38,520 Maar zodra ik de tweede index, wat er in index 3 uitschakelen niet geworden index 2. 409 00:36:38,520 --> 00:36:44,790 In plaats daarvan haalt alleen maar die index en nu ga je 0, 1, 3, 4. 410 00:36:44,790 --> 00:36:48,740 Dit is volkomen redelijk. 411 00:36:48,740 --> 00:36:53,950 Het is gewoon vervelend en je moet dingen als serie splice doen. Ja. 412 00:36:53,950 --> 00:36:57,200 >> [Student] Wat zou er gebeuren als je een for-lus 413 00:36:57,200 --> 00:36:59,630 en je wilde gaan over alle elementen? 414 00:36:59,630 --> 00:37:02,290 Als het 2 hit, zou het ooit op? 415 00:37:02,290 --> 00:37:10,150 Itereren over een array. Er zijn 2 manieren waarop je kunt doen. 416 00:37:10,150 --> 00:37:12,770 U kunt gebruik maken van een gewone for-lus. 417 00:37:12,770 --> 00:37:22,000 Dit is een andere complexiteit van PHP. 418 00:37:22,000 --> 00:37:27,420 De meeste talen, zou ik zeggen, hebben een soort van lengte of len of iets 419 00:37:27,420 --> 00:37:30,470 dat de lengte van een array. 420 00:37:30,470 --> 00:37:32,820 In PHP is het tellen. 421 00:37:32,820 --> 00:37:36,160 Dus count ($ array); $ i + +) 422 00:37:36,160 --> 00:37:42,950 Laten we gewoon print ($ array [$ i]); 423 00:37:45,920 --> 00:37:48,820 Notice: Undefined offset: 2. 424 00:37:48,820 --> 00:37:51,610 Het zal alleen maar mislukken. 425 00:37:51,610 --> 00:38:03,020 Dit is de reden dat, voor het grootste deel, moet u nooit itereren over een array als deze. 426 00:38:03,020 --> 00:38:07,110 Het is misschien overdreven, maar je hoeft nooit itereren over een array als deze 427 00:38:07,110 --> 00:38:19,410 omdat PHP biedt haar foreach syntax waar foreach ($ array als $ item). 428 00:38:19,410 --> 00:38:31,830 Als we nu af te drukken ($ item), - we zullen bespreken in een tweede - dat werkt prima. 429 00:38:31,830 --> 00:38:38,960 De manier waarop foreach werkt is het eerste argument is de array die u itereren over. 430 00:38:38,960 --> 00:38:44,060 En het tweede argument, item, door middel van elke passage van de for-lus 431 00:38:44,060 --> 00:38:52,690 het gaat om op de volgende ding in de array. Dus onthoud de array heeft een order. 432 00:38:52,690 --> 00:38:55,690 De eerste keer door de lus, wordt punt gaat worden 123 433 00:38:55,690 --> 00:38:59,540 dan zal 12 dan zal 13 dan zal 23 dan zal 213. 434 00:38:59,540 --> 00:39:04,670 Dingen krijgen echt raar als je zoiets doen foreach. 435 00:39:04,670 --> 00:39:07,480 Laten we eens kijken wat er gebeurt, want je moet nooit doen. 436 00:39:07,480 --> 00:39:13,320 Wat als we unset ($ array [1]); 437 00:39:20,410 --> 00:39:26,030 Dat is waarschijnlijk werd verwacht. 438 00:39:26,030 --> 00:39:30,950 Je itereren over deze array, en elke keer dat je het uitschakelen van het eerste index. 439 00:39:30,950 --> 00:39:39,720 Dus voor index 0, het eerste wat, item krijgt waarde 0, dus het gaat worden 123. 440 00:39:39,720 --> 00:39:44,630 Maar de binnenkant van de for-lus we uitgeschakeld index 1, dus dat betekent dat 12 is verdwenen. 441 00:39:44,630 --> 00:39:57,480 Zo af te drukken. PHP_EOL. 442 00:39:57,480 --> 00:40:03,580 PHP_EOL is gewoon newline, maar het is technisch gezien meer draagbare 443 00:40:03,580 --> 00:40:08,890 omdat nieuwe regels in Windows verschilt van nieuwe regels op de Mac en UNIX. 444 00:40:08,890 --> 00:40:18,040 Op Windows newline is \ r \ n, terwijl overal elders heeft het de neiging alleen maar om \ n. 445 00:40:18,040 --> 00:40:25,150 PHP_EOL is zodanig geconfigureerd dat het gebruik maakt van wat de nieuwe regel van uw systeem. 446 00:40:25,150 --> 00:40:29,310 Zo af te drukken dat. Laten we niet print_r ($ array) aan het eind. 447 00:40:32,830 --> 00:40:37,390 Ik had geen idee dat dit het gedrag. 448 00:40:41,740 --> 00:40:48,960 Item neemt nog steeds op de waarde 12 ook al hebben we uitschakelen 12 voordat we ooit moet het uit de array. 449 00:40:52,770 --> 00:40:58,840 Niet op mijn woord te nemen op deze, maar het lijkt erop dat foreach maakt een kopie van de array 450 00:40:58,840 --> 00:41:02,160 en dan wordt in punt neemt alle waarden van die kopie. 451 00:41:02,160 --> 00:41:07,760 Dus zelfs als je wijzigt de array in de for-lus, 452 00:41:07,760 --> 00:41:17,240 zal het niet schelen. Het punt zal nemen op de oorspronkelijke waarden. 453 00:41:17,240 --> 00:41:19,240 Laten we het proberen uitschakelen het. 454 00:41:19,240 --> 00:41:24,460 Wat als dit $ array [1] = "hello"; 455 00:41:24,460 --> 00:41:31,770 Hoewel we "hallo" put in de array, punt neemt nooit op die waarde. 456 00:41:31,770 --> 00:41:37,430 Er is nog een syntax om loops foreach 457 00:41:37,430 --> 00:41:45,900 waar je 2 variabelen gescheiden door een pijl. 458 00:41:45,900 --> 00:41:49,680 Deze eerste variabele zal de sleutel van die waarde, 459 00:41:49,680 --> 00:41:53,050 en deze tweede variabele gaat exact dezelfde item. 460 00:41:53,050 --> 00:42:01,610 Dit wordt hier oninteressant, maar als we terug gaan naar onze oorspronkelijke geval van "a" -> 1, 461 00:42:01,610 --> 00:42:06,090 'B' -> 1, 462 00:42:06,090 --> 00:42:14,470 hier als we alleen maar herhalen voor elke array als item, wordt punt zal op 1 elke keer. 463 00:42:14,470 --> 00:42:18,170 Maar als we willen ook de toets met het item weten 464 00:42:18,170 --> 00:42:25,230 dan doen we als $ key -> $ item. 465 00:42:25,230 --> 00:42:31,980 Dus nu kunnen we print ($ key. ':'. 466 00:42:31,980 --> 00:42:39,380 Nu is het itereren over en afdrukken van elke sleutel en de bijbehorende waarde. 467 00:42:39,380 --> 00:42:47,030 >> Een extra ding dat we kunnen doen in foreach loops is dat je zou kunnen zien deze syntax. 468 00:42:47,030 --> 00:42:54,770 Ampersands voor namen van variabelen hebben de neiging om hoe PHP referenties doet. 469 00:42:54,770 --> 00:43:00,460 Waar referenties zijn zeer vergelijkbaar met pointers, 470 00:43:00,460 --> 00:43:04,820 u niet beschikt over pointers, zodat u nooit rechtstreeks te maken hebben met het geheugen. 471 00:43:04,820 --> 00:43:12,620 Maar je hoeft referenties waarbij 1 variabele verwijst naar hetzelfde als een andere variabele. 472 00:43:12,620 --> 00:43:21,450 Binnenkant van hier laten we het doen $ item. Laten we terug gaan naar 1, 10. 473 00:43:21,450 --> 00:43:28,800 Laten we $ item + +; Dat bestaat nog steeds in PHP. U kunt nog steeds doen + +. 474 00:43:28,800 --> 00:43:38,260 php.test.php. Ik moet het af te drukken. print_r ($ array); 475 00:43:38,260 --> 00:43:42,730 Wij printen 2, 11. 476 00:43:42,730 --> 00:43:49,560 Als ik had net gedaan foreach ($ array als $ item) dan wordt in punt zal de waarde 1 te zijn 477 00:43:49,560 --> 00:43:54,190 de eerste keer door de lus. Het zal verhoogd 1 naar 2 en dan zijn we klaar. 478 00:43:54,190 --> 00:43:57,260 Dus dan zal het gaan door de tweede passage van de lus en dat item is 10. 479 00:43:57,260 --> 00:44:01,570 Het stappen van punt tot 11, en dan dat is gewoon weggegooid. 480 00:44:01,570 --> 00:44:06,670 Dan hebben we print_r ($ array), en laten we zien dat dit slechts 1, 10. 481 00:44:06,670 --> 00:44:09,070 Dus de stap die we deden was verloren. 482 00:44:09,070 --> 00:44:13,410 Maar foreach ($ array als & $ item) 483 00:44:13,410 --> 00:44:21,910 nu dit artikel is hetzelfde item als dit hier. Het is hetzelfde ding. 484 00:44:21,910 --> 00:44:26,820 Dus $ item + + wordt het wijzigen serie 0. 485 00:44:29,330 --> 00:44:41,850 In principe kun je ook doen $ k -> $ item en je kunt doen $ array [$ k] + +; 486 00:44:41,850 --> 00:44:48,650 >> Dus een andere manier om dat te doen, zijn we vrij om item te wijzigen, 487 00:44:48,650 --> 00:44:54,070 maar dat zal niet veranderen onze oorspronkelijke array. 488 00:44:54,070 --> 00:44:59,720 Maar als we k, dat is onze belangrijkste, kunnen we dan gewoon index in ons aanbod met behulp van die toets 489 00:44:59,720 --> 00:45:01,530 en verhoog dat. 490 00:45:01,530 --> 00:45:05,410 Dit meer rechtstreeks wijzigt onze oorspronkelijke array. 491 00:45:05,410 --> 00:45:10,690 U kunt zelfs doen als een of andere reden je wilde de mogelijkheid om te wijzigen - 492 00:45:10,690 --> 00:45:13,510 Eigenlijk is dit heel redelijk. 493 00:45:13,510 --> 00:45:16,020 Je hebt niet willen hebben om $ schrijven array [$ k] + +, 494 00:45:16,020 --> 00:45:27,890 je wilde ik gewoon te schrijven $ post + +, maar je nog steeds wilde zeggen if ($ k === 'a') 495 00:45:27,890 --> 00:45:30,620 dan verhogen item en vervolgens afdrukken ons aanbod. 496 00:45:30,620 --> 00:45:36,290 Dus nu wat verwachten wij print_r te doen? Welke waarden moet worden afgedrukt? 497 00:45:36,290 --> 00:45:43,770 [Student] 2 en 10. >> [Bowden] Alleen als de sleutel was 'een' weten we eigenlijk af te drukken dat. 498 00:45:51,940 --> 00:45:55,670 >> Je hebt waarschijnlijk zeer zelden of nooit nodig hebt om functies te definiëren in PHP, 499 00:45:55,670 --> 00:46:03,370 maar je zou kunnen zien iets dergelijks waar u een functie definiëren als functie wat dan ook. 500 00:46:03,370 --> 00:46:09,900 Meestal zou je zeggen ($ foo, $ bar) en vervolgens te definiëren dat het wat dan ook. 501 00:46:09,900 --> 00:46:17,580 Maar als ik dit doe, dan betekent dat wat er ook noemt wat dan ook, 502 00:46:17,580 --> 00:46:25,110 wat noemt baz, dus het eerste argument doorgegeven aan baz kan worden gewijzigd. 503 00:46:25,110 --> 00:46:38,100 Laten we $ foo + +; 504 00:46:38,100 --> 00:46:48,020 en de binnenkant van hier laten we het doen Baz ($ item); 505 00:46:48,020 --> 00:46:52,250 Nu zijn we het aanroepen van een functie. 506 00:46:52,250 --> 00:46:56,780 Het argument wordt door verwijzing, wat betekent dat als we wijzigen 507 00:46:56,780 --> 00:47:00,390 we wijzigen het ding dat is doorgegeven inch 508 00:47:00,390 --> 00:47:04,420 En het afdrukken van dit verwachten we dat - tenzij ik messed up syntax - kregen we 2, 11, 509 00:47:04,420 --> 00:47:06,300 dus het was eigenlijk opgehoogd. 510 00:47:06,300 --> 00:47:08,790 Merk op dat we nodig hebben referenties in 2 plaatsen. 511 00:47:08,790 --> 00:47:13,050 Wat als ik dit deed? Wat betekent dit? 512 00:47:13,050 --> 00:47:15,810 [Student] Het zal veranderen. >> Ja. 513 00:47:15,810 --> 00:47:18,290 Item is gewoon een kopie van de waarde in de array. 514 00:47:18,290 --> 00:47:26,670 Dus item verandert op 2, maar de array ['a'] nog steeds 1. 515 00:47:26,670 --> 00:47:32,560 Of wat als ik dit doe? 516 00:47:32,560 --> 00:47:39,260 Nu item wordt verzonden als een kopie naar BaZ. 517 00:47:39,260 --> 00:47:46,330 Dus de kopie van het argument zal worden verhoogd naar 2, 518 00:47:46,330 --> 00:47:49,240 maar item zelf is nooit verhoogd naar 2. 519 00:47:49,240 --> 00:47:52,880 En item is hetzelfde als array beugel wat dan ook, 520 00:47:52,880 --> 00:47:55,380 zodat array werd nooit verhoogd. 521 00:47:55,380 --> 00:47:57,960 Dus zowel die plaatsen nodig hebben. 522 00:47:57,960 --> 00:48:03,830 >> PHP is meestal behoorlijk slim over. 523 00:48:03,830 --> 00:48:06,570 U denkt misschien dat ik wil gaan aan de hand - 524 00:48:06,570 --> 00:48:09,560 Dit was eigenlijk een vraag aan een van de psets. 525 00:48:09,560 --> 00:48:14,480 Het was een Questions.txt ding waar het zei, 526 00:48:14,480 --> 00:48:19,280 Waarom zou u deze struct voorbij aan de hand? 527 00:48:19,280 --> 00:48:21,250 Wat was het antwoord op die? 528 00:48:21,250 --> 00:48:25,100 [Student] Dus je hoeft niet iets groots te kopiëren. >> Ja. 529 00:48:25,100 --> 00:48:32,920 Een struct kan willekeurig groot, en als je langs de struct in als argument 530 00:48:32,920 --> 00:48:36,800 het moet dat hele struct kopiëren door te geven aan de functie, 531 00:48:36,800 --> 00:48:40,410 terwijl als je gewoon langs de struct door middel van verwijzing 532 00:48:40,410 --> 00:48:46,530 dan moet er maar een 4-byte-adres te kopiëren als het argument voor de functie. 533 00:48:48,520 --> 00:48:52,320 PHP is een beetje slimmer dan dat. 534 00:48:52,320 --> 00:49:00,650 Als ik wat functie en ik langs om het een reeks van 1.000 dingen, 535 00:49:00,650 --> 00:49:03,990 betekent dat het gaat te hebben om alle 1.000 van die dingen te kopiëren 536 00:49:03,990 --> 00:49:10,450 door te geven in de functie? Het hoeft niet onmiddellijk doen. 537 00:49:10,450 --> 00:49:15,940 Als de binnenkant van deze functie eigenlijk nooit wijzigt foo, 538 00:49:15,940 --> 00:49:22,660 dus if ($ foo === 'hallo') return true.; 539 00:49:22,660 --> 00:49:26,460 Merk op dat we nooit het argument binnenkant van deze functie gewijzigd, 540 00:49:26,460 --> 00:49:30,010 Dit betekent dat wat werd doorgegeven als foo niet moet worden gekopieerd 541 00:49:30,010 --> 00:49:32,100 omdat het niet modificeren. 542 00:49:32,100 --> 00:49:39,240 Dus de manier waarop PHP werkt is de argumenten worden altijd doorgegeven aan de hand 543 00:49:39,240 --> 00:49:42,170 totdat u daadwerkelijk probeert om het te wijzigen. 544 00:49:42,170 --> 00:49:51,160 Nu als ik zeg $ foo + +, het zal nu een kopie van de originele foo en wijzigen van de kopie. 545 00:49:51,160 --> 00:49:53,090 Dit bespaart tijd. 546 00:49:53,090 --> 00:49:58,210 Als je nooit aanraken deze enorme array, je nooit echt te wijzigen, 547 00:49:58,210 --> 00:50:02,360 het niet nodig om een ​​kopie te maken, 548 00:50:02,360 --> 00:50:06,640 terwijl als we alleen maar zet deze ampersand dat betekent dat het niet eens te kopiëren 549 00:50:06,640 --> 00:50:08,640 zelfs als je wijzigen. 550 00:50:08,640 --> 00:50:10,680 Dit gedrag wordt copy-on-write. 551 00:50:10,680 --> 00:50:17,380 Je zult zien dat op andere plaatsen, vooral als u een besturingssysteem cursus. 552 00:50:17,380 --> 00:50:23,880 Copy-on-write is een vrij gebruikelijke patroon waar je niet nodig om een ​​kopie van iets te maken 553 00:50:23,880 --> 00:50:26,650 tenzij het is eigenlijk aan het veranderen. Ja. 554 00:50:26,650 --> 00:50:29,520 [Student] Wat als je had de toename in de test, 555 00:50:29,520 --> 00:50:33,700 dus slechts 1 element uit 1000 zou moeten worden gewijzigd? 556 00:50:33,700 --> 00:50:38,770 Ik weet het niet zeker. 557 00:50:38,770 --> 00:50:51,250 Ik denk dat het het hele ding te kopiëren, maar het is mogelijk dat het slim genoeg dat - 558 00:50:51,250 --> 00:51:00,020 Eigenlijk, wat ik denk is stel dat we hadden een array die er zo uitziet: $ matrix2 = [ 559 00:51:00,020 --> 00:51:11,000 Vervolgens index "a" een array van [1 2 3 4] en index 'b' is een array van wat. 560 00:51:11,000 --> 00:51:15,380 Ik moet komma's tussen al die. Stel je voor er zijn komma's. 561 00:51:15,380 --> 00:51:21,210 Dan 'c' is de waarde 3. 562 00:51:24,210 --> 00:51:26,290 Oke. 563 00:51:26,290 --> 00:51:33,440 Laten we nu zeggen dat we doen $ Baz ($ matrix2); 564 00:51:33,440 --> 00:51:36,540 waar baz niet nemen deze door middel van verwijzing. 565 00:51:43,510 --> 00:51:47,370 Dus $ foo ["c"] + +; 566 00:51:47,370 --> 00:51:52,340 Dit is zo'n voorbeeld waar we matrix2 passeren als argument 567 00:51:52,340 --> 00:51:57,010 en dan is het modificeren van een specifieke index van de array verhogen het. 568 00:51:57,010 --> 00:52:01,090 Ik heb eerlijk gezegd geen idee wat PHP gaat doen. 569 00:52:01,090 --> 00:52:07,200 Het kan gemakkelijk een kopie maken van het hele ding, maar als het is slim, 570 00:52:07,200 --> 00:52:15,030 het zal een kopie maken van deze toetsen waar dit zal zijn aparte waarde hebben 571 00:52:15,030 --> 00:52:20,620 maar dit kan nog steeds naar dezelfde array 1,2,3,4 572 00:52:20,620 --> 00:52:22,320 en dit kan nog naar dezelfde array. 573 00:52:22,320 --> 00:52:24,170 Ik zal iPad het. 574 00:52:28,900 --> 00:52:45,950 We passeren in deze array waar deze man wijst naar 3, deze man wijst naar [1,2,3,4], 575 00:52:45,950 --> 00:52:51,350 deze man wijst naar [34, ...] 576 00:52:51,350 --> 00:52:58,590 Nu dat we het passeren in om baz, zijn we het wijzigen van deze. 577 00:52:58,590 --> 00:53:03,550 Als PHP is slim, kan het gewoon doen - 578 00:53:11,850 --> 00:53:18,230 We moesten nog wat geheugen te kopiëren, maar als er deze enorme geneste subarrays 579 00:53:18,230 --> 00:53:21,560 we hebben geen behoefte aan deze te kopiëren. 580 00:53:21,560 --> 00:53:27,530 Ik weet niet of dat is wat het doet, maar ik kan me voorstellen dat dat te doen. 581 00:53:29,050 --> 00:53:36,690 Dit is ook een vrij grote voordeel van C over PHP. 582 00:53:36,690 --> 00:53:40,320 >> PHP maakt het leven zo veel makkelijker voor een heleboel dingen, 583 00:53:40,320 --> 00:53:45,060 maar je soort heb absoluut geen idee hoe goed het zal presteren 584 00:53:45,060 --> 00:53:52,530 want ik heb geen idee onder de kap als het maken van deze kopieën van de dingen, 585 00:53:52,530 --> 00:53:55,170 oh, is dat gaat om een ​​constante tijd kopie te zijn, 586 00:53:55,170 --> 00:54:01,140 is het gewoon gaat om een ​​aanwijzer te veranderen, gaat het om een ​​belachelijk moeilijke lineaire kopie zijn? 587 00:54:01,140 --> 00:54:03,000 Wat als het niet kan plaats te vinden? 588 00:54:03,000 --> 00:54:06,760 Is het dan nodig om het ophalen van vuilnis lopen om wat meer ruimte te krijgen? 589 00:54:06,760 --> 00:54:11,210 En garbage collection kan willekeurig lang duren. 590 00:54:11,210 --> 00:54:13,600 In C u geen zorgen te maken over deze dingen. 591 00:54:13,600 --> 00:54:19,780 Elke lijn die je schrijft kun je vrij veel verstand over hoe het gaat uitvoeren. 592 00:54:26,800 --> 00:54:29,150 >> Laten we terug kijken naar deze. 593 00:54:35,400 --> 00:54:37,520 Hoe mooi is het dat je niet hoeft om te gaan met hash-functies, 594 00:54:37,520 --> 00:54:39,010 gelinkte lijsten, of iets dergelijks? 595 00:54:39,010 --> 00:54:41,980 Omdat het werken met hash tabellen is zo makkelijk nu, hier is een leuke puzzel om te werken aan. 596 00:54:41,980 --> 00:54:45,920 Open een bestand met de naam unique.php en in te schrijven een PHP-programma 597 00:54:45,920 --> 00:54:48,330 (Ook wel "script"). 598 00:54:48,330 --> 00:54:55,700 We hebben de neiging om noemen ze de scripts als ze korte dingen die je draaien op de opdrachtregel. 599 00:54:55,700 --> 00:55:02,950 In principe elke taal die u niet compileren, maar je gaat het programma te starten 600 00:55:02,950 --> 00:55:05,920 op de opdrachtregel, kunt u dat uitvoerbaar script. 601 00:55:05,920 --> 00:55:08,510 Ik kon net zo goed schrijf een C programma dat dit doet, 602 00:55:08,510 --> 00:55:12,300 maar ik noem het niet een script, omdat ik voor het eerst compileren en voer vervolgens de binaire. 603 00:55:12,300 --> 00:55:15,480 Maar dit PHP-programma gaan we een script te bellen. 604 00:55:15,480 --> 00:55:23,830 Of als we schreven het in Python of Perl of Node.js of een van die dingen, 605 00:55:23,830 --> 00:55:26,500 we noemen ze alle scripts, omdat je ze uit te voeren op de opdrachtregel 606 00:55:26,500 --> 00:55:30,040 maar we weten niet compileren. 607 00:55:30,860 --> 00:55:33,400 We kunnen dit doen vrij snel. 608 00:55:36,960 --> 00:55:41,480 We zijn niet van plan om argv gebruiken. Net Laten we blazen doorheen. 609 00:55:41,480 --> 00:55:45,730 Noem het een unieke, een programma schrijven. 610 00:55:45,730 --> 00:55:49,400 U kunt ervan uitgaan dat de ingang een woord per regel bevatten. 611 00:55:49,400 --> 00:55:52,020 In feite zal argv behoorlijk triviaal te gebruiken. 612 00:56:03,730 --> 00:56:06,720 unique.php. 613 00:56:08,550 --> 00:56:13,750 Beginnen bij het begin willen we kijken of we zijn doorgegeven een command-line argument. 614 00:56:13,750 --> 00:56:20,900 Net zoals je zou verwachten argc en argv in C, we hebben nog steeds die in PHP. 615 00:56:20,900 --> 00:56:33,900 Dus if ($ argc! == 2) dan zal ik niet zal gaan over het afdrukken van een bericht of wat dan ook. 616 00:56:33,900 --> 00:56:37,340 Ik zal gewoon af te sluiten, foutcode van 1. 617 00:56:37,340 --> 00:56:41,340 Ik zou ook terug 1. 618 00:56:41,340 --> 00:56:53,180 Zelden in PHP ben je in deze staat, waar we aan toe - 619 00:56:53,180 --> 00:56:57,820 Meestal ben je in een functie genaamd door een functie aangeroepen door een functie genaamd door een functie. 620 00:56:57,820 --> 00:57:02,070 En als er iets mis gaat en je wil gewoon volledig af te sluiten alles, 621 00:57:02,070 --> 00:57:05,680 afslag eindigt net het programma. 622 00:57:05,680 --> 00:57:08,160 Dit bestaat ook in C. 623 00:57:08,160 --> 00:57:10,700 Als je in een functie in een functie in een functie in een functie 624 00:57:10,700 --> 00:57:17,540 en je wilt gewoon vermoorden van het programma, kunt u bellen met exit en het zal gewoon af te sluiten. 625 00:57:17,540 --> 00:57:23,120 Maar in PHP is het nog zelden dat we op dit hoogste niveau. 626 00:57:23,120 --> 00:57:26,090 Meestal zijn we binnen een soort van functie, dus noemen we exit 627 00:57:26,090 --> 00:57:29,650 zodat we niet hoeven terug te keren tot 1 ding die vervolgens realiseert er een fout 628 00:57:29,650 --> 00:57:32,270 zodat weer op als dat erkent dat was een fout. 629 00:57:32,270 --> 00:57:35,270 We willen niet om te gaan met dat, dus af te sluiten (1); 630 00:57:35,270 --> 00:57:38,240 return (1), in dit geval gelijk. 631 00:57:38,240 --> 00:57:44,000 >> Dan wat we willen openen we willen fopen. 632 00:57:44,000 --> 00:57:46,760 De argumenten gaan kijken redelijk vergelijkbaar. 633 00:57:46,760 --> 00:57:51,600 We willen fopen ($ argv [1], en we willen om het te openen om te lezen. 634 00:57:51,600 --> 00:57:55,720 Dat geeft een hulpbron die we gaan f bellen. 635 00:57:55,720 --> 00:58:02,180 Dit lijkt redelijk vergelijkbaar met hoe C doet het behalve dat we niet hoeven te FILE * zeggen. 636 00:58:02,180 --> 00:58:06,170 In plaats daarvan hebben we gewoon zeggen dat $ f. Oke. 637 00:58:06,170 --> 00:58:17,190 Eigenlijk denk ik dat dit zelfs geeft ons een hint over PHP functie genaamd bestand. PHP bestand. 638 00:58:17,190 --> 00:58:23,990 Wat dit gaat doen is lezen een volledig bestand in een array. 639 00:58:23,990 --> 00:58:29,770 Je hoeft niet eens nodig om fopen het. Het gaat om dat te doen voor je. 640 00:58:37,450 --> 00:58:43,700 Dus $ lines = file ($ argv [1]); 641 00:58:43,700 --> 00:58:49,680 Nu alle lijnen van het bestand in lijnen. Nu willen we de lijnen te sorteren. 642 00:58:49,680 --> 00:58:52,180 Hoe kunnen we sorteren de lijnen? 643 00:58:52,180 --> 00:58:54,920 We sorteren de lijnen. 644 00:58:54,920 --> 00:58:58,080 En nu kunnen we afdrukken of wat dan ook. 645 00:58:58,080 --> 00:59:05,580 Waarschijnlijk is de makkelijkste manier is foreach ($ lines als $ line) echo $ lijn; 646 00:59:05,580 --> 00:59:10,960 [Student] Zouden we niet eens kruisen lijnen door te verwijzen naar iets in soort? 647 00:59:10,960 --> 00:59:28,850 Dit is waar soort moeten worden gedefinieerd als functie sort (& $ array). 648 00:59:28,850 --> 00:59:32,650 Wanneer u de functie bel je niet doorgeven door verwijzing. 649 00:59:32,650 --> 00:59:36,900 Het is de functie die zij definieert als het nemen van het als referentie. 650 00:59:36,900 --> 00:59:40,900 Dit is eigenlijk precies wat er mis ging 651 00:59:40,900 --> 00:59:46,220 wanneer we alles naar onze servers toen we gingen 5,3 tot 5,4. 652 00:59:46,220 --> 00:59:53,800 Tot 5,4, dit was heel redelijk. 653 00:59:53,800 --> 00:59:58,740 Een functie heeft niet verwachten dat het als referentie, maar u kunt doorgeven als referentie 654 00:59:58,740 --> 01:00:02,860 dus als de functie gebeurt om het te wijzigen, is het nog gewijzigd. 655 01:00:02,860 --> 01:00:05,850 Met ingang van 5,4, je bent niet de bedoeling om dit te doen. 656 01:00:05,850 --> 01:00:11,740 Dus nu de enige manier waarop je voorbij aan de hand is als de functie expliciet doet. 657 01:00:11,740 --> 01:00:19,840 Als u niet wilt dat om het te wijzigen, dan moet je $ copy = $ lijnen en pas kopie doen. 658 01:00:19,840 --> 01:00:24,820 Dus nu lijnen zullen worden bewaard en een kopie zal worden gewijzigd. 659 01:00:27,670 --> 01:00:31,460 php.unique.php. Ik zou kunnen hebben iets gesloopt. 660 01:00:31,460 --> 01:00:33,190 Onverwachte 'soort'. 661 01:00:38,320 --> 01:00:43,850 Er gaat iets dat dit doet voor ons. 662 01:00:43,850 --> 01:00:45,820 Het is er niet eens. 663 01:00:45,820 --> 01:00:52,140 Let op wanneer u de handleiding die het eerste argument wordt verwacht dat een array zijn gelezen 664 01:00:52,140 --> 01:00:56,490 en het is genomen aan de hand. 665 01:00:58,160 --> 01:01:03,540 Waarom is dit klagen bij mij? Want ik heb deze functie soort nog steeds hier, dat ik niet wil. 666 01:01:03,540 --> 01:01:09,210 Oke, php.unique.php. Ik heb het niet door een argument, want ik heb geen bestand. 667 01:01:09,210 --> 01:01:13,560 Het is php.unique.php op test.php. 668 01:01:13,560 --> 01:01:19,080 Hier is test.php alle afgedrukt in een mooi gesorteerde volgorde. 669 01:01:19,080 --> 01:01:24,600 Merk op dat gesorteerde volgorde is een beetje vreemd voor een code-bestand 670 01:01:24,600 --> 01:01:27,460 omdat al onze lege regels zullen eerst komt 671 01:01:27,460 --> 01:01:30,190 dan zullen al onze 1 niveau inkepingen komen 672 01:01:30,190 --> 01:01:33,360 dan komen al onze geen inkepingen. 673 01:01:33,360 --> 01:01:38,620 Ja. >> [Student] Dus voor de broncode werd niet doorgegeven aan de hand? 674 01:01:38,620 --> 01:01:42,240 Is dat over het algemeen als waarde doorgegeven? 675 01:01:42,240 --> 01:01:50,240 [Bowden] Wanneer u een functie noemen, het is nooit bepaalt of het werd doorgegeven door middel van verwijzing. 676 01:01:50,240 --> 01:01:53,960 Het is de functie-definitie die bepaalt of het werd doorgegeven door middel van verwijzing. 677 01:01:53,960 --> 01:01:59,450 En kijken naar de functie-definitie van soort of gewoon op zoek naar deze, 678 01:01:59,450 --> 01:02:02,820 het duurt het argument door middel van verwijzing. 679 01:02:02,820 --> 01:02:07,160 Dus ongeacht of u het wilt om het te nemen door middel van verwijzing, het doet nemen door middel van verwijzing. 680 01:02:07,160 --> 01:02:10,200 Het wijzigt de array om. 681 01:02:10,200 --> 01:02:17,400 Dit is gewoon niet toegestaan. Het is niet toegestaan ​​om dit te doen. >> [Student] Oh, oke. 682 01:02:17,400 --> 01:02:22,410 [Bowden] Dit is soort gaat lijnen te nemen door middel van verwijzing en het te wijzigen. 683 01:02:22,410 --> 01:02:26,850 En nogmaals, als je niet wilt dat om dat te doen, kunt u een kopie maken van soort. 684 01:02:26,850 --> 01:02:35,850 Zelfs in dit geval, exemplaar is niet echt een kopie van lijnen. 685 01:02:35,850 --> 01:02:40,620 Het wijst alleen maar om het zelfde ding tot het voor het eerst wordt gewijzigd, 686 01:02:40,620 --> 01:02:44,430 waar het eerst naar te aangepast in de sorteerfunctie, 687 01:02:44,430 --> 01:02:50,940 waar, omdat het kopiëren bij schrijven nu een kopie van exemplaar zal worden. 688 01:02:57,500 --> 01:03:04,250 U kunt dit ook doen. Dat is de andere plek waar je kunt zien ampersand. 689 01:03:04,250 --> 01:03:07,190 Je ziet het in foreach loops, zie je het in functie verklaringen, 690 01:03:07,190 --> 01:03:10,040 en je ziet het als gewoon toewijzen van variabelen. 691 01:03:10,040 --> 01:03:12,350 Nu hebben we bereikt niets door dit te doen 692 01:03:12,350 --> 01:03:15,600 omdat kopiëren en lijnen zijn letterlijk hetzelfde. 693 01:03:15,600 --> 01:03:19,940 U kunt gebruik maken van lijnen en kopiëren door elkaar. 694 01:03:19,940 --> 01:03:25,430 U kunt dit doen unset ($ kopie), en dat niet uitgeschakeld lijnen, 695 01:03:25,430 --> 01:03:29,120 je gewoon verliest uw verwijzing naar het zelfde ding. 696 01:03:29,120 --> 01:03:33,440 Dus vanaf dit punt, nu lijnen is de enige manier u toegang tot lijnen. 697 01:03:36,450 --> 01:03:38,770 >> Vragen? 698 01:03:41,000 --> 01:03:42,460 Ja. 699 01:03:42,460 --> 01:03:45,880 [Student] Volledig off topic, maar je hoeft niet te PHP te sluiten met de - >> Dat doe je niet. 700 01:03:45,880 --> 01:03:47,730 Oke. 701 01:03:47,730 --> 01:03:53,790 [Bowden] Ik zou zo ver gaan als te zeggen dat het een slechte gewoonte om ze te sluiten. 702 01:03:53,790 --> 01:03:57,580 Dat is waarschijnlijk een overdrijving, vooral in een script, 703 01:03:57,580 --> 01:04:03,740 maar laten we eens kijken wat er gebeurt als ik dit doe. 704 01:04:03,740 --> 01:04:08,890 Dat deed niets. Wat als ik wilde - [zucht] 705 01:04:13,870 --> 01:04:16,960 Ik moet een argument passeren. 706 01:04:19,000 --> 01:04:22,050 Maak de opname. Ik noemde het verkeerd. 707 01:04:24,340 --> 01:04:28,310 Dus php.unique.php met een argument. 708 01:04:28,310 --> 01:04:30,980 Nu heb ik niet eens nodig. 709 01:04:34,520 --> 01:04:37,740 Ik zal het doorgeven van een geldig argument. 710 01:04:37,740 --> 01:04:42,050 Deze gedrukt wat het ook is afgedrukt. 711 01:04:45,260 --> 01:04:50,080 Ik ben printen kopiëren en kopiëren bestaat niet. De lijnen. 712 01:04:53,650 --> 01:04:58,270 Het gedrukte alles, en dan merk al die rommel hier beneden, 713 01:04:58,270 --> 01:05:06,690 omdat in PHP alles wat zich buiten PHP tags 714 01:05:06,690 --> 01:05:09,520 is gewoon te letterlijk worden afgedrukt. 715 01:05:09,520 --> 01:05:18,050 Daarom HTML, het is zo leuk dat ik kan doen div bla, bla, bla klasse of wat dan ook, 716 01:05:18,050 --> 01:05:25,140 bla, bla, bla en vervolgens doen wat PHP-code en doe dan het einde div. 717 01:05:25,140 --> 01:05:36,460 En nu het afdrukken van dit krijg ik mijn mooie div tot boven, alles wat PHP gedrukt, div onderaan. 718 01:05:36,460 --> 01:05:43,510 Rampzalig als zoiets gebeurt, dat is vrij normaal, 719 01:05:43,510 --> 01:05:47,930 gewoon een verdwaalde nieuwe regel aan de onderkant van het bestand. 720 01:05:47,930 --> 01:05:50,940 Je zou niet denken dat het zou kunnen zijn dat groot van een deal 721 01:05:50,940 --> 01:05:58,660 totdat je bedenkt dat met browsers - 722 01:05:58,660 --> 01:06:03,880 >> Hoe doorverwijzingen werk of eigenlijk elke headers werk, 723 01:06:03,880 --> 01:06:07,980 wanneer u uw verbinding met een website en stuurt het terug al deze headers en dingen die er 724 01:06:07,980 --> 01:06:12,020 achtige respons 200 of reactie sturen of wat dan ook, 725 01:06:12,020 --> 01:06:18,230 headers zijn slechts geldig tot en met de eerste byte van gegevens worden verzonden. 726 01:06:18,230 --> 01:06:23,140 Worden doorgeleid duizenden keren, maar zodra de eerste byte van data verzonden 727 01:06:23,140 --> 01:06:26,120 je bent niet de bedoeling om opnieuw te sturen. 728 01:06:26,120 --> 01:06:31,860 >> Als u een verdwaalde newline onderaan een bestand 729 01:06:31,860 --> 01:06:37,260 en laten we zeggen dat u deze functie gebruikt en dan wil je - 730 01:06:41,580 --> 01:06:52,870 Laten we zeggen dat het een ander bestand dat is index.php en je require_once iets - 731 01:06:52,870 --> 01:06:56,920 Ik kan niet denken aan een goed voorbeeld van. 732 01:06:56,920 --> 01:07:04,740 Het probleem gebeurt wanneer deze lijn aan de onderkant wordt herhaald. 733 01:07:04,740 --> 01:07:08,660 Je wilt niet iets om nog zijn herhaald. 734 01:07:10,820 --> 01:07:15,700 Ook al heb je niet van plan was op iets krijgen echo, is er iets te krijgen echo 735 01:07:15,700 --> 01:07:17,990 en dus nu ben je niet de bedoeling om nog meer headers te versturen 736 01:07:17,990 --> 01:07:20,030 en je gaat om klachten te krijgen. 737 01:07:22,170 --> 01:07:24,420 Je gewoon niet hebben die sluiten tags. 738 01:07:24,420 --> 01:07:27,420 Als u van plan bent om iets te doen met HTML - 739 01:07:27,420 --> 01:07:30,490 en het is heel redelijk te doen hier beneden div wat 740 01:07:30,490 --> 01:07:39,450 en dan op dit punt kun je of je kunt ze niet op. 741 01:07:39,450 --> 01:07:41,590 Het maakt eigenlijk niet uit. 742 01:07:41,590 --> 01:07:45,450 Maar in PHP scripts is het zeldzaam om te sluiten. 743 01:07:45,450 --> 01:07:50,400 Als alles is PHP, absoluut alles, 744 01:07:50,400 --> 01:07:55,460 je niet echt nodig hebt om te sluiten / moet je niet sluiten. 745 01:08:02,030 --> 01:08:05,720 >> Omgaan met strijkers is nog veel leuker dan in C. 746 01:08:05,720 --> 01:08:09,470 In PHP kunt u een string met enkele of dubbele aanhalingstekens. 747 01:08:09,470 --> 01:08:12,820 Met enkele aanhalingstekens kunt u geen gebruik maken van "escape"-sequenties. 748 01:08:12,820 --> 01:08:17,640 Voortdurend ontsnappen, blah, blah, blah. 749 01:08:19,920 --> 01:08:24,010 Dus printf is zeer zeldzaam in PHP. 750 01:08:24,010 --> 01:08:32,290 Ik denk dat ik zou printf gebruiken als ik wilde een soort dingen te doen - in PSET 5 u gebruikt sprintf of wat dan ook. 751 01:08:32,290 --> 01:08:36,060 Maar u wilt 001.jpg 002.jpg en doen. 752 01:08:36,060 --> 01:08:40,300 Dus voor dat soort dingen waar ik eigenlijk de tekst wilt zou ik printf gebruik te formatteren. 753 01:08:40,300 --> 01:08:44,689 Maar anders zou ik gewoon gebruik maken van het aaneenschakelen van tekenreeksen. 754 01:08:44,689 --> 01:08:47,000 Ik heb nooit echt printf te gebruiken. 755 01:08:49,229 --> 01:09:00,170 We zijn net differentiatie van de gegevens tussen enkele aanhalingstekens en dubbele aanhalingstekens. 756 01:09:00,170 --> 01:09:07,490 Het grootste verschil is dat enkele aanhalingstekens, het zal letterlijk worden afgedrukt. 757 01:09:07,490 --> 01:09:15,390 Er is geen char gegevenstype in PHP anders dan C, dus gelijkwaardig is aan deze. 758 01:09:15,390 --> 01:09:17,970 Ze zijn allebei snaren. 759 01:09:17,970 --> 01:09:29,180 En het mooie van een enkel aanhalingsteken strings is dat ik kon zeggen 'hello world!' bla, bla, bla, 760 01:09:29,180 --> 01:09:33,340 $ $ Wooo. 761 01:09:33,340 --> 01:09:38,260 Wat gebeurt er als ik print deze is het zal het letterlijk af te drukken. 762 01:09:38,260 --> 01:09:40,680 Laten zich te ontdoen van al onze spullen. 763 01:09:40,680 --> 01:09:44,700 Dus echo $ str1; 764 01:09:48,569 --> 01:09:56,570 Het letterlijk afgedrukt al die dingen: dollartekens, 765 01:09:56,570 --> 01:09:58,770 backslash n, dat je zou denken zou zijn newlines - 766 01:09:58,770 --> 01:10:01,500 al die dingen het afdrukken letterlijk. 767 01:10:01,500 --> 01:10:05,650 Het enige wat je nodig hebt om te ontsnappen zijn enkele aanhalingstekens 768 01:10:05,650 --> 01:10:09,470 want anders zou denken dat het de enkele aanhalingstekens sluiten. 769 01:10:09,470 --> 01:10:15,050 Dubbele aanhalingstekens, heel anders. 770 01:10:20,300 --> 01:10:25,870 We hebben al zien de syntax highlighting is cluing ons op om wat over te gaan vreselijk mis. 771 01:10:25,870 --> 01:10:36,190 php.unique. Undefined variable: wooo, omdat dit wordt geïnterpreteerd als een variabele genaamd wooo. 772 01:10:36,190 --> 01:10:42,400 Dubbele aanhalingstekens kunt u variabelen in te voegen in - 773 01:10:42,400 --> 01:10:52,730 Laten we zeggen $ naam = "Rob"; 774 01:10:52,730 --> 01:10:58,020 Dus echo "Hallo, mijn naam is $ naam!"; 775 01:10:58,020 --> 01:11:09,260 Het herkent dit als een variabele. 776 01:11:09,260 --> 01:11:21,210 Toen ik die draaien - en ik zal plaatst u een nieuwe regel - Hallo, mijn naam is Rob! en hello world! 777 01:11:21,210 --> 01:11:24,910 Dit komt omdat ik nooit verwijderd het afdrukken van wooo hierboven. 778 01:11:24,910 --> 01:11:30,020 Er is 1 stap verder je kunt doen. 779 01:11:30,020 --> 01:11:39,250 $ Array = [1, 2, 3]; 780 01:11:39,250 --> 01:11:43,270 Wat als ik wil de eerste index van de array af te drukken? 781 01:11:43,270 --> 01:11:45,150 Je doet $ array [0]. 782 01:11:45,150 --> 01:11:49,280 De syntax highlighting is een aanwijzing. Wat gaat dit doen? 783 01:11:52,320 --> 01:11:54,510 php.unique. 784 01:11:54,510 --> 01:11:59,860 Hallo, mijn naam is 1! dat is niet wat ik wilde. 785 01:11:59,860 --> 01:12:05,050 Syntax highlighting tegen me gelogen. 786 01:12:05,050 --> 01:12:13,020 Laten we proberen 'een' -> 1, 'b' -> 2. 787 01:12:18,450 --> 01:12:21,440 Dat is hoe ik zou moeten schrijven. 788 01:12:26,350 --> 01:12:32,160 Onverwachte enkele aanhalingstekens (T_ENCAPSED bla, bla, bla, bla, bla). 789 01:12:32,160 --> 01:12:41,780 Het idee is dat het niet dit herkennen als onderdeel van de array. 790 01:12:41,780 --> 01:12:46,620 Het is niet het herkennen dit als array geïndexeerd per brief een. 791 01:12:46,620 --> 01:12:49,870 U wilt dat wordt omgeven door accolades te doen, 792 01:12:49,870 --> 01:12:54,730 en nu wat er in deze accolade worden geïnterpoleerd, 793 01:12:54,730 --> 01:13:00,340 dat is het woord dat we gebruiken voor magische wijze het invoegen van deze variabelen in de juiste plaatsen. 794 01:13:00,340 --> 01:13:04,280 Nu om dit te doen, php.unique, en Hi, mijn naam is 1! zoals verwacht 795 01:13:04,280 --> 01:13:07,720 of Hi, mijn naam is Rob! 796 01:13:14,110 --> 01:13:23,130 Een ding dat is een soort van mooi over enkele aanhalingstekens is dat - 797 01:13:23,130 --> 01:13:28,480 Er is wat kosten voor het interpoleren. 798 01:13:30,520 --> 01:13:35,100 Als u dubbele aanhalingstekens, de tolk moet gaan over deze string, 799 01:13:35,100 --> 01:13:41,500 ervoor te zorgen dat: "O, hier is een variabele. Nu moet ik gaan die variabele te krijgen en hier in te vullen." 800 01:13:41,500 --> 01:13:48,930 Zelfs als u geen gebruik van variabelen, 801 01:13:48,930 --> 01:13:52,220 niets binnenkant van deze dubbele aanhalingstekens moet worden geïnterpoleerd, 802 01:13:52,220 --> 01:13:56,800 maar het zal nog langzamer zijn, want het moet gaan over de dubbele aanhalingstekens 803 01:13:56,800 --> 01:14:00,130 op zoek naar dingen die moeten worden geïnterpoleerd. 804 01:14:00,130 --> 01:14:05,360 Dus enkele aanhalingstekens kan een beetje sneller als er niets moet worden geïnterpoleerd, 805 01:14:05,360 --> 01:14:15,650 en ik de neiging om zelfs enkele aanhalingstekens te gebruiken voor, 'Hallo, mijn naam is'. $ Array ['a'] toch. 806 01:14:15,650 --> 01:14:20,430 Dat zal gelijk zijn aan wat we hebben gehad. 807 01:14:24,840 --> 01:14:28,440 Maar het is een kwestie van voorkeur. 808 01:14:28,440 --> 01:14:34,750 Als u PHP, heb je waarschijnlijk niet de zorg over het verschil in snelheid. 809 01:14:34,750 --> 01:14:39,480 Er is niet genoeg om ze beredeneren te beginnen. 810 01:14:39,480 --> 01:14:43,030 >> Nog een laatste vraag? 811 01:14:47,430 --> 01:14:51,710 >> We eigenlijk niet eens door dit alles heen, maar dit spul was saai. 812 01:14:51,710 --> 01:14:59,080 Het laatste wat wel leuk is in PHP is wanneer je te maken hebt met HTML, 813 01:14:59,080 --> 01:15:06,450 je zult gebruiken het een beetje, zodat de mooie snelkoppeling syntaxis voor het afdrukken van een variabele. 814 01:15:32,400 --> 01:15:36,730 Zonder dat PHP hier, dit heet korte tags. 815 01:15:36,730 --> 01:15:44,330 Officieel vanaf PHP 5.4 wordt dit afgeraden. 816 01:15:44,330 --> 01:15:48,640 Wij raden u aan php te zetten. 817 01:15:48,640 --> 01:15:55,770 Dit wordt nog wel ondersteund, zo kort tags met de 01:16:02,480 Het is door ondersteunde standaard, dus u kunt deze gebruiken als je wilt, en ze zijn erg handig. 819 01:16:02,480 --> 01:16:05,700 >> Nog vragen? 820 01:16:07,780 --> 01:16:09,270 Oke. 821 01:16:10,840 --> 01:16:13,800 >> Blijf classy, ​​San Diego. 822 01:16:13,800 --> 01:16:16,070 [Grinnikt] 823 01:16:18,620 --> 01:16:22,660 Bye. [Lacht] 824 01:16:24,350 --> 01:16:28,470 [Applaus] [lacht] 825 01:22:46,460 --> 01:22:49,460 >> [CS50.TV]