1 00:00:00,000 --> 00:00:02,610 [Powered by Google Translate] [§ 8 - Více Pohodlné] 2 00:00:02,610 --> 00:00:04,910 [Rob Bowden - Harvard University] 3 00:00:04,910 --> 00:00:07,070 [To je CS50. - CS50.TV] 4 00:00:11,520 --> 00:00:14,160 >> Tyto poznámky týden sekce se bude pěkně krátká, 5 00:00:14,160 --> 00:00:19,070 tak jsem jen tak pořád mluvit, vy se chystáte udržet ptát, 6 00:00:19,070 --> 00:00:22,720 a my se pokusíme naplnit tolik času, jak je to možné. 7 00:00:22,720 --> 00:00:31,950 Spousta lidí si myslí, že to Pset není nutně obtížné, ale je to velmi dlouho. 8 00:00:31,950 --> 00:00:37,070 Pset spec sám vezme hodinu číst. 9 00:00:40,530 --> 00:00:45,730 Dáme vám hodně o SQL, co by mohl potřebovat. 10 00:00:45,730 --> 00:00:50,520 My vás provede mnoha, takže by to nemělo být tak zlé. 11 00:00:50,520 --> 00:00:54,560 Má někdo začal nebo skončil? 12 00:00:55,380 --> 00:00:59,710 Je to poslední Pset. Ach, můj Bože. 13 00:00:59,710 --> 00:01:05,400 Obvykle je tu JavaScript jeden po tomto, ale věci kalendářní změna 14 00:01:05,400 --> 00:01:09,560 dělá vše 1 týden kratší, a my už mají PSet JavaScript. 15 00:01:09,560 --> 00:01:12,310 Nevím, jak to ovlivní, zda JavaScript bude zobrazovat na zkoušku 16 00:01:12,310 --> 00:01:15,510 nebo Kvíz 1. 17 00:01:15,510 --> 00:01:22,260 Dovedu si představit, že to bude něco jako, co potřebujete vědět věci vysoké úrovně o JavaScriptu, 18 00:01:22,260 --> 00:01:26,460 ale pochybuju, že bychom jen vám rovnou kód JavaScript 19 00:01:26,460 --> 00:01:28,720 protože jste neměli PSet v něm. 20 00:01:28,720 --> 00:01:33,000 Ale to bude věc k přezkoumání kvíz příští týden. 21 00:01:33,000 --> 00:01:36,320 >> Sekce otázek. 22 00:01:36,320 --> 00:01:43,870 Mnoho z těchto věcí je poněkud špatně formulováno, ale budeme diskutovat, proč. 23 00:01:43,870 --> 00:01:50,220 Na rozdíl od C, PHP je "dynamicky napsaný" jazyk. Co to znamená, ptáte se? 24 00:01:50,220 --> 00:01:53,830 No, rozloučit se všemi z těch char, float, int, a další klíčová slova budete muset použít 25 00:01:53,830 --> 00:01:56,190 při deklarování proměnné a funkce v C. 26 00:01:56,190 --> 00:02:00,420 V PHP, je proměnná je typu určena hodnotou, že je to v současné době drží. 27 00:02:00,420 --> 00:02:04,990 Takže než jsme zadejte tento kód do souboru s názvem dynamic.php, 28 00:02:04,990 --> 00:02:12,670 PHP je dynamicky zadali. To je pravda. 29 00:02:12,670 --> 00:02:17,590 Nesouhlasím s tím, že to znamená, že jsme se rozloučí s char, float, int, 30 00:02:17,590 --> 00:02:20,620 a další klíčová slova. 31 00:02:20,620 --> 00:02:25,510 Přesný rozdíl mezi dynamicky napsaný a podpůrně, 32 00:02:25,510 --> 00:02:32,010 která je staticky napsaný, je to, že dynamicky napsaný, všechny vaše kontrolu typu a tak 33 00:02:32,010 --> 00:02:37,350 se děje v běhu, zatímco staticky zadali to stane v době kompilace. 34 00:02:37,350 --> 00:02:43,030 Slovo statický obecně se zdá, mysli věci kompilaci. 35 00:02:43,030 --> 00:02:48,170 Myslím, že existují i ​​jiné využití pro něj, ale v C, když prohlásí, statickou proměnnou, 36 00:02:48,170 --> 00:02:52,650 jeho skladování je přiděleno v době kompilace. 37 00:02:52,650 --> 00:02:59,260 Zde, dynamicky napsaný jen znamená, že - 38 00:02:59,260 --> 00:03:04,350 V jazyce C, pokud se pokusíte přidat řetězec a celé číslo, když jej zkompilovat 39 00:03:04,350 --> 00:03:11,000 to bude stěžovat, protože to bude říkat, že nemůžete přidat int a ukazatel. 40 00:03:11,000 --> 00:03:14,710 To prostě není platná operace. 41 00:03:14,710 --> 00:03:21,170 To je další věc, která se dostaneme do druhého. 42 00:03:21,170 --> 00:03:24,860 Ale to druh kontroly, skutečnost, že si stěžuje, v době kompilace, 43 00:03:24,860 --> 00:03:29,220 je statická kontrola typu. 44 00:03:29,220 --> 00:03:35,220 Tam jsou jazyky, kde nepotřebujete říkat char, float, int, a všechny ty věci, 45 00:03:35,220 --> 00:03:40,940 ale jazyk může říct, z kontextu věci, jaký typ to má být, 46 00:03:40,940 --> 00:03:43,980 ale je to stále staticky zadali. 47 00:03:43,980 --> 00:03:49,000 Takže pokud budete mít 51, OCaml, už nikdy nebudete muset použít některý z těchto typů, 48 00:03:49,000 --> 00:03:58,700 ale to ještě bude v době kompilace říct, že nemůžete udělat, protože jste míchání int a řetězec. 49 00:03:58,700 --> 00:04:05,650 Dynamicky napsaný jen znamená, že někdy během běhu budete si stížnost. 50 00:04:05,650 --> 00:04:13,430 Pokud se také používá Java předtím, obecně, téměř všechny C-typ jazyka 51 00:04:13,430 --> 00:04:20,070 se bude staticky napsaný, tak C, C + +, Java, všechny z nich jsou obecně staticky zadali. 52 00:04:20,070 --> 00:04:22,910 V Javě při kompilaci něco a vy říkáte, 53 00:04:22,910 --> 00:04:26,670 string s se rovná nové něco, co není řetězec, 54 00:04:26,670 --> 00:04:28,950 že se to stěžovat, protože tyto typy prostě neodpovídají. 55 00:04:28,950 --> 00:04:31,180 To bude stěžovat v době kompilace. 56 00:04:31,180 --> 00:04:36,750 Ale také to má nějaký dynamický čas věci líbí, pokud se pokusíte přetypovat něco 57 00:04:36,750 --> 00:04:40,500 k typu, který je konkrétnější než jeho běžného typu, 58 00:04:40,500 --> 00:04:45,610 nic to může dělat v době kompilace, aby zkontrolovat, zda obsazení je uspět. 59 00:04:45,610 --> 00:04:51,130 Java má také nějaký dynamický typ kontroly, že jakmile se dostane k této přímce kódu 60 00:04:51,130 --> 00:04:54,130 když je to vlastně realizovat, bude to dělat obsazení, 61 00:04:54,130 --> 00:04:56,260 zda že obsazení bylo platné v první řadě, 62 00:04:56,260 --> 00:04:59,890 a pokud to nebylo, pak to bude si stěžovat, že máte neplatný typ. 63 00:04:59,890 --> 00:05:03,200 Dynamický typ kontroly. 64 00:05:03,200 --> 00:05:07,010 Napište toto do souboru s názvem dynamic.php. 65 00:05:10,130 --> 00:05:12,380 Dynamic.php. 66 00:05:14,580 --> 00:05:17,190 Budu unzip, že formátování. 67 00:05:18,750 --> 00:05:21,880 Máme proměnnou, musíme nastavit tak, aby celé číslo 7, 68 00:05:21,880 --> 00:05:27,930 pak budeme tisknout a% s - 69 00:05:27,930 --> 00:05:32,830 Oh, my tisku typ, takže GetType bude vrátit typ proměnné. 70 00:05:32,830 --> 00:05:35,720 Jsme jen tiskem typ znovu a znovu. 71 00:05:35,720 --> 00:05:39,440 Právě jsme php.dynamic.php. 72 00:05:39,440 --> 00:05:45,920 Uvidíme, že se změní z integer na řetězec do Booleovské hodnoty, jak jsme projít. 73 00:05:45,920 --> 00:05:54,590 V C není Datový typ Boolean, není datový typ řetězec. 74 00:05:54,590 --> 00:06:00,500 Tam je char * a Boolean jen bývá int nebo char, nebo tak něco. 75 00:06:00,500 --> 00:06:05,690 V PHP tyto typy existují, a to je jeden z velkých výhod PHP nad C - 76 00:06:05,690 --> 00:06:13,290 že řetězec operace jsou nesrovnatelně jednodušší v PHP než C. Jsou prostě fungovat. 77 00:06:13,290 --> 00:06:18,290 >> Tak jsme se vrátili sem. 78 00:06:18,290 --> 00:06:21,260 Běželi jsme dynamic.php. 79 00:06:21,260 --> 00:06:26,710 Toto říká PHP interpret, s názvem php, spustit PHP kód v dynamic.php. 80 00:06:26,710 --> 00:06:30,250 Máte-li nějaké chyby v souboru, bude tlumočník říct! 81 00:06:30,250 --> 00:06:39,110 Interpret, to je další velký rozdíl mezi PHP a C. 82 00:06:39,110 --> 00:06:48,200 V C budete muset kompilovat něco a pak spustit tento zkompilovaný soubor. 83 00:06:48,200 --> 00:06:50,490 V PHP nikdy cokoli kompilovat. 84 00:06:50,490 --> 00:06:57,200 Takže interpret PHP je v podstatě jen čtete tento řádek po řádku. 85 00:06:57,200 --> 00:07:02,900 Dává var = 7, pak se dotkne printf pak narazí var pak narazí printf a tak dále. 86 00:07:02,900 --> 00:07:10,910 Tam je trochu sestavování se tak stane, a to ukládá výsledky 87 00:07:10,910 --> 00:07:15,510 takže pokud spustíte skript později si můžete udělat nějaké, 88 00:07:15,510 --> 00:07:19,280 ale v podstatě je to řádek po řádku tyhle věci. 89 00:07:19,280 --> 00:07:25,280 To znamená, že spousta optimalizací, které dostaneme v C, 90 00:07:25,280 --> 00:07:31,920 jako kompilace, je to jen obecně, že kompilátor může udělat spoustu triků pro vás. 91 00:07:31,920 --> 00:07:36,110 To může uzavřít nepoužívané proměnné, může provádět všechny tyto druhy věcí, 92 00:07:36,110 --> 00:07:38,660 to může dělat rekurze ocasu. 93 00:07:38,660 --> 00:07:42,550 V PHP nejste dostane tuto výhodu 94 00:07:42,550 --> 00:07:45,690 protože je to jen tak, kdo provádění řádek po řádku po řádku, 95 00:07:45,690 --> 00:07:49,950 a to opravdu není rozpoznat tyto věci tak snadno 96 00:07:49,950 --> 00:07:54,440 protože to není 1 big compilation průchod přes věc a pak provedení; 97 00:07:54,440 --> 00:07:56,860 je to jen řádek po řádku. 98 00:08:00,730 --> 00:08:02,750 Tak to je interpret. 99 00:08:02,750 --> 00:08:06,840 >> Zpět k našemu dynamickému typování: docela v pohodě, ne? 100 00:08:06,840 --> 00:08:08,640 Ty určitě by to dělat v C! 101 00:08:08,640 --> 00:08:11,860 Nyní, uvidíme, jestli můžete přijít na typ každého z následujících hodnot. 102 00:08:11,860 --> 00:08:14,760 Viz tento pro referenční. 103 00:08:14,760 --> 00:08:19,420 Tak 3,50. Jaký typ si myslíte, že to bude? 104 00:08:24,480 --> 00:08:26,370 Zde jsou typy, které máme. 105 00:08:26,370 --> 00:08:30,430 Máme bools, celá čísla, plovoucí body, struny, pole, objekty, 106 00:08:30,430 --> 00:08:38,370 a pak se zdroje, který je tak trochu nejasná. 107 00:08:38,370 --> 00:08:41,010 Myslím, že je to vlastně příklad. 108 00:08:41,010 --> 00:08:43,740 Pak je tu NULL. NULL je zvláštní typ. 109 00:08:43,740 --> 00:08:47,140 Na rozdíl od C, kde NULL je jen ukazatel s adresou 0, 110 00:08:47,140 --> 00:08:54,930 v PHP, NULL, je jeho vlastní typ, kde platí pouze věc tohoto typu je NULL. 111 00:08:57,560 --> 00:09:00,670 To je mnohem užitečnější pro kontrolu chyb. 112 00:09:00,670 --> 00:09:04,310 V C, kde jsme měli tento problém, kde, pokud se vrátíte NULL, 113 00:09:04,310 --> 00:09:08,660 znamená to, že jste vrací ukazatel NULL nebo pomocí NULL znamenat chybu 114 00:09:08,660 --> 00:09:12,380 nebo všechny z toho zmatku jsme v jednom bodě. 115 00:09:12,380 --> 00:09:18,440 Zde, vrací NULL obecně znamená chybu. 116 00:09:20,860 --> 00:09:27,300 Spousta věcí se také vrátit false pro chybu. 117 00:09:27,300 --> 00:09:33,140 Ale bod je NULL typ, jediná věc, na NULL typu je NULL. 118 00:09:33,140 --> 00:09:40,090 Pak callback je jako můžete definovat některé anonymní funkce. 119 00:09:40,090 --> 00:09:46,420 Nemusíte dávat Tato funkce jméno, ale nebudete muset vypořádat s to tady. 120 00:09:46,420 --> 00:09:53,940 Při pohledu na jednotlivé typy, které se očekávají, abychom věděli, 121 00:09:53,940 --> 00:09:59,000 Co si myslíte, že typ 3,50 je? >> [Student] Float. 122 00:09:59,000 --> 00:10:00,370 Jo. 123 00:10:00,370 --> 00:10:06,290 Takže tady, co si myslíte, že typ to je? >> [Student] Array. 124 00:10:06,290 --> 00:10:09,890 Jo. První z nich byl plovák, druhý je pole. 125 00:10:09,890 --> 00:10:14,500 Povšimněte si, že toto pole není jako pole C 126 00:10:14,500 --> 00:10:19,610 kde máte index 0 má nějakou hodnotu, index 1 má nějakou hodnotu. 127 00:10:19,610 --> 00:10:26,320 Zde jsou indexy jsou a, b, c, a hodnoty jsou 1, 2, a 3. 128 00:10:26,320 --> 00:10:33,980 V PHP není žádný rozdíl mezi asociativním poli a jen pravidelné matici 129 00:10:33,980 --> 00:10:36,740 jak byste si mohli myslet na to v C. 130 00:10:36,740 --> 00:10:43,040 Tam je jen to, a pod kapotou pravidelný pole je jen asociativní pole 131 00:10:43,040 --> 00:10:50,000 kde 0 mapy do určité hodnoty stejným způsobem, jakým se mapuje na nějakou hodnotu. 132 00:10:50,000 --> 00:11:00,410 Z tohoto důvodu, může PHP být dost špatné pro rychlé rychlý kód / benchmarking věcí 133 00:11:00,410 --> 00:11:07,930 protože v C, když používáte pole víte, že přístup členem je konstantní čas. 134 00:11:07,930 --> 00:11:11,860 V PHP přístup člena je, kdo ví, kolik času? 135 00:11:11,860 --> 00:11:18,970 Je to pravděpodobně konstantní, pokud to hash správně. 136 00:11:18,970 --> 00:11:21,620 Kdo ví, co je to opravdu dělá pod pokličku? 137 00:11:21,620 --> 00:11:25,600 Vy opravdu potřebujete se podívat na provádění vidět, jak to bude s tím vypořádat. 138 00:11:25,600 --> 00:11:28,550 Takže fopen. 139 00:11:28,550 --> 00:11:36,420 Myslím, že tady řekněme PHP manuál fopen podívat se na návratový typ. 140 00:11:36,420 --> 00:11:41,260 Vidíme zde můžete vyhledat prakticky jakoukoli funkci v PHP manuálu 141 00:11:41,260 --> 00:11:47,540 a to je něco jako manuálové stránky PHP. 142 00:11:47,540 --> 00:11:51,060 Návratový typ bude zdrojem. 143 00:11:51,060 --> 00:11:56,050 To je důvod, proč jsem si to, protože jsme se opravdu definovat zdroj. 144 00:11:56,050 --> 00:12:04,110 Myšlenka zdroje, v C tak nějak dostal FILE * nebo cokoliv; 145 00:12:04,110 --> 00:12:07,200 v PHP zdroj je vaše FILE *. 146 00:12:07,200 --> 00:12:10,360 To je to, co budete se číst z, to je to, co budete k zápisu do. 147 00:12:10,360 --> 00:12:20,710 Je to obvykle externí, takže je to zdroj, který můžete vytáhnout věci z a házet věci. 148 00:12:20,710 --> 00:12:26,520 A konečně, co je typ NULL? >> [Student] NULL. 149 00:12:26,520 --> 00:12:30,650 Jo. Takže jediná věc, která je NULL NULL. 150 00:12:30,650 --> 00:12:33,480 NULL je NULL. 151 00:12:35,490 --> 00:12:41,170 >> Jedním z rysů systému typu PHP (pro lepší nebo horší), je jeho schopnost žonglovat typů. 152 00:12:41,170 --> 00:12:44,390 Když napíšete řádek kódu PHP, který kombinuje hodnoty různých typů, 153 00:12:44,390 --> 00:12:46,670 PHP se bude snažit udělat rozumnou věc. 154 00:12:46,670 --> 00:12:48,920 Vyzkoušejte každé z následujících řádků kódu PHP. Co vytisknout? 155 00:12:48,920 --> 00:12:51,000 Je to, co jste očekávali? Proč ano nebo proč ne? 156 00:12:51,000 --> 00:12:58,600 Tato skutečnost o PHP je to, co dělá to, co nazýváme slabě napsané. 157 00:12:58,600 --> 00:13:04,610 Slabě napsaný a silně zadali, 158 00:13:04,610 --> 00:13:06,840 existují různé způsoby využití těchto pojmů, 159 00:13:06,840 --> 00:13:12,020 ale většina lidí používá slabě napsaný a silně zadali znamenat něco takového 160 00:13:12,020 --> 00:13:15,920 kde ("1" + 2), že pracuje. 161 00:13:15,920 --> 00:13:18,290 V jazyce C, která nebude fungovat. 162 00:13:18,290 --> 00:13:22,490 Můžete si to představit nefunguje. 163 00:13:22,490 --> 00:13:29,200 Spousta lidí mix dynamické psaní a slabou zadáním a statické psaní a silné psaní. 164 00:13:29,200 --> 00:13:34,050 Python je dalším příkladem jazyka, který je dynamicky zadali. 165 00:13:34,050 --> 00:13:41,770 Můžete házet kolem typy proměnných, a to bude rozhodovat v běhu 166 00:13:41,770 --> 00:13:44,680 nějaké chybové checkings. 167 00:13:44,680 --> 00:13:50,740 V Pythonu to jde spustit to a uvidíte ("1" + 2); 168 00:13:50,740 --> 00:13:55,920 a to se nezdaří, protože říká, že nemůžete přidat string a integer. 169 00:13:55,920 --> 00:14:00,860 V PHP, který je stejně jako dynamicky napsaný, že to nebude nezdaří. 170 00:14:00,860 --> 00:14:04,220 Slabá psaní má co do činění s tím, že to dělá věci s typy 171 00:14:04,220 --> 00:14:07,800 které nejsou opravdu smysl nutně. 172 00:14:07,800 --> 00:14:17,420 So ("1" + 2), umím si představit, že je řetězec 12, dovedu si představit, že je řetězec 3, 173 00:14:17,420 --> 00:14:20,710 Dokážu si představit, že je celé číslo 3. 174 00:14:20,710 --> 00:14:24,530 To není nutně dobře definované, a my pravděpodobně bude k vidění 175 00:14:24,530 --> 00:14:29,140 že když jsme tisku ("1" + 2), je to asi skončí jako bytí odlišné 176 00:14:29,140 --> 00:14:32,320 než tisk (1 + "2"). 177 00:14:32,320 --> 00:14:39,700 A to bývá, podle mého názoru, k horšímu. 178 00:14:39,700 --> 00:14:44,240 Zde se můžeme pokusit tyto. 179 00:14:44,240 --> 00:14:48,740 Další malý trik o PHP je nemusíte skutečně zapisovat do souboru. 180 00:14:48,740 --> 00:14:52,790 To se spustit tento příkaz režimu. 181 00:14:52,790 --> 00:14:57,710 Takže php-r, pak můžeme hodit do příkazu zde: 182 00:14:57,710 --> 00:15:06,610 "Print ('1 '+ 2)," a já ti hodit nový řádek. 183 00:15:19,550 --> 00:15:23,970 Tato tištěná 3. 184 00:15:31,100 --> 00:15:35,330 Vypadá to, že vytiskne 3 a je to číslo 3. 185 00:15:35,330 --> 00:15:38,420 Takže teď si to zkusíme obráceně: 186 00:15:38,420 --> 00:15:42,970 "Print (1 + '2 '); 187 00:15:45,560 --> 00:15:50,490 Dostaneme 3, a je to také bude celé číslo 3? Upřímně netuším. 188 00:15:50,490 --> 00:15:54,030 Vypadá to, že je v souladu. 189 00:15:54,030 --> 00:15:59,550 Tam je nikdy žádné šance, že je řetězec 12 nebo něco podobného, ​​že 190 00:15:59,550 --> 00:16:08,080 protože PHP, JavaScript a na rozdíl od Java příliš, 191 00:16:08,080 --> 00:16:11,670 má samostatný operátor pro zřetězení. 192 00:16:11,670 --> 00:16:14,930 Spojování v PHP je dot. 193 00:16:14,930 --> 00:16:22,950 Takže tisk (1 '2 '.), Bude nám 12. 194 00:16:25,790 --> 00:16:32,420 To obvykle vede k záměně, kde se lidé snaží udělat něco jako str + = 195 00:16:32,420 --> 00:16:37,840 nějaká jiná věc, že ​​chtějí přidat na konec svého řetězce, a že se to nezdaří. 196 00:16:37,840 --> 00:16:40,770 Musíte udělat str. = 197 00:16:42,000 --> 00:16:46,240 Tak nezapomeňte zřetězení v PHP je tečka. 198 00:16:46,240 --> 00:16:52,100 Ostatní věci zkusit: print ("CS" + 50); 199 00:16:55,750 --> 00:17:03,610 Řekl jsem vám, že není naděje, že by to vedlo CS50 200 00:17:03,610 --> 00:17:06,119 protože zřetězení není +. 201 00:17:06,119 --> 00:17:08,440 Co si myslíte, že to bude skončit? 202 00:17:10,359 --> 00:17:13,460 Upřímně nemají absolutně žádnou představu. 203 00:17:14,250 --> 00:17:16,460 Vypadá to, že je to jen 50. 204 00:17:16,460 --> 00:17:21,490 To vidí řetězec, a vsadím se, když dáme 123CS - 205 00:17:21,490 --> 00:17:29,640 To vidí první řetězec, pokusí se přečíst celé číslo od něj nebo z něj číslo. 206 00:17:29,640 --> 00:17:31,710 V tomto případě to vidí 123CS. 207 00:17:31,710 --> 00:17:35,190 "To nedává smysl, jako celé číslo, takže jsem jen myslet, že z 123." 208 00:17:35,190 --> 00:17:38,580 Takže 123 + 50 bude 173. 209 00:17:38,580 --> 00:17:40,740 A je to tady začne číst to jako celé číslo. 210 00:17:40,740 --> 00:17:45,690 To není nic vidět, tak to prostě bere to jako 0. Takže 0 + 50 bude 50. 211 00:17:45,690 --> 00:17:51,600 To já jsem za předpokladu to bude dělat něco podobného. 212 00:17:51,600 --> 00:17:54,310 Přemýšlím 99. 213 00:17:54,310 --> 00:17:57,580 Jo, protože to bude trvat první - 214 00:18:12,880 --> 00:18:15,730 Tak 99. 215 00:18:15,730 --> 00:18:21,970 Zde (10/7), kdyby to byla C, co by to vrátit? 216 00:18:23,700 --> 00:18:29,630 [Student] 1. >> Jo, by mělo být 1, protože 10/7, je rozdělení 2 celá čísla. 217 00:18:29,630 --> 00:18:32,910 Číslo děleno celé číslo bude vrátit celé číslo. 218 00:18:32,910 --> 00:18:37,750 To se nemůže vrátit 1 bod cokoliv, že by bylo, tak to jen tak vrátit 1. 219 00:18:37,750 --> 00:18:46,120 Zde tisku (10/7), že to bude skutečně interpretovat, že. 220 00:18:46,120 --> 00:18:53,760 A to znamená, že pokud si opravdu chcete udělat celočíselné zaokrouhlování a podobné věci, které, 221 00:18:53,760 --> 00:18:59,950 co musíte udělat, tisk (podlaha (10/7)); 222 00:18:59,950 --> 00:19:08,460 V jazyce C je to asi divné, že se můžete spolehnout na celé číslo zkrácení pravidelně, 223 00:19:08,460 --> 00:19:12,260 ale v PHP není možné, protože to bude automaticky proměnit v hotovost. 224 00:19:13,430 --> 00:19:17,610 A pak (7 + true); co si myslíte, že to bude? 225 00:19:18,550 --> 00:19:23,640 Hádám, 8, pokud to bude vykládat jako pravdivé 1. 226 00:19:23,640 --> 00:19:25,740 Vypadá to, že je to 8. 227 00:19:25,740 --> 00:19:31,710 >> Takže něco, co bychom udělali v posledních 10 minut, měli byste naprosto nikdy dělat. 228 00:19:31,710 --> 00:19:39,870 Uvidíte kód, který to dělá. 229 00:19:39,870 --> 00:19:42,700 To nemá být tak snadné, jak to. 230 00:19:42,700 --> 00:19:47,240 Ty by mohly mít 2 proměnné, a 1 proměnná se stane, že řetězec 231 00:19:47,240 --> 00:19:51,310 a jiné proměnné se stane, že int, a pak přidat tyto proměnné společně. 232 00:19:51,310 --> 00:20:00,120 Vzhledem k tomu, PHP je dynamicky napsaný a že to nebude mít žádný typ kontroly pro vás 233 00:20:00,120 --> 00:20:03,640 a od té doby je to slabě typovaný a protože to bude jen automaticky hodit tyto věci dohromady 234 00:20:03,640 --> 00:20:11,490 a všechno bude vše fungovat, je to těžké ani neví, že tato proměnná musí být řetězec teď, 235 00:20:11,490 --> 00:20:14,930 takže by ji přidat do této proměnné, což je celé číslo. 236 00:20:18,780 --> 00:20:24,560 Nejlepší praxe je, pokud je proměnná řetězec, mějte ji jako řetězec navždy. 237 00:20:24,560 --> 00:20:26,980 Pokud je proměnná int, mějte ji jako int navždy. 238 00:20:26,980 --> 00:20:30,770 Pokud se chcete vypořádat s celými čísly a řetězce, 239 00:20:30,770 --> 00:20:36,970 můžete použít varsint - to je JavaScript. 240 00:20:36,970 --> 00:20:42,520 Intval. Dělám to po celou dobu. PHP a JavaScript míchám se všechno. 241 00:20:42,520 --> 00:20:47,600 Takže intval bude vrátit celočíselnou hodnotu proměnné. 242 00:20:47,600 --> 00:20:56,550 Pokud jsme se projít v "tisku (intval ('123 ')); dostanete 123. 243 00:21:06,820 --> 00:21:15,850 Intval sám není dělat kontrolu pro nás, že je to pouze číslo. 244 00:21:15,850 --> 00:21:20,460 Manuální PHP, tam jsou jen tolik funkce k dispozici, 245 00:21:20,460 --> 00:21:26,560 tak tady si myslím, to, co bych použít, je funkci is_numeric první. 246 00:21:26,560 --> 00:21:32,590 Hádám, že se vrátil false. 247 00:21:32,590 --> 00:21:35,780 To je další věc, kterou musíme projít, je. === 248 00:21:37,850 --> 00:21:44,020 Takže funkci is_numeric ('123df "), měli byste se to brát jako funkci is_numeric. 249 00:21:44,020 --> 00:21:46,720 V C budete muset iteraci všechny znaky 250 00:21:46,720 --> 00:21:50,410 a zkontrolujte, zda každá postava je číslice nebo cokoliv jiného. 251 00:21:50,410 --> 00:21:53,850 Zde funkci is_numeric bude to pro nás, 252 00:21:53,850 --> 00:21:56,520 a to se vrací false. 253 00:21:56,520 --> 00:22:02,120 Takže když jsem vytiskl, že to vytiskne nic, tak jsem tady porovnání je vidět, 254 00:22:02,120 --> 00:22:05,490 jste náhodou být nepravdivý? A tak teď je to tisk 1. 255 00:22:05,490 --> 00:22:10,060 Zřejmě to vytiskne 1 jako pravdivý místo tisku pravdivé jako pravdivé. 256 00:22:10,060 --> 00:22:15,790 Zajímalo by mě, jestli mám print_r. Ne, to ještě dělá 1. 257 00:22:15,790 --> 00:22:26,760 >> Vraťme se zpět k ===, == stále existuje, 258 00:22:26,760 --> 00:22:32,260 a pokud budete mluvit s Tommym řekne == je naprosto v pořádku. 259 00:22:32,260 --> 00:22:37,700 Já řeknu, že == je hrozné a nikdy byste neměli používat. == 260 00:22:37,700 --> 00:22:44,870 Rozdíl je v tom == porovnává věci 261 00:22:44,870 --> 00:22:48,450 kde může být pravda, i když to není stejného typu, 262 00:22:48,450 --> 00:22:53,810 vzhledem k tomu, === porovnává věci a první to jsou kontroly, které stejný typ? 263 00:22:53,810 --> 00:22:58,010 Ano. Dobře, teď jdu zjistit, jestli skutečně v porovnání s rovnat. 264 00:22:58,010 --> 00:23:08,890 Zde získáte divné věci, jako je 10 rovná - Pojďme se podívat, co to říká. 265 00:23:08,890 --> 00:23:15,570 Takže ('10 '== '1 e1'); 266 00:23:15,570 --> 00:23:17,980 To vrátí true. 267 00:23:17,980 --> 00:23:21,420 Má někdo nějaké dohady, proč to vrátí pravda? 268 00:23:25,180 --> 00:23:27,120 To není jen o tom. Možná je to náznak. 269 00:23:27,120 --> 00:23:33,170 Ale když jsem se změnit na f - zatraceně to! I nadále používat uvozovky. 270 00:23:33,170 --> 00:23:38,780 Důvodem jsou uvozovky jsou na mě řvát, je proto, že jsem si tohle v uvozovkách. 271 00:23:38,780 --> 00:23:43,850 Takže jsem mohl uniknout uvozovek sem, ale jednoduché uvozovky snazší. 272 00:23:43,850 --> 00:23:49,120 Takže ('10 '== '1 F1'); nevytiskne pravda. ('10 '== '1 E1'); vytiskne pravda. 273 00:23:49,120 --> 00:23:56,330 [Student] Je to hex? >> Není to hex, ale je to blízko, že je to jako - 274 00:23:56,330 --> 00:24:01,060 1E1, vědecké notace. 275 00:24:01,060 --> 00:24:07,950 Uznává 1E1 jako 1 * 10 ^ 1 nebo cokoliv. 276 00:24:07,950 --> 00:24:11,510 Ti jsou rovné celá čísla. 277 00:24:11,510 --> 00:24:15,930 Pokud se nám to === pak to bude false. 278 00:24:15,930 --> 00:24:28,490 Vlastně jsem tušení, jestli budeme dělat == co (10 a '10abc ");? Dobrá. Tak to je pravda. 279 00:24:28,490 --> 00:24:35,940 Takže stejně jako když jste (10 + '10abc "), a to by bylo 20, 280 00:24:35,940 --> 00:24:38,800 zde (10 == '10abc '); je pravda. 281 00:24:38,800 --> 00:24:45,350 Ještě horší jsou věci jako (false == NULL); je pravda 282 00:24:45,350 --> 00:24:52,210 nebo (false == 0), je pravda, (false == []); 283 00:24:52,210 --> 00:25:00,970 Existují podivné případy - To je jedna z těch podivných případů. 284 00:25:00,970 --> 00:25:08,110 Všimněte si, že (false == []); je pravda. 285 00:25:08,110 --> 00:25:11,950 ('0 '== False); je pravda. 286 00:25:11,950 --> 00:25:16,090 ('0 '== []); Je false. 287 00:25:16,090 --> 00:25:19,090 Takže == je v žádném případě tranzitivní. 288 00:25:19,090 --> 00:25:26,830 může být rovná b a může být rovná c, 289 00:25:26,830 --> 00:25:29,340 ale b nemusí být rovna c.. 290 00:25:29,340 --> 00:25:35,580 To je ohavnost pro mě, a vy byste měli vždy používat. === 291 00:25:35,580 --> 00:25:38,590 [Student] Můžeme to udělat! == Stejně? >> [Bowden] Ano. 292 00:25:38,590 --> 00:25:44,600 Ekvivalent by být! = A! ==. 293 00:25:44,600 --> 00:25:48,230 To je vlastně vychován v PSet spec 294 00:25:48,230 --> 00:25:52,000 kde mnoho funkcí návratu - 295 00:25:52,000 --> 00:25:53,890 Použití PHP je dobré o tom. 296 00:25:53,890 --> 00:25:59,140 Klade ve velkém červeném poli, "To vrátí false, pokud je chyba." 297 00:25:59,140 --> 00:26:03,940 Ale vrací 0, je naprosto rozumný věc vrátit. 298 00:26:03,940 --> 00:26:08,250 Přemýšlejte o jakékoli funkci, která se očekává, že vrátí celočíselnou hodnotu. 299 00:26:11,250 --> 00:26:17,880 Řekněme, že tato funkce má spočítat počet řádků v souboru nebo tak něco. 300 00:26:17,880 --> 00:26:23,490 Za normálních okolností, předáte této funkci souboru 301 00:26:23,490 --> 00:26:27,120 a bude to vrátí celočíselnou hodnotu, která představuje počet řádků. 302 00:26:27,120 --> 00:26:30,820 Takže 0 je zcela přiměřený počet, pokud soubor je jen prázdný. 303 00:26:30,820 --> 00:26:36,810 Ale co když předat neplatný soubor a funkce se stane vrátit false 304 00:26:36,810 --> 00:26:38,860 Pokud předat neplatný soubor? 305 00:26:38,860 --> 00:26:46,500 Pokud jste právě dělat == jste nerozlišuje případ mezi neplatný soubor a prázdný soubor. 306 00:26:48,870 --> 00:26:51,350 Vždy používejte ===. 307 00:26:55,690 --> 00:26:58,000 To je vše z nich. 308 00:26:58,000 --> 00:27:01,660 >> V PHP, typ pole se liší od toho, co jste zvyklí v C. 309 00:27:01,660 --> 00:27:06,650 Opravdu, možná jste již všimli výše, když jste viděl, že to je typ pole. 310 00:27:06,650 --> 00:27:15,640 Držák Syntaxe je nová od PHP 5.4, která je nejnovější verze PHP. 311 00:27:15,640 --> 00:27:36,960 Než to si vždycky museli psát pole ('a' -> 1, 'b' -> 2. 312 00:27:36,960 --> 00:27:41,160 To bylo konstruktor pole. 313 00:27:41,160 --> 00:27:45,950 Nyní PHP konečně přišel kolem pěkné syntaxi pouhých hranatých závorkách, 314 00:27:45,950 --> 00:27:50,900 která je jen o tolik lepší než pole. 315 00:27:50,900 --> 00:27:54,480 Ale vzhledem k tomu PHP 5.4 je nejnovější verze, 316 00:27:54,480 --> 00:27:59,090 se můžete setkat místa, která nemají ani PHP 5.3. 317 00:27:59,090 --> 00:28:08,220 Přes léto jsme narazili na tento problém, kde PHP 5.3 bylo to, co jsme měli na zařízení, 318 00:28:08,220 --> 00:28:14,480 ale server, který jsme nasadili všechny naše studijní knihu a odeslat a všechny ty věci, aby 319 00:28:14,480 --> 00:28:16,750 Byl PHP 5.4. 320 00:28:16,750 --> 00:28:23,060 Není to věděl, jsme vyvinuli v 5,3, tlačil na 5,4, 321 00:28:23,060 --> 00:28:25,660 a teď najednou nikdo z našeho kódu funguje 322 00:28:25,660 --> 00:28:28,680 protože tam se stalo, že byly změny mezi 5,3 a 5,4 323 00:28:28,680 --> 00:28:31,030 které nejsou zpětně kompatibilní, 324 00:28:31,030 --> 00:28:35,770 a máme jít a opravit všechny naše věci, které nefungují pro PHP 5.4. 325 00:28:39,210 --> 00:28:42,320 Pro tuto třídu, protože zařízení má PHP 5.4, 326 00:28:42,320 --> 00:28:45,490 to je naprosto v pořádku používat hranaté závorky. 327 00:28:47,240 --> 00:28:50,440 Ale pokud hledáte do věcí po internetu, 328 00:28:50,440 --> 00:28:54,880 pokud hledáte nějakou druh pole věci, s největší pravděpodobností budete vidět 329 00:28:54,880 --> 00:29:02,020 kouzlo se syntaxí konstruktoru Array, protože to je už od PHP se narodil 330 00:29:02,020 --> 00:29:07,340 a hranatá závorka syntaxe byl asi za posledních pár měsíců 331 00:29:07,340 --> 00:29:10,020 nebo kdykoliv 5,4 obešel. 332 00:29:10,020 --> 00:29:12,710 To je, jak se index. 333 00:29:12,710 --> 00:29:30,610 Stejně jako v C, jak byste index v hranatých závorkách jako $ pole [0], $ array [1], $ array [2], 334 00:29:30,610 --> 00:29:36,320 indexování stejným způsobem, pokud se stalo, že se vaše indexy že řetězce. 335 00:29:36,320 --> 00:29:40,440 Takže $ array ['a'] a $ array ['b']. 336 00:29:40,440 --> 00:29:47,410 $ Array [b]. Proč by to být v pořádku? 337 00:29:52,490 --> 00:29:59,870 To bude pravděpodobně generovat varování, ale stále fungují. PHP inklinuje k tomu, že. 338 00:29:59,870 --> 00:30:04,890 To inklinuje jen, "budu vás varovat o tom, ale já jsem prostě jít dál 339 00:30:04,890 --> 00:30:07,550 "A dělat, co budu moci." 340 00:30:07,550 --> 00:30:11,500 To bude pravděpodobně si to přeložit na řetězec, 341 00:30:11,500 --> 00:30:15,000 ale je možné, že v určitém okamžiku v minulosti někdo řekl, 342 00:30:15,000 --> 00:30:20,180 define B, které se "HELLO WORLD". 343 00:30:20,180 --> 00:30:28,740 Takže teď b může být konstantní a $ array [b] bude skutečně dělat "HELLO WORLD". 344 00:30:28,740 --> 00:30:32,380 Myslím, že v tomto okamžiku, nebo alespoň naše PHP nastavení, 345 00:30:32,380 --> 00:30:37,870 Pokud se pokusíte index do pole, a že klíč neexistuje, bude to nepodaří. 346 00:30:37,870 --> 00:30:40,150 Já si nemyslím, že to bude jen varovat. 347 00:30:40,150 --> 00:30:44,560 Nebo alespoň si můžete nastavit tak, aby se nejen vás varovat, že jen rovně nahoru nezdaří. 348 00:30:44,560 --> 00:30:49,290 >> Způsob, jak zjistit, zda skutečně existuje taková index je isset. 349 00:30:49,290 --> 00:30:54,690 Takže isset ($ array ['HELLO WORLD "]) vrátí false. 350 00:30:54,690 --> 00:30:59,160 isset ($ array ['b']) vrátí true. 351 00:31:06,830 --> 00:31:09,880 Můžete kombinovat této syntaxi. 352 00:31:15,060 --> 00:31:22,440 Jsem si jistý, co to pole by skončit, je - můžeme vyzkoušet si to. 353 00:31:43,290 --> 00:31:45,700 Oh, potřebuji PHPWord. 354 00:31:53,960 --> 00:32:00,260 To je míchání syntaxe, kde zadáte, co je klíč 355 00:32:00,260 --> 00:32:03,330 a není specifikováno, co je klíč. 356 00:32:03,330 --> 00:32:05,520 Takže 3 tady je hodnota. 357 00:32:05,520 --> 00:32:08,080 Jste výslovně řekl, co jeho hlavní bude. 358 00:32:08,080 --> 00:32:11,670 Co si myslíte, že jeho klíč bude? 359 00:32:11,670 --> 00:32:21,410 [Student] 0. >> Hádám 0 jen proto, že je to první jsme ještě neurčili. 360 00:32:21,410 --> 00:32:23,500 Můžeme skutečně udělat pár těchto případů. 361 00:32:23,500 --> 00:32:28,030 Takže print_r je vytisknout rekurzivní. Bude-li vytisknout celý pole. 362 00:32:28,030 --> 00:32:32,700 To by vytisknout subarrays na pole, pokud byla nějaká. 363 00:32:32,700 --> 00:32:36,630 Takže print_r ($ array); php.test.php. 364 00:32:36,630 --> 00:32:38,810 Vypadá to, jako by dal 0. 365 00:32:38,810 --> 00:32:43,530 Je tu vlastně něco mít na mysli, ale budeme se vrátit k ní v druhém. 366 00:32:43,530 --> 00:32:45,850 Ale co když jsem se náhodou, aby se tento index 1? 367 00:32:45,850 --> 00:32:51,170 PHP nerozlišuje mezi řetězce indexy a celočíselných indexů 368 00:32:51,170 --> 00:33:00,280 takže v tomto bodě jsem právě definoval index 1 a můžu si dělat i $ pole [1] a $ array ['1 '] 369 00:33:00,280 --> 00:33:06,250 a to bude stejný index a stejný klíč. 370 00:33:06,250 --> 00:33:13,000 Tak co teď myslíš, že 3 bude? >> [Student] 2. >> [Bowden] Hádám 2. 371 00:33:16,000 --> 00:33:18,690 Jo. Je to 2. 372 00:33:18,690 --> 00:33:24,790 Co kdybychom to je 10, to je 4? Co si myslíte index 3 bude? 373 00:33:27,360 --> 00:33:29,110 Přemýšlím 11. 374 00:33:29,110 --> 00:33:33,060 Můj odhad na to, co dělá PHP - a myslím, že jsem to viděl před - 375 00:33:33,060 --> 00:33:39,760 je to jen sleduje, co nejvyšší číselná index to používal doposud je. 376 00:33:39,760 --> 00:33:44,230 Je to nikdy přiřadit řetězec index 3. To bude vždy číselná index. 377 00:33:44,230 --> 00:33:47,690 Tak to udržuje nejvyšší k němu patří účelově tak daleko, který se stane být 10, 378 00:33:47,690 --> 00:33:52,540 a bude to dávat 11-3. 379 00:33:52,540 --> 00:34:02,110 To, co jsem řekl předtím, všimněte si, jak je to tiskne toto pole. 380 00:34:02,110 --> 00:34:06,850 Vytiskne klíče 10, klíč 4, klíč 11, tlačítko d. 381 00:34:06,850 --> 00:34:09,790 Nebo dokonce jdem - 382 00:34:15,760 --> 00:34:22,489 Asi jsem neměl dát 0, ale je to tisk 1, 2, 3, 4. 383 00:34:22,489 --> 00:34:29,330 Co když přejdu tu? Nebo pojďme skutečně přejít tyto 2. 384 00:34:29,330 --> 00:34:31,940 Nyní se vytiskne 2, 1, 3, 4. 385 00:34:31,940 --> 00:34:41,270 PHP pole nejsou stejně jako vaše pravidelné tabulky hash. 386 00:34:41,270 --> 00:34:45,570 Je to naprosto rozumné uvažovat o nich jako hash tabulky 99% času. 387 00:34:45,570 --> 00:34:53,790 Ale ve svých hash tabulkách nemá smysl v pořadí, ve kterém byly vloženy věci. 388 00:34:53,790 --> 00:34:56,639 Takže jakmile vložíte jej do hash tabulky, 389 00:34:56,639 --> 00:35:00,590 Předpokládám, že to není propojený seznam a vy jste mohli posoudit v rámci propojeného seznamu 390 00:35:00,590 --> 00:35:03,980 který byl vložen jako první. 391 00:35:03,980 --> 00:35:10,060 Ale tady jsme se vkládá 2 první a ví, kdy to tisku z tohoto pole, že 2 je na prvním místě. 392 00:35:10,060 --> 00:35:13,090 To není jej vytisknout jen v libovolném pořadí. 393 00:35:13,090 --> 00:35:17,550 Technické údaje struktura, která je to s použitím je uložena mapa, 394 00:35:17,550 --> 00:35:24,690 tak to mapuje klíče hodnot a pamatuje pořadí, ve kterém byly vloženy tyto klíče. 395 00:35:24,690 --> 00:35:31,600 V podstatě je to pro některé komplikace, kde je to otravné skutečně - 396 00:35:31,600 --> 00:35:34,510 Řekněme, že máte pole 0, 1, 2, 3, 4, 5 397 00:35:34,510 --> 00:35:37,700 a chcete, aby se index 2. 398 00:35:37,700 --> 00:35:47,750 Jedním ze způsobů, jak to udělat, podívejme se jak to vypadá. 399 00:35:47,750 --> 00:35:50,410 0, 2, 1, 3, 4. 400 00:35:50,410 --> 00:35:54,880 Odstavení se stane odjistí obě proměnné a pole indexů. 401 00:35:54,880 --> 00:35:58,630 Takže unset ($ pole [2]); 402 00:35:58,630 --> 00:36:03,430 Teď, co se to bude vypadat? 2 je prostě pryč, tak to je naprosto v pořádku. 403 00:36:03,430 --> 00:36:11,670 Více nepříjemné je, pokud chcete, aby věci skutečně jako pole. 404 00:36:11,670 --> 00:36:14,910 Dám náhodných čísel. 405 00:36:14,910 --> 00:36:20,400 Nyní všimnete mé indexy. 406 00:36:20,400 --> 00:36:26,860 Chci, aby to být jen jako pole C, kde to jde od 0 do délky - 1 407 00:36:26,860 --> 00:36:30,810 a můžu iterovat přes to jako takový. 408 00:36:30,810 --> 00:36:38,520 Ale jakmile jsem se odjistí druhý index, co bylo v indexu 3 není nyní stal index 2. 409 00:36:38,520 --> 00:36:44,790 Místo toho to prostě odstraní tento index a teď jdete 0, 1, 3, 4. 410 00:36:44,790 --> 00:36:48,740 To je naprosto rozumné. 411 00:36:48,740 --> 00:36:53,950 Je to jen nepříjemné a vy budete muset dělat věci, jako je pole spojovat. Jo. 412 00:36:53,950 --> 00:36:57,200 >> [Student] Co by se stalo, kdyby jste měli pro smyčce 413 00:36:57,200 --> 00:36:59,630 a chtěli byste jít přes všechny prvky? 414 00:36:59,630 --> 00:37:02,290 Když to hit 2, by to dát někdy? 415 00:37:02,290 --> 00:37:10,150 Iterace přes pole. Existují 2 způsoby, můžete to udělat. 416 00:37:10,150 --> 00:37:12,770 Můžete použít pravidelné smyčky for. 417 00:37:12,770 --> 00:37:22,000 To je další složitost PHP. 418 00:37:22,000 --> 00:37:27,420 Většina jazyků, řekl bych, má nějakou délku nebo len, nebo tak něco 419 00:37:27,420 --> 00:37:30,470 označující délku pole. 420 00:37:30,470 --> 00:37:32,820 V PHP je to count. 421 00:37:32,820 --> 00:37:36,160 Takže count ($ array); $ i + +) 422 00:37:36,160 --> 00:37:42,950 Řekněme, tisk ($ array [$ i]); 423 00:37:45,920 --> 00:37:48,820 Notice: Undefined offset: 2. 424 00:37:48,820 --> 00:37:51,610 Je to jen tak nepodaří. 425 00:37:51,610 --> 00:38:03,020 To je důvod, proč, z větší části, už nikdy nebudete muset iteraci pole, jako je tento. 426 00:38:03,020 --> 00:38:07,110 To by mohlo být přehnané, ale už nikdy nebudete muset iteraci pole, jako je tento 427 00:38:07,110 --> 00:38:19,410 protože PHP poskytuje své foreach syntaxi, kde foreach ($ pole as $ item). 428 00:38:19,410 --> 00:38:31,830 Nyní, když jsme se tisknout ($ item); - Dáme projednávat v druhé -, že funguje naprosto v pořádku. 429 00:38:31,830 --> 00:38:38,960 Způsob, jakým foreach pracuje, je první argument je pole, které jste iterace. 430 00:38:38,960 --> 00:38:44,060 A druhý argument, bod, díky každém průchodu smyčky for 431 00:38:44,060 --> 00:38:52,690 to bude trvat na další věc v poli. Takže pamatujte pole má rozkaz. 432 00:38:52,690 --> 00:38:55,690 Poprvé přes cyklus for, položka bude 123 433 00:38:55,690 --> 00:38:59,540 pak to bude 12 pak sníží o 13, pak bude 23, bude to 213. 434 00:38:59,540 --> 00:39:04,670 Věci se opravdu divně, když děláte něco takového foreach. 435 00:39:04,670 --> 00:39:07,480 Podívejme se, co se stane, protože byste nikdy neměli udělat. 436 00:39:07,480 --> 00:39:13,320 Co kdybychom unset ($ array [1]); 437 00:39:20,410 --> 00:39:26,030 To bylo pravděpodobně očekávali. 438 00:39:26,030 --> 00:39:30,950 Ty iterace tohoto pole, a pokaždé, když budete zajištění a odjištění první index. 439 00:39:30,950 --> 00:39:39,720 Takže pro index 0, první věc, bod bere na hodnotu 0, takže to bude 123. 440 00:39:39,720 --> 00:39:44,630 Ale uvnitř smyčky for my unset index 1, tak, že znamená 12 je pryč. 441 00:39:44,630 --> 00:39:57,480 Tak tisku. PHP_EOL. 442 00:39:57,480 --> 00:40:03,580 PHP_EOL je jen řádek, ale je to technicky více přenosný 443 00:40:03,580 --> 00:40:08,890 od konce řádků v systému Windows se liší od konce řádků na Mac a UNIX. 444 00:40:08,890 --> 00:40:18,040 Na Windows newline je \ r \ n, vzhledem k tomu, všude jinde to bývá, jen aby se \ n. 445 00:40:18,040 --> 00:40:25,150 PHP_EOL je nakonfigurován tak, aby používal bez ohledu řádek vašeho systému je. 446 00:40:25,150 --> 00:40:29,310 Tak tisku, že. Pojďme se print_r ($ array) na konci. 447 00:40:32,830 --> 00:40:37,390 Neměl jsem tušení, že by chování. 448 00:40:41,740 --> 00:40:48,960 Bod stále trvá na hodnotě 12, i když jsme střežit 12 předtím, než jsme vůbec se k němu z pole. 449 00:40:52,770 --> 00:40:58,840 Neberte mé slovo, ale vypadá to, že foreach vytvoří kopii pole 450 00:40:58,840 --> 00:41:02,160 a pak se položka nabývá všech hodnot této kopie. 451 00:41:02,160 --> 00:41:07,760 Takže, i když změníte pole uvnitř smyčky for, 452 00:41:07,760 --> 00:41:17,240 to bude jedno. Položka bude na původních hodnotách. 453 00:41:17,240 --> 00:41:19,240 Pojďme zkusit odjištění ji. 454 00:41:19,240 --> 00:41:24,460 Co když je to $ array [1] = "ahoj"; 455 00:41:24,460 --> 00:41:31,770 I když jsme dali "hello" do pole, bod nikdy netrvá na tuto hodnotu. 456 00:41:31,770 --> 00:41:37,430 Je tu další syntaxe foreach smyčky 457 00:41:37,430 --> 00:41:45,900 , kde můžete dát 2 proměnných oddělených šipkou. 458 00:41:45,900 --> 00:41:49,680 Tento první proměnná se bude klíčovým této hodnoty, 459 00:41:49,680 --> 00:41:53,050 a tato druhá proměnná bude stejný přesný položka. 460 00:41:53,050 --> 00:42:01,610 To je nezajímavé zde, ale pokud bychom se vrátit k naší původní případě "A" -> 1, 461 00:42:01,610 --> 00:42:06,090 "B" -> 1, 462 00:42:06,090 --> 00:42:14,470 zde, pokud jsme jen iteraci pro každé pole jako položka, položka bude 1 pokaždé. 463 00:42:14,470 --> 00:42:18,170 Ale pokud chceme také znát klíč spojený s danou položku 464 00:42:18,170 --> 00:42:25,230 pak děláme jako $ key -> $ položky. 465 00:42:25,230 --> 00:42:31,980 Takže teď můžeme udělat tisku ($ key. ":". 466 00:42:31,980 --> 00:42:39,380 Teď je to iterace a tisk jednotlivých tlačítek a jejich přidružené hodnoty. 467 00:42:39,380 --> 00:42:47,030 >> Další věc, kterou můžeme udělat v foreach smyček je můžete vidět tuto syntaxi. 468 00:42:47,030 --> 00:42:54,770 Ampersandy před názvy proměnných mají tendenci být jak PHP dělá odkazy. 469 00:42:54,770 --> 00:43:00,460 Kde jsou odkazy velmi podobné ukazatele, 470 00:43:00,460 --> 00:43:04,820 nemáte ukazatele, takže nikdy jednat s pamětí přímo. 471 00:43:04,820 --> 00:43:12,620 Ale vy máte odkazy, kde 1 proměnná se odkazuje na stejnou věc, jako jiné proměnné. 472 00:43:12,620 --> 00:43:21,450 Uvnitř zde pojďme dělat $ item. Pojďme zpět k 1, 10. 473 00:43:21,450 --> 00:43:28,800 Pojďme udělat $ item + +; To ještě existuje v PHP. Můžete stále dělat + +. 474 00:43:28,800 --> 00:43:38,260 php.test.php. Musím vytisknout. print_r ($ array); 475 00:43:38,260 --> 00:43:42,730 Tiskneme 2, 11. 476 00:43:42,730 --> 00:43:49,560 Kdybych právě udělal foreach ($ pole as $ item), pak položka bude hodnota 1 477 00:43:49,560 --> 00:43:54,190 poprvé přes smyčku. To bude zvyšovat 1-2 a pak jsme hotovi. 478 00:43:54,190 --> 00:43:57,260 Takže pak to půjde přes druhého průchodu smyčkou a tato položka je 10. 479 00:43:57,260 --> 00:44:01,570 To zvýší položka 11, a pak to je jen vyhodit. 480 00:44:01,570 --> 00:44:06,670 Pak jsme print_r ($ array), a podívejme se, že je to jen 1, 10. 481 00:44:06,670 --> 00:44:09,070 Takže přírůstek jsme se ztratili. 482 00:44:09,070 --> 00:44:13,410 Ale foreach ($ array as $ item a) 483 00:44:13,410 --> 00:44:21,910 Nyní tato položka je stejná položka toto právo zde. Je to to samé. 484 00:44:21,910 --> 00:44:26,820 Takže $ item + + je modifikace pole 0. 485 00:44:29,330 --> 00:44:41,850 V podstatě, můžete si také udělat $ K -> $ položky a můžete to udělat $ array [$ k] + +; 486 00:44:41,850 --> 00:44:48,650 >> Takže další způsob, jak dělat to, že jsme svobodní změnit položku, 487 00:44:48,650 --> 00:44:54,070 ale to nezmění náš původní pole. 488 00:44:54,070 --> 00:44:59,720 Ale pokud budeme používat k, který je naším klíčovým, pak můžeme jen index do našeho pole pomocí, že klíč 489 00:44:59,720 --> 00:45:01,530 a zvýšit že. 490 00:45:01,530 --> 00:45:05,410 Tento více přímo modifikuje naši původní nabídku. 491 00:45:05,410 --> 00:45:10,690 Dokonce si můžete udělat, že pokud z nějakého důvodu chtěli schopnost upravovat - 492 00:45:10,690 --> 00:45:13,510 Vlastně, to je naprosto rozumné. 493 00:45:13,510 --> 00:45:16,020 Nechtěl jsi muset napsat $ array [$ k] + +, 494 00:45:16,020 --> 00:45:27,890 jste jen chtěl napsat $ item + +, ale stále chtěl říci if ($ k === '") 495 00:45:27,890 --> 00:45:30,620 pak přírůstek položku a poté vytisknout naší nabídku. 496 00:45:30,620 --> 00:45:36,290 Tak co teď očekáváme print_r dělat? Jaké hodnoty by měly být vytištěny? 497 00:45:36,290 --> 00:45:43,770 [Student] 2 a 10. >> [Bowden] Pouze v případě, že klíč byl "" my skutečně vytisknout, že. 498 00:45:51,940 --> 00:45:55,670 >> Pravděpodobně jste velmi zřídka, pokud vůbec, bude muset definovat funkce v PHP, 499 00:45:55,670 --> 00:46:03,370 ale můžete vidět něco podobného, ​​kde můžete definovat funkci jako funkce cokoliv. 500 00:46:03,370 --> 00:46:09,900 Obvykle byste řekl ($ foo, $ bar) a poté jej definovat jako něco, co. 501 00:46:09,900 --> 00:46:17,580 Ale když jsem to, pak to znamená, že bez ohledu na volání cokoliv, 502 00:46:17,580 --> 00:46:25,110 bez ohledu na volání baz, takže první argument předán baz lze změnit. 503 00:46:25,110 --> 00:46:38,100 Pojďme udělat $ foo + +; 504 00:46:38,100 --> 00:46:48,020 a uvnitř tady jdem BAZ ($ item); 505 00:46:48,020 --> 00:46:52,250 Nyní jsme volání funkce. 506 00:46:52,250 --> 00:46:56,780 Argument je pořízena odkazem, což znamená, že pokud změníme ho 507 00:46:56,780 --> 00:47:00,390 jsme úpravou věc, která byla předána dovnitř 508 00:47:00,390 --> 00:47:04,420 A tisk to očekáváme - pokud jsem zpackal syntaxi - máme 2, 11, 509 00:47:04,420 --> 00:47:06,300 takže to bylo vlastně zvýší. 510 00:47:06,300 --> 00:47:08,790 Všimněte si, že potřebujeme odkazy v 2 místech. 511 00:47:08,790 --> 00:47:13,050 Co když jsem to udělal? Co to znamená? 512 00:47:13,050 --> 00:47:15,810 [Student] se změní. Jo >>. 513 00:47:15,810 --> 00:47:18,290 Položka je jen kopie hodnoty v poli. 514 00:47:18,290 --> 00:47:26,670 Takže bod se změní na 2, ale pole ['a'] bude stále 1. 515 00:47:26,670 --> 00:47:32,560 Nebo co když to udělám? 516 00:47:32,560 --> 00:47:39,260 Nyní položka je poslán jako kopii Baz. 517 00:47:39,260 --> 00:47:46,330 Takže kopie argumentu bude zvýšen na 2, 518 00:47:46,330 --> 00:47:49,240 ale bod sám byl nikdy zvýšen 2. 519 00:47:49,240 --> 00:47:52,880 A položka je totéž jako pole držáku cokoliv, 520 00:47:52,880 --> 00:47:55,380 takže pole bylo nikdy zvýšen. 521 00:47:55,380 --> 00:47:57,960 Takže obě tato místa potřebují. 522 00:47:57,960 --> 00:48:03,830 >> PHP je obvykle docela chytrý o tom. 523 00:48:03,830 --> 00:48:06,570 Můžete si myslet, chci předat odkazem - 524 00:48:06,570 --> 00:48:09,560 Toto bylo vlastně otázka na jednom z psets. 525 00:48:09,560 --> 00:48:14,480 Byla to questions.txt věc, kde se říká, 526 00:48:14,480 --> 00:48:19,280 Proč by se chcete předat tuto struct odkazem? 527 00:48:19,280 --> 00:48:21,250 Co bylo odpověď na tuto otázku? 528 00:48:21,250 --> 00:48:25,100 [Student] Takže nemusíte kopírovat něco velkého. Jo >>. 529 00:48:25,100 --> 00:48:32,920 Struct může být libovolně velký, a když minete struct se jako argument 530 00:48:32,920 --> 00:48:36,800 je třeba, aby zkopírujte celý struct předat jej do funkce, 531 00:48:36,800 --> 00:48:40,410 vzhledem k tomu, pokud jste právě předat struct odkazem 532 00:48:40,410 --> 00:48:46,530 pak to prostě musí kopírovat 4-byte adresy jako argument funkce. 533 00:48:48,520 --> 00:48:52,320 PHP je trochu chytřejší než to. 534 00:48:52,320 --> 00:49:00,650 Pokud mám nějakou funkci a předám do něj řadu 1000 věcí, 535 00:49:00,650 --> 00:49:03,990 znamená to, že to bude muset zkopírovat všechny 1000 z těch věcí 536 00:49:03,990 --> 00:49:10,450 předat do funkce? Nemusí k tomu, že okamžitě. 537 00:49:10,450 --> 00:49:15,940 Je-li uvnitř této funkce vlastně nikdy upravuje foo, 538 00:49:15,940 --> 00:49:22,660 takže if ($ foo === 'hello') return true.; 539 00:49:22,660 --> 00:49:26,460 Povšimněte si, že vlastně nikdy změněna argument uvnitř této funkce, 540 00:49:26,460 --> 00:49:30,010 což znamená, že vše, co bylo předána jako foo nikdy, je nutné zkopírovat 541 00:49:30,010 --> 00:49:32,100 protože to není jeho úpravu. 542 00:49:32,100 --> 00:49:39,240 Takže cesta PHP funguje, je argumenty jsou vždy předány odkazem 543 00:49:39,240 --> 00:49:42,170 dokud se skutečně snaží modifikovat. 544 00:49:42,170 --> 00:49:51,160 Teď když řeknu, že $ foo + +, to bude nyní vytvořit kopii původního foo a upravit kopii. 545 00:49:51,160 --> 00:49:53,090 To šetří čas. 546 00:49:53,090 --> 00:49:58,210 Pokud jste nikdy dotýkat tuto masivní pole, jste vlastně nikdy změnit to, 547 00:49:58,210 --> 00:50:02,360 není třeba, aby se kopie, 548 00:50:02,360 --> 00:50:06,640 vzhledem k tomu, jestli jsme jen dát tuto ampersand To znamená, že není ani kopírovat 549 00:50:06,640 --> 00:50:08,640 i když se to změnit. 550 00:50:08,640 --> 00:50:10,680 Toto chování se nazývá copy-on-write. 551 00:50:10,680 --> 00:50:17,380 Uvidíte ho i na jiných místech, zvláště pokud užíváte operačního systému kurz. 552 00:50:17,380 --> 00:50:23,880 Copy-on-write je docela obvyklý vzor, ​​kde si nemusíte pořizovat kopie něco 553 00:50:23,880 --> 00:50:26,650 pokud je to skutečně mění. Jo. 554 00:50:26,650 --> 00:50:29,520 [Student] Co kdyby jste měli přírůstek uvnitř testu, 555 00:50:29,520 --> 00:50:33,700 tak jen 1 prvek z 1000 by bylo třeba změnit? 556 00:50:33,700 --> 00:50:38,770 Nejsem si jistý. 557 00:50:38,770 --> 00:50:51,250 Myslím, že by zkopírovat celou věc, ale je možné, že je dost chytrý, aby - 558 00:50:51,250 --> 00:51:00,020 Vlastně, co si myslím, je představit jsme měli pole, které vypadá takto: $ pole2 = [ 559 00:51:00,020 --> 00:51:11,000 Pak index "a" je pole [1 2 3 4], a index "b" je pole cokoliv. 560 00:51:11,000 --> 00:51:15,380 Musím čárky mezi všemi z nich. Představte si, že tam jsou čárky. 561 00:51:15,380 --> 00:51:21,210 Pak 'c' je hodnota 3. 562 00:51:24,210 --> 00:51:26,290 Dobře. 563 00:51:26,290 --> 00:51:33,440 Nyní řekněme, že my $ baz ($ pole2); 564 00:51:33,440 --> 00:51:36,540 kde baz nebere to odkazem. 565 00:51:43,510 --> 00:51:47,370 Takže $ foo ['c'] + +; 566 00:51:47,370 --> 00:51:52,340 To je takový příklad, kdy jsme kolem pole2 jako argument 567 00:51:52,340 --> 00:51:57,010 a potom se mění v konkrétní index pole o zvyšování ji. 568 00:51:57,010 --> 00:52:01,090 Upřímně netuším, co PHP se chystá udělat. 569 00:52:01,090 --> 00:52:07,200 To lze snadno vytvořit kopii celého věc, ale pokud je to chytrý, 570 00:52:07,200 --> 00:52:15,030 to bude kopie těchto klíčů, kde to bude mít své odlišné hodnoty 571 00:52:15,030 --> 00:52:20,620 ale toto může ještě poukázat na stejné pole 1,2,3,4 572 00:52:20,620 --> 00:52:22,320 a toto může ještě poukázat na stejné pole. 573 00:52:22,320 --> 00:52:24,170 Budu iPad to. 574 00:52:28,900 --> 00:52:45,950 Míjíme v tomto poli, kde ten chlap body 3, ten chlap body [1,2,3,4], 575 00:52:45,950 --> 00:52:51,350 ten chlap poukazuje na [34, ...] 576 00:52:51,350 --> 00:52:58,590 Teď, když jsme kolem jej do baz, jsme mění toto. 577 00:52:58,590 --> 00:53:03,550 Pokud PHP je chytrý, to může jen dělat - 578 00:53:11,850 --> 00:53:18,230 Jsme pořád museli kopírovat nějakou paměť, ale pokud tam byly tyto obrovské vnořené subarrays 579 00:53:18,230 --> 00:53:21,560 jsme nemuseli kopírovat ty. 580 00:53:21,560 --> 00:53:27,530 Já nevím, jestli je to to, co to dělá, ale dovedu si představit, že to dělá. 581 00:53:29,050 --> 00:53:36,690 To je také docela velkou výhodou C po PHP. 582 00:53:36,690 --> 00:53:40,320 >> PHP je život tak mnohem jednodušší pro mnoho věcí, 583 00:53:40,320 --> 00:53:45,060 ale tak nějak nemají absolutně žádnou představu, jak dobře to bude provádět 584 00:53:45,060 --> 00:53:52,530 protože nemám ponětí, pod kapotou, když je to dělat tyto kopie věcí, 585 00:53:52,530 --> 00:53:55,170 oh, je to, že bude konstantní časové kopie, 586 00:53:55,170 --> 00:54:01,140 je to jen změní 1 ukazatel, je to bude směšně těžké lineární kopie? 587 00:54:01,140 --> 00:54:03,000 Co když to nemůže najít místo? 588 00:54:03,000 --> 00:54:06,760 Je to pak třeba spustit úklid dostat některé více prostoru? 589 00:54:06,760 --> 00:54:11,210 A garbage collection může trvat libovolně dlouho. 590 00:54:11,210 --> 00:54:13,600 V C nemusíte mít strach o těchto věcech. 591 00:54:13,600 --> 00:54:19,780 Každý řádek, který vám napsat můžete do značné míry uvažovat o tom, jak to bude provádět. 592 00:54:26,800 --> 00:54:29,150 >> Pojďme se podívat zpět na to. 593 00:54:35,400 --> 00:54:37,520 Jak příjemné je to, že nemusíte řešit hašovacích funkcí, 594 00:54:37,520 --> 00:54:39,010 propojené seznamy, nebo něco podobného, ​​že? 595 00:54:39,010 --> 00:54:41,980 Vzhledem k tomu, pracovat s hash tabulek je tak snadné teď, tady je zábavná logická pracovat. 596 00:54:41,980 --> 00:54:45,920 Otevřete soubor s názvem unique.php a v něm napsat program, PHP 597 00:54:45,920 --> 00:54:48,330 (Také známý jako "scénář"). 598 00:54:48,330 --> 00:54:55,700 Máme tendenci volat jim skripty, pokud jsou krátké věci, které spustíte z příkazového řádku. 599 00:54:55,700 --> 00:55:02,950 V podstatě, každý jazyk, který nesestavují, ale budete spustit spustitelný soubor 600 00:55:02,950 --> 00:55:05,920 na příkazovém řádku, můžete volat, že spustitelný skript. 601 00:55:05,920 --> 00:55:08,510 Mohl bych stejně dobře napsat program v jazyce C, který to dělá, 602 00:55:08,510 --> 00:55:12,300 ale nemyslím si, říkám skript, protože jsem se poprvé zkompilovat a spustit binárku. 603 00:55:12,300 --> 00:55:15,480 Ale tento program PHP budeme volat skript. 604 00:55:15,480 --> 00:55:23,830 Nebo pokud bychom ji napsal v roce Python nebo Perl nebo Node.js nebo některý z těchto věcí, 605 00:55:23,830 --> 00:55:26,500 bychom jim říkat, že všechny skripty, protože jejich spuštění v příkazovém řádku 606 00:55:26,500 --> 00:55:30,040 ale nemáme zkompilovat. 607 00:55:30,860 --> 00:55:33,400 Mohli bychom to docela rychle. 608 00:55:36,960 --> 00:55:41,480 Nebudeme používat argv. Řekněme, foukat přes to. 609 00:55:41,480 --> 00:55:45,730 Nazvěme to jedinečné, napsat program. 610 00:55:45,730 --> 00:55:49,400 Můžete předpokládat, že vstup bude obsahovat jedno slovo na řádku. 611 00:55:49,400 --> 00:55:52,020 Vlastně, bude argv být dost triviální použití. 612 00:56:03,730 --> 00:56:06,720 unique.php. 613 00:56:08,550 --> 00:56:13,750 První věc, kterou nejprve chceme zjistit, jestli jsme byli předáni 1 argument příkazového řádku. 614 00:56:13,750 --> 00:56:20,900 Stejně jako byste očekávat, že argc a argv v C, máme stále ty v PHP. 615 00:56:20,900 --> 00:56:33,900 Takže if ($ argc! == 2) pak nebudu zabývat tisku zprávy nebo tak něco. 616 00:56:33,900 --> 00:56:37,340 Já budu jen opustit, chybový kód 1. 617 00:56:37,340 --> 00:56:41,340 Mohl bych také vrátit 1. 618 00:56:41,340 --> 00:56:53,180 Zřídka v PHP jste v tomto stavu, kdy jsme na - 619 00:56:53,180 --> 00:56:57,820 Obvykle jste ve funkci nazývá funkce volána funkce nazývá funkce. 620 00:56:57,820 --> 00:57:02,070 A když se něco pokazí a vy jen chcete opustit všechno úplně, 621 00:57:02,070 --> 00:57:05,680 exit jen ukončí program. 622 00:57:05,680 --> 00:57:08,160 To také existuje v C. 623 00:57:08,160 --> 00:57:10,700 Pokud jste ve funkci ve funkci do funkce ve funkci 624 00:57:10,700 --> 00:57:17,540 a chcete jen zabít program, můžete volat exit a bude to prostě ukončit. 625 00:57:17,540 --> 00:57:23,120 Ale v PHP je to ještě vzácnější, že jsme na této nejvyšší úrovni. 626 00:57:23,120 --> 00:57:26,090 Obvykle jsme uvnitř jakési funkce, proto ho označujeme východ 627 00:57:26,090 --> 00:57:29,650 tak, že jsme se nemuseli vracet do 1 věc, které si pak uvědomí, že je chyba 628 00:57:29,650 --> 00:57:32,270 tak, že se vrátí až v případě, že uznává, že je to chyba. 629 00:57:32,270 --> 00:57:35,270 Nechceme, aby se s tím vypořádat, tak ukončete (1); 630 00:57:35,270 --> 00:57:38,240 return (1), v tomto případě by bylo rovnocenné. 631 00:57:38,240 --> 00:57:44,000 >> Pak to, co chceme otevřít chceme fopen. 632 00:57:44,000 --> 00:57:46,760 Argumenty budou vypadat dost podobně. 633 00:57:46,760 --> 00:57:51,600 Chceme fopen ($ argv [1], a chceme jej otevřít pro čtení. 634 00:57:51,600 --> 00:57:55,720 , Který vrací zdroj, který jdeme volat f. 635 00:57:55,720 --> 00:58:02,180 To vypadá dost podobně, jak to dělá C až nemáme říkat soubor *. 636 00:58:02,180 --> 00:58:06,170 Místo toho jsme jen říct, $ f. Dobře. 637 00:58:06,170 --> 00:58:17,190 Vlastně si myslím, že to dokonce nám dává náznak jako na funkci PHP s názvem souboru. PHP souboru. 638 00:58:17,190 --> 00:58:23,990 Co to udělá, je přečíst si celý soubor do pole. 639 00:58:23,990 --> 00:58:29,770 Nemusíte ani potřeba fopen ho. Bude to udělá za vás. 640 00:58:37,450 --> 00:58:43,700 Takže $ lines = file ($ argv [1]); 641 00:58:43,700 --> 00:58:49,680 Nyní všechny řádky v souboru jsou v řadách. Nyní chceme seřadit řádky. 642 00:58:49,680 --> 00:58:52,180 Jak můžeme řadit řádky? 643 00:58:52,180 --> 00:58:54,920 My třídit řádky. 644 00:58:54,920 --> 00:58:58,080 A nyní můžeme vytisknout nebo cokoliv jiného. 645 00:58:58,080 --> 00:59:05,580 Pravděpodobně nejjednodušší způsob je foreach ($ linky jako $ line) echo $ line; 646 00:59:05,580 --> 00:59:10,960 [Student] Nebylo by dokonce jsme překročit čáry odkazování něco do druhu? 647 00:59:10,960 --> 00:59:28,850 To je místo, kde by se trochu možné definovat jako funkce sort (& $ array). 648 00:59:28,850 --> 00:59:32,650 Při volání funkce nechcete předat odkazem. 649 00:59:32,650 --> 00:59:36,900 Je to funkce, která definuje to, jako že se to jako reference. 650 00:59:36,900 --> 00:59:40,900 To je vlastně přesně to, co se stalo 651 00:59:40,900 --> 00:59:46,220 když dáme vše na našich serverech, když jsme šli 5,3 až 5,4. 652 00:59:46,220 --> 00:59:53,800 Až do 5,4, to bylo naprosto rozumné. 653 00:59:53,800 --> 00:59:58,740 Funkce neočekává to brát jako referenční, ale můžete předat jako referenční 654 00:59:58,740 --> 01:00:02,860 takže pokud funkce nemá náhodou upravit, je to ještě upravit. 655 01:00:02,860 --> 01:00:05,850 Jak 5,4, jste neměl dělat. 656 01:00:05,850 --> 01:00:11,740 Takže teď jediný způsob, jak předat odkazem, je-li funkce výslovně dělá. 657 01:00:11,740 --> 01:00:19,840 Pokud nechcete, aby se ji změnit, pak se budete muset udělat, $ copy = $ tratě a průchod kopie. 658 01:00:19,840 --> 01:00:24,820 Takže teď linky budou zachovány a kopie se změní. 659 01:00:27,670 --> 01:00:31,460 php.unique.php. Možná jsem pokazil něco vymyslet. 660 01:00:31,460 --> 01:00:33,190 Neočekávaná "sort". 661 01:00:38,320 --> 01:00:43,850 Tam to bude něco, co to dělá pro nás. 662 01:00:43,850 --> 01:00:45,820 Není to ani tam. 663 01:00:45,820 --> 01:00:52,140 Všimněte si, když si přečtete v příručce, že první argument se očekává, že bude pole 664 01:00:52,140 --> 01:00:56,490 a trvalo odkazem. 665 01:00:58,160 --> 01:01:03,540 Proč je tento stěžuje na mě? Protože mám tuto funkci druh stále tady, že nechci. 666 01:01:03,540 --> 01:01:09,210 Dobře, php.unique.php. Nechtěl jsem předat argument, protože nemám soubor. 667 01:01:09,210 --> 01:01:13,560 Je to php.unique.php na test.php. 668 01:01:13,560 --> 01:01:19,080 Zde je test.php vše vytisknout v pěkné seřazeném pořadí. 669 01:01:19,080 --> 01:01:24,600 Všimněte si, že jsou seřazena řád je trochu divné pro kód souboru 670 01:01:24,600 --> 01:01:27,460 protože všechny naše prázdné řádky budou na prvním místě 671 01:01:27,460 --> 01:01:30,190 pak se přijde všem našim 1 level vroubkováním 672 01:01:30,190 --> 01:01:33,360 pak přijď všechny naše bez zářezů. 673 01:01:33,360 --> 01:01:38,620 Jo. >> [Student] Tak zdrojového kódu nebyla předána odkazem? 674 01:01:38,620 --> 01:01:42,240 Je to, že obecně předávány hodnotou? 675 01:01:42,240 --> 01:01:50,240 [Bowden] Když zavoláte funkci, nikdy určuje, zda byl přijat odkazem. 676 01:01:50,240 --> 01:01:53,960 Je to definice funkce, která určuje, zda byl přijat odkazem. 677 01:01:53,960 --> 01:01:59,450 A při pohledu na funkce definici druhu, nebo jen při pohledu na to, 678 01:01:59,450 --> 01:02:02,820 trvá argumentu odkazem. 679 01:02:02,820 --> 01:02:07,160 Takže bez ohledu na to, zda chcete, aby ji pomocí odkazu, dělá si to odkazem. 680 01:02:07,160 --> 01:02:10,200 Upravuje pole v místě. 681 01:02:10,200 --> 01:02:17,400 To je prostě není povoleno. Nemáte oprávnění k tomu. >> [Student] Oh, dobře. 682 01:02:17,400 --> 01:02:22,410 [Bowden] Toto, sort bude trvat linky s odkazem a upravit ji. 683 01:02:22,410 --> 01:02:26,850 A opět, pokud jste nechtěli, aby dělal to, že byste mohli udělat kopii druhu. 684 01:02:26,850 --> 01:02:35,850 I v tomto případě, kopie není ve skutečnosti kopie linek. 685 01:02:35,850 --> 01:02:40,620 Je to jen ukazuje na stejnou věc, dokud to nejprve dostane upravené, 686 01:02:40,620 --> 01:02:44,430 kde to se nejprve dostat upravena v třídění funkce, 687 01:02:44,430 --> 01:02:50,940 kde, protože je to kopírování při zápisu, nyní kopie kopie se bude provedena. 688 01:02:57,500 --> 01:03:04,250 Můžete si také udělat. To je další místo, kde můžete vidět ampersand. 689 01:03:04,250 --> 01:03:07,190 Vidíte to ve smyčkách foreach, můžete vidět v deklarace funkce, 690 01:03:07,190 --> 01:03:10,040 a uvidíte, když právě přiřazování proměnných. 691 01:03:10,040 --> 01:03:12,350 Nyní jsme dosáhli nic a díky tomu 692 01:03:12,350 --> 01:03:15,600 protože kopírování a linky jsou doslova totéž. 693 01:03:15,600 --> 01:03:19,940 Můžete použít řádky a zkopírovat zaměnitelně. 694 01:03:19,940 --> 01:03:25,430 Můžete to udělat unset ($ kopii), a že není unset linky, 695 01:03:25,430 --> 01:03:29,120 můžete jen ztratit svůj odkaz na stejnou věc. 696 01:03:29,120 --> 01:03:33,440 Tak jako tohoto bodu, nyní vedení je jediný způsob, jak můžete přistupovat řádky. 697 01:03:36,450 --> 01:03:38,770 >> Otázky? 698 01:03:41,000 --> 01:03:42,460 Jo. 699 01:03:42,460 --> 01:03:45,880 [Student] Úplně mimo téma, ale nemusíte uzavřít PHP s - >> Ty ne. 700 01:03:45,880 --> 01:03:47,730 Dobře. 701 01:03:47,730 --> 01:03:53,790 [Bowden] bych jít až tak daleko, že říkají, že je to špatné praxe ukončit. 702 01:03:53,790 --> 01:03:57,580 To je asi přehnané, zejména ve skriptu, 703 01:03:57,580 --> 01:04:03,740 ale uvidíme, co se stane, když udělám tohle. 704 01:04:03,740 --> 01:04:08,890 To neudělal nic. Co když jsem chtěl - [povzdechne si] 705 01:04:13,870 --> 01:04:16,960 Musím předat argument. 706 01:04:19,000 --> 01:04:22,050 Shoot. Volal jsem to špatně. 707 01:04:24,340 --> 01:04:28,310 Takže php.unique.php s argumentem. 708 01:04:28,310 --> 01:04:30,980 Teď nemám ani potřebovat. 709 01:04:34,520 --> 01:04:37,740 Předám to platný argument. 710 01:04:37,740 --> 01:04:42,050 Tato tištěná, co je to tisk. 711 01:04:45,260 --> 01:04:50,080 Jsem tisku kopie a kopie neexistuje. Tak linky. 712 01:04:53,650 --> 01:04:58,270 Je vytištěna všechno, a pak zjistíte všechny tyhle krámy tady, 713 01:04:58,270 --> 01:05:06,690 protože v ničem PHP, který je mimo PHP tagy 714 01:05:06,690 --> 01:05:09,520 je jen tak být vytištěny doslova. 715 01:05:09,520 --> 01:05:18,050 To je důvod, proč HTML, je to tak pěkné, že můžu dělat div bla, bla, bla třídu nebo cokoliv, 716 01:05:18,050 --> 01:05:25,140 bla, bla, bla a pak udělat nějaké PHP kód a poté proveďte konec div. 717 01:05:25,140 --> 01:05:36,460 A teď tisku to budu mít pěkné div se nahoru, všechno, co PHP tištěný, div na dně. 718 01:05:36,460 --> 01:05:43,510 Katastrofální, když se něco takového stane, což je docela běžné, 719 01:05:43,510 --> 01:05:47,930 jen zbloudilá řádek v dolní části souboru. 720 01:05:47,930 --> 01:05:50,940 Ty by si, že to by bylo, že velký problém 721 01:05:50,940 --> 01:05:58,660 dokud vezmete v úvahu fakt, že s prohlížeči - 722 01:05:58,660 --> 01:06:03,880 >> Jak přesměruje práci nebo v podstatě jakékoli záhlaví práce, 723 01:06:03,880 --> 01:06:07,980 když si připojení k webovému serveru a odešle zpět všechny tyto hlavičky a věci 724 01:06:07,980 --> 01:06:12,020 jako reakci 200 nebo reakce přesměrování nebo cokoliv, 725 01:06:12,020 --> 01:06:18,230 záhlaví jsou platné pouze do první bajt dat je odeslán. 726 01:06:18,230 --> 01:06:23,140 Můžete přesměrovat tisíckrát, ale jakmile první bajt dat je odeslán 727 01:06:23,140 --> 01:06:26,120 jste neměl k přesměrování znovu. 728 01:06:26,120 --> 01:06:31,860 >> Pokud se mají rozptylové řádek v dolní části souboru 729 01:06:31,860 --> 01:06:37,260 a řekněme, že jste tuto funkci použít, a pak chcete - 730 01:06:41,580 --> 01:06:52,870 Řekněme, že je to další soubor, který je index.php a require_once něco - 731 01:06:52,870 --> 01:06:56,920 Já si nemyslím, že je dobrý příklad toho. 732 01:06:56,920 --> 01:07:04,740 Problém se stane, když dostane zopakoval tento řádek v dolní části. 733 01:07:04,740 --> 01:07:08,660 Nemusíte mít nic společného byly rezonovat ještě. 734 01:07:10,820 --> 01:07:15,700 I když jste neměli v úmyslu na nic dostat ozývalo, to něco dostat ozvěnou 735 01:07:15,700 --> 01:07:17,990 a tak teď jste neměl posílat žádné další záhlaví 736 01:07:17,990 --> 01:07:20,030 a budete se stížností. 737 01:07:22,170 --> 01:07:24,420 Prostě není třeba tyto uzavírací tagy. 738 01:07:24,420 --> 01:07:27,420 Pokud máte v plánu na tom něco s HTML - 739 01:07:27,420 --> 01:07:30,490 a je to naprosto rozumné udělat tady div cokoliv 740 01:07:30,490 --> 01:07:39,450 a pak na tomto místě si můžete nebo nemůžete zahrnout. 741 01:07:39,450 --> 01:07:41,590 To nezáleží. 742 01:07:41,590 --> 01:07:45,450 Ale v PHP skripty je to vzácné, zavřete jej. 743 01:07:45,450 --> 01:07:50,400 Když je všechno PHP, absolutně všechno, 744 01:07:50,400 --> 01:07:55,460 nemáte opravdu potřebujete zavřít / byste neměli zavřít. 745 01:08:02,030 --> 01:08:05,720 >> Jednání s řetězci je mnohem hezčí, než v C. 746 01:08:05,720 --> 01:08:09,470 V PHP můžete zadat řetězec s jednoduchými nebo dvojitými uvozovkami. 747 01:08:09,470 --> 01:08:12,820 S jednoduchými uvozovkami není možné použít "escape" sekvence. 748 01:08:12,820 --> 01:08:17,640 Neustále uniknout, bla, bla, bla. 749 01:08:19,920 --> 01:08:24,010 Takže printf je velmi vzácný v PHP. 750 01:08:24,010 --> 01:08:32,290 Myslím, že bych použil printf kdybych chtěl udělat takové věci - v PSet 5, kterou jste použili sprintf nebo cokoliv jiného. 751 01:08:32,290 --> 01:08:36,060 Ale vy chcete dělat 001.jpg 002.jpg a. 752 01:08:36,060 --> 01:08:40,300 Takže pro tento druh věcí, kde jsem vlastně chtít naformátovat text bych použít printf. 753 01:08:40,300 --> 01:08:44,689 Ale jinak bych prostě použít zřetězení. 754 01:08:44,689 --> 01:08:47,000 Nikdy jsem použít printf. 755 01:08:49,229 --> 01:09:00,170 Jsme jen rozlišovat detaily mezi apostrofy a dvojité uvozovky. 756 01:09:00,170 --> 01:09:07,490 Největší rozdíl je, že jednoduché uvozovky, bude vytištěn doslova. 757 01:09:07,490 --> 01:09:15,390 Tam je žádný znak typu dat v PHP, na rozdíl od C, takže to je ekvivalentní to. 758 01:09:15,390 --> 01:09:17,970 Jsou oba řetězce. 759 01:09:17,970 --> 01:09:29,180 A pěkná věc o jednotlivých citátem řetězců je, že jsem mohla říct "ahoj svět!" bla, bla, bla, 760 01:09:29,180 --> 01:09:33,340 $ $ Wooo. 761 01:09:33,340 --> 01:09:38,260 Co se stane, když jsem tisknout je, že bude tisknout to doslova. 762 01:09:38,260 --> 01:09:40,680 Pojďme se zbavit všech našich věcí. 763 01:09:40,680 --> 01:09:44,700 Takže echo $ str1; 764 01:09:48,569 --> 01:09:56,570 Je to doslova tištěné všechny ty věci: znaky dolaru, 765 01:09:56,570 --> 01:09:58,770 Zpětné lomítko n, které byste myslíte, že by bylo nové řádky - 766 01:09:58,770 --> 01:10:01,500 všechny ty věci se vytiskne doslova. 767 01:10:01,500 --> 01:10:05,650 Jediná věc, kterou potřebujete k útěku, jsou jednoduché uvozovky 768 01:10:05,650 --> 01:10:09,470 protože jinak by si, že to zavírání apostrofy. 769 01:10:09,470 --> 01:10:15,050 Uvozovky, zcela odlišné. 770 01:10:20,300 --> 01:10:25,870 Vidíme, že zvýrazňování syntaxe je cluing nás na to, co je asi jít hrozně špatně. 771 01:10:25,870 --> 01:10:36,190 php.unique. Undefined variable: wooo, protože to je interpretováno jako proměnná s názvem wooo. 772 01:10:36,190 --> 01:10:42,400 Uvozovky vám vložit proměnné do - 773 01:10:42,400 --> 01:10:52,730 Řekněme, že $ name = "Rob"; 774 01:10:52,730 --> 01:10:58,020 Takže echo "Ahoj, mé jméno je $ name!"; 775 01:10:58,020 --> 01:11:09,260 Uznává to jako proměnné. 776 01:11:09,260 --> 01:11:21,210 Když běžím, že - a já se vloží nový řádek - Ahoj, mé jméno je Rob! a hello world! 777 01:11:21,210 --> 01:11:24,910 To je proto, že jsem nikdy odstraněn tisk wooo výše. 778 01:11:24,910 --> 01:11:30,020 K dispozici je 1 další krok můžete udělat. 779 01:11:30,020 --> 01:11:39,250 $ Pole = [1, 2, 3]; 780 01:11:39,250 --> 01:11:43,270 Co když chci tisknout první index pole? 781 01:11:43,270 --> 01:11:45,150 Vy $ pole [0]. 782 01:11:45,150 --> 01:11:49,280 Na zvýraznění syntaxe je stopa. Co je to dělat? 783 01:11:52,320 --> 01:11:54,510 php.unique. 784 01:11:54,510 --> 01:11:59,860 Ahoj, mé jméno je 1! což není to, co jsem chtěl. 785 01:11:59,860 --> 01:12:05,050 Zvýraznění syntaxe mi lhal. 786 01:12:05,050 --> 01:12:13,020 Zkusme '' -> 1, 'b' -> 2. 787 01:12:18,450 --> 01:12:21,440 To je, jak bych si to napsat. 788 01:12:26,350 --> 01:12:32,160 Neočekávaný apostrof (T_ENCAPSED bla, bla, bla, bla, bla). 789 01:12:32,160 --> 01:12:41,780 Myšlenka je, že to není to přiznáváme jako součást pole. 790 01:12:41,780 --> 01:12:46,620 Je to přiznáváme jako pole indexované dopisem na. 791 01:12:46,620 --> 01:12:49,870 Chcete-li udělat ve složených závorkách, 792 01:12:49,870 --> 01:12:54,730 a nyní, co je v tomto rovnátka kudrnatými bude interpolovat, 793 01:12:54,730 --> 01:13:00,340 což je slovo, které používáme pro magicky vložení těchto proměnných do správných místech. 794 01:13:00,340 --> 01:13:04,280 Nyní dělá, php.unique, a Ahoj, jmenuji je 1! podle očekávání 795 01:13:04,280 --> 01:13:07,720 nebo Ahoj, jmenuji se Rob! 796 01:13:14,110 --> 01:13:23,130 Jedna věc, která je docela hezké o jednotlivých citací je, že - 797 01:13:23,130 --> 01:13:28,480 Tam je nějaký náklady na interpolační. 798 01:13:30,520 --> 01:13:35,100 Pokud používáte dvojité uvozovky, interpret musí jít přes tento řetězec, 799 01:13:35,100 --> 01:13:41,500 Ujistěte se, že, "Oh, tady je proměnná. Teď musím jít pro tuto proměnnou a vložte jej sem." 800 01:13:41,500 --> 01:13:48,930 I když nechcete používat žádné proměnné, 801 01:13:48,930 --> 01:13:52,220 nic uvnitř těchto uvozovek musí být přerušen, 802 01:13:52,220 --> 01:13:56,800 ale to bude ještě pomalejší, protože je třeba jít přes uvozovek 803 01:13:56,800 --> 01:14:00,130 Hledám věci, které je třeba interpolovat. 804 01:14:00,130 --> 01:14:05,360 Takže jediné citace může být trochu rychlejší, pokud nemusí nic být přerušen, 805 01:14:05,360 --> 01:14:15,650 a mám tendenci používat i jednoduché uvozovky pro, "Ahoj, mé jméno je". $ Array ['a'] stejně. 806 01:14:15,650 --> 01:14:20,430 To se děje za rovnocenné, co jsme měli předtím. 807 01:14:24,840 --> 01:14:28,440 Ale je to věc názoru. 808 01:14:28,440 --> 01:14:34,750 Pokud používáte PHP, pravděpodobně nezajímá o rozdílu rychlostí. 809 01:14:34,750 --> 01:14:39,480 Není dostatek rozum, ven začít. 810 01:14:39,480 --> 01:14:43,030 >> Jakékoliv konečné otázky? 811 01:14:47,430 --> 01:14:51,710 >> My vlastně ani dostat přes to všechno, ale tohle byla nuda. 812 01:14:51,710 --> 01:14:59,080 Poslední věc, která je docela hezké v PHP je, když máte co do činění s HTML, 813 01:14:59,080 --> 01:15:06,450 budete používat to trochu, tak si pěkné místní syntaxe pro tisk proměnné. 814 01:15:32,400 --> 01:15:36,730 Bez uvedení PHP zde, toto je nazýváno krátké tagy. 815 01:15:36,730 --> 01:15:44,330 Oficiálně od PHP 5.4, je zastaralý to. 816 01:15:44,330 --> 01:15:48,640 Je doporučeno, aby php. 817 01:15:48,640 --> 01:15:55,770 Toto je i nadále podporována, takže krátké tagy s 01:16:02,480 To je ve výchozím nastavení podporuje, takže můžete použít tyto, jak si přejete, a jsou to docela pohodlné. 819 01:16:02,480 --> 01:16:05,700 >> Nějaké otázky? 820 01:16:07,780 --> 01:16:09,270 Dobrá. 821 01:16:10,840 --> 01:16:13,800 >> Zůstaňte prima, San Diego. 822 01:16:13,800 --> 01:16:16,070 [Smích] 823 01:16:18,620 --> 01:16:22,660 Bye. [Smích] 824 01:16:24,350 --> 01:16:28,470 [Potlesk] [smích] 825 01:22:46,460 --> 01:22:49,460 >> [CS50.TV]