[Powered by Google Translate] [§ 8 - Více Pohodlné] [Rob Bowden - Harvard University] [To je CS50. - CS50.TV] Tyto poznámky týden sekce se bude pěkně krátká, tak jsem jen tak pořád mluvit, vy se chystáte udržet ptát, a my se pokusíme naplnit tolik času, jak je to možné. Spousta lidí si myslí, že to Pset není nutně obtížné, ale je to velmi dlouho. Pset spec sám vezme hodinu číst. Dáme vám hodně o SQL, co by mohl potřebovat. My vás provede mnoha, takže by to nemělo být tak zlé. Má někdo začal nebo skončil? Je to poslední Pset. Ach, můj Bože. Obvykle je tu JavaScript jeden po tomto, ale věci kalendářní změna dělá vše 1 týden kratší, a my už mají PSet JavaScript. Nevím, jak to ovlivní, zda JavaScript bude zobrazovat na zkoušku nebo Kvíz 1. Dovedu si představit, že to bude něco jako, co potřebujete vědět věci vysoké úrovně o JavaScriptu, ale pochybuju, že bychom jen vám rovnou kód JavaScript protože jste neměli PSet v něm. Ale to bude věc k přezkoumání kvíz příští týden. Sekce otázek. Mnoho z těchto věcí je poněkud špatně formulováno, ale budeme diskutovat, proč. Na rozdíl od C, PHP je "dynamicky napsaný" jazyk. Co to znamená, ptáte se? No, rozloučit se všemi z těch char, float, int, a další klíčová slova budete muset použít při deklarování proměnné a funkce v C. V PHP, je proměnná je typu určena hodnotou, že je to v současné době drží. Takže než jsme zadejte tento kód do souboru s názvem dynamic.php, PHP je dynamicky zadali. To je pravda. Nesouhlasím s tím, že to znamená, že jsme se rozloučí s char, float, int, a další klíčová slova. Přesný rozdíl mezi dynamicky napsaný a podpůrně, která je staticky napsaný, je to, že dynamicky napsaný, všechny vaše kontrolu typu a tak se děje v běhu, zatímco staticky zadali to stane v době kompilace. Slovo statický obecně se zdá, mysli věci kompilaci. Myslím, že existují i ​​jiné využití pro něj, ale v C, když prohlásí, statickou proměnnou, jeho skladování je přiděleno v době kompilace. Zde, dynamicky napsaný jen znamená, že - V jazyce C, pokud se pokusíte přidat řetězec a celé číslo, když jej zkompilovat to bude stěžovat, protože to bude říkat, že nemůžete přidat int a ukazatel. To prostě není platná operace. To je další věc, která se dostaneme do druhého. Ale to druh kontroly, skutečnost, že si stěžuje, v době kompilace, je statická kontrola typu. Tam jsou jazyky, kde nepotřebujete říkat char, float, int, a všechny ty věci, ale jazyk může říct, z kontextu věci, jaký typ to má být, ale je to stále staticky zadali. Takže pokud budete mít 51, OCaml, už nikdy nebudete muset použít některý z těchto typů, ale to ještě bude v době kompilace říct, že nemůžete udělat, protože jste míchání int a řetězec. Dynamicky napsaný jen znamená, že někdy během běhu budete si stížnost. Pokud se také používá Java předtím, obecně, téměř všechny C-typ jazyka se bude staticky napsaný, tak C, C + +, Java, všechny z nich jsou obecně staticky zadali. V Javě při kompilaci něco a vy říkáte, string s se rovná nové něco, co není řetězec, že se to stěžovat, protože tyto typy prostě neodpovídají. To bude stěžovat v době kompilace. Ale také to má nějaký dynamický čas věci líbí, pokud se pokusíte přetypovat něco k typu, který je konkrétnější než jeho běžného typu, nic to může dělat v době kompilace, aby zkontrolovat, zda obsazení je uspět. Java má také nějaký dynamický typ kontroly, že jakmile se dostane k této přímce kódu když je to vlastně realizovat, bude to dělat obsazení, zda že obsazení bylo platné v první řadě, a pokud to nebylo, pak to bude si stěžovat, že máte neplatný typ. Dynamický typ kontroly. Napište toto do souboru s názvem dynamic.php. Dynamic.php. Budu unzip, že formátování. Máme proměnnou, musíme nastavit tak, aby celé číslo 7, pak budeme tisknout a% s - Oh, my tisku typ, takže GetType bude vrátit typ proměnné. Jsme jen tiskem typ znovu a znovu. Právě jsme php.dynamic.php. Uvidíme, že se změní z integer na řetězec do Booleovské hodnoty, jak jsme projít. V C není Datový typ Boolean, není datový typ řetězec. Tam je char * a Boolean jen bývá int nebo char, nebo tak něco. V PHP tyto typy existují, a to je jeden z velkých výhod PHP nad C - že řetězec operace jsou nesrovnatelně jednodušší v PHP než C. Jsou prostě fungovat. Tak jsme se vrátili sem. Běželi jsme dynamic.php. Toto říká PHP interpret, s názvem php, spustit PHP kód v dynamic.php. Máte-li nějaké chyby v souboru, bude tlumočník říct! Interpret, to je další velký rozdíl mezi PHP a C. V C budete muset kompilovat něco a pak spustit tento zkompilovaný soubor. V PHP nikdy cokoli kompilovat. Takže interpret PHP je v podstatě jen čtete tento řádek po řádku. Dává var = 7, pak se dotkne printf pak narazí var pak narazí printf a tak dále. Tam je trochu sestavování se tak stane, a to ukládá výsledky takže pokud spustíte skript později si můžete udělat nějaké, ale v podstatě je to řádek po řádku tyhle věci. To znamená, že spousta optimalizací, které dostaneme v C, jako kompilace, je to jen obecně, že kompilátor může udělat spoustu triků pro vás. To může uzavřít nepoužívané proměnné, může provádět všechny tyto druhy věcí, to může dělat rekurze ocasu. V PHP nejste dostane tuto výhodu protože je to jen tak, kdo provádění řádek po řádku po řádku, a to opravdu není rozpoznat tyto věci tak snadno protože to není 1 big compilation průchod přes věc a pak provedení; je to jen řádek po řádku. Tak to je interpret. Zpět k našemu dynamickému typování: docela v pohodě, ne? Ty určitě by to dělat v C! Nyní, uvidíme, jestli můžete přijít na typ každého z následujících hodnot. Viz tento pro referenční. Tak 3,50. Jaký typ si myslíte, že to bude? Zde jsou typy, které máme. Máme bools, celá čísla, plovoucí body, struny, pole, objekty, a pak se zdroje, který je tak trochu nejasná. Myslím, že je to vlastně příklad. Pak je tu NULL. NULL je zvláštní typ. Na rozdíl od C, kde NULL je jen ukazatel s adresou 0, v PHP, NULL, je jeho vlastní typ, kde platí pouze věc tohoto typu je NULL. To je mnohem užitečnější pro kontrolu chyb. V C, kde jsme měli tento problém, kde, pokud se vrátíte NULL, znamená to, že jste vrací ukazatel NULL nebo pomocí NULL znamenat chybu nebo všechny z toho zmatku jsme v jednom bodě. Zde, vrací NULL obecně znamená chybu. Spousta věcí se také vrátit false pro chybu. Ale bod je NULL typ, jediná věc, na NULL typu je NULL. Pak callback je jako můžete definovat některé anonymní funkce. Nemusíte dávat Tato funkce jméno, ale nebudete muset vypořádat s to tady. Při pohledu na jednotlivé typy, které se očekávají, abychom věděli, Co si myslíte, že typ 3,50 je? >> [Student] Float. Jo. Takže tady, co si myslíte, že typ to je? >> [Student] Array. Jo. První z nich byl plovák, druhý je pole. Povšimněte si, že toto pole není jako pole C kde máte index 0 má nějakou hodnotu, index 1 má nějakou hodnotu. Zde jsou indexy jsou a, b, c, a hodnoty jsou 1, 2, a 3. V PHP není žádný rozdíl mezi asociativním poli a jen pravidelné matici jak byste si mohli myslet na to v C. Tam je jen to, a pod kapotou pravidelný pole je jen asociativní pole kde 0 mapy do určité hodnoty stejným způsobem, jakým se mapuje na nějakou hodnotu. Z tohoto důvodu, může PHP být dost špatné pro rychlé rychlý kód / benchmarking věcí protože v C, když používáte pole víte, že přístup členem je konstantní čas. V PHP přístup člena je, kdo ví, kolik času? Je to pravděpodobně konstantní, pokud to hash správně. Kdo ví, co je to opravdu dělá pod pokličku? Vy opravdu potřebujete se podívat na provádění vidět, jak to bude s tím vypořádat. Takže fopen. Myslím, že tady řekněme PHP manuál fopen podívat se na návratový typ. Vidíme zde můžete vyhledat prakticky jakoukoli funkci v PHP manuálu a to je něco jako manuálové stránky PHP. Návratový typ bude zdrojem. To je důvod, proč jsem si to, protože jsme se opravdu definovat zdroj. Myšlenka zdroje, v C tak nějak dostal FILE * nebo cokoliv; v PHP zdroj je vaše FILE *. To je to, co budete se číst z, to je to, co budete k zápisu do. Je to obvykle externí, takže je to zdroj, který můžete vytáhnout věci z a házet věci. A konečně, co je typ NULL? >> [Student] NULL. Jo. Takže jediná věc, která je NULL NULL. NULL je NULL. Jedním z rysů systému typu PHP (pro lepší nebo horší), je jeho schopnost žonglovat typů. Když napíšete řádek kódu PHP, který kombinuje hodnoty různých typů, PHP se bude snažit udělat rozumnou věc. Vyzkoušejte každé z následujících řádků kódu PHP. Co vytisknout? Je to, co jste očekávali? Proč ano nebo proč ne? Tato skutečnost o PHP je to, co dělá to, co nazýváme slabě napsané. Slabě napsaný a silně zadali, existují různé způsoby využití těchto pojmů, ale většina lidí používá slabě napsaný a silně zadali znamenat něco takového kde ("1" + 2), že pracuje. V jazyce C, která nebude fungovat. Můžete si to představit nefunguje. Spousta lidí mix dynamické psaní a slabou zadáním a statické psaní a silné psaní. Python je dalším příkladem jazyka, který je dynamicky zadali. Můžete házet kolem typy proměnných, a to bude rozhodovat v běhu nějaké chybové checkings. V Pythonu to jde spustit to a uvidíte ("1" + 2); a to se nezdaří, protože říká, že nemůžete přidat string a integer. V PHP, který je stejně jako dynamicky napsaný, že to nebude nezdaří. Slabá psaní má co do činění s tím, že to dělá věci s typy které nejsou opravdu smysl nutně. So ("1" + 2), umím si představit, že je řetězec 12, dovedu si představit, že je řetězec 3, Dokážu si představit, že je celé číslo 3. To není nutně dobře definované, a my pravděpodobně bude k vidění že když jsme tisku ("1" + 2), je to asi skončí jako bytí odlišné než tisk (1 + "2"). A to bývá, podle mého názoru, k horšímu. Zde se můžeme pokusit tyto. Další malý trik o PHP je nemusíte skutečně zapisovat do souboru. To se spustit tento příkaz režimu. Takže php-r, pak můžeme hodit do příkazu zde: "Print ('1 '+ 2)," a já ti hodit nový řádek. Tato tištěná 3. Vypadá to, že vytiskne 3 a je to číslo 3. Takže teď si to zkusíme obráceně: "Print (1 + '2 '); Dostaneme 3, a je to také bude celé číslo 3? Upřímně netuším. Vypadá to, že je v souladu. Tam je nikdy žádné šance, že je řetězec 12 nebo něco podobného, ​​že protože PHP, JavaScript a na rozdíl od Java příliš, má samostatný operátor pro zřetězení. Spojování v PHP je dot. Takže tisk (1 '2 '.), Bude nám 12. To obvykle vede k záměně, kde se lidé snaží udělat něco jako str + = nějaká jiná věc, že ​​chtějí přidat na konec svého řetězce, a že se to nezdaří. Musíte udělat str. = Tak nezapomeňte zřetězení v PHP je tečka. Ostatní věci zkusit: print ("CS" + 50); Řekl jsem vám, že není naděje, že by to vedlo CS50 protože zřetězení není +. Co si myslíte, že to bude skončit? Upřímně nemají absolutně žádnou představu. Vypadá to, že je to jen 50. To vidí řetězec, a vsadím se, když dáme 123CS - To vidí první řetězec, pokusí se přečíst celé číslo od něj nebo z něj číslo. V tomto případě to vidí 123CS. "To nedává smysl, jako celé číslo, takže jsem jen myslet, že z 123." Takže 123 + 50 bude 173. A je to tady začne číst to jako celé číslo. To není nic vidět, tak to prostě bere to jako 0. Takže 0 + 50 bude 50. To já jsem za předpokladu to bude dělat něco podobného. Přemýšlím 99. Jo, protože to bude trvat první - Tak 99. Zde (10/7), kdyby to byla C, co by to vrátit? [Student] 1. >> Jo, by mělo být 1, protože 10/7, je rozdělení 2 celá čísla. Číslo děleno celé číslo bude vrátit celé číslo. To se nemůže vrátit 1 bod cokoliv, že by bylo, tak to jen tak vrátit 1. Zde tisku (10/7), že to bude skutečně interpretovat, že. A to znamená, že pokud si opravdu chcete udělat celočíselné zaokrouhlování a podobné věci, které, co musíte udělat, tisk (podlaha (10/7)); V jazyce C je to asi divné, že se můžete spolehnout na celé číslo zkrácení pravidelně, ale v PHP není možné, protože to bude automaticky proměnit v hotovost. A pak (7 + true); co si myslíte, že to bude? Hádám, 8, pokud to bude vykládat jako pravdivé 1. Vypadá to, že je to 8. Takže něco, co bychom udělali v posledních 10 minut, měli byste naprosto nikdy dělat. Uvidíte kód, který to dělá. To nemá být tak snadné, jak to. Ty by mohly mít 2 proměnné, a 1 proměnná se stane, že řetězec a jiné proměnné se stane, že int, a pak přidat tyto proměnné společně. Vzhledem k tomu, PHP je dynamicky napsaný a že to nebude mít žádný typ kontroly pro vás a od té doby je to slabě typovaný a protože to bude jen automaticky hodit tyto věci dohromady a všechno bude vše fungovat, je to těžké ani neví, že tato proměnná musí být řetězec teď, takže by ji přidat do této proměnné, což je celé číslo. Nejlepší praxe je, pokud je proměnná řetězec, mějte ji jako řetězec navždy. Pokud je proměnná int, mějte ji jako int navždy. Pokud se chcete vypořádat s celými čísly a řetězce, můžete použít varsint - to je JavaScript. Intval. Dělám to po celou dobu. PHP a JavaScript míchám se všechno. Takže intval bude vrátit celočíselnou hodnotu proměnné. Pokud jsme se projít v "tisku (intval ('123 ')); dostanete 123. Intval sám není dělat kontrolu pro nás, že je to pouze číslo. Manuální PHP, tam jsou jen tolik funkce k dispozici, tak tady si myslím, to, co bych použít, je funkci is_numeric první. Hádám, že se vrátil false. To je další věc, kterou musíme projít, je. === Takže funkci is_numeric ('123df "), měli byste se to brát jako funkci is_numeric. V C budete muset iteraci všechny znaky a zkontrolujte, zda každá postava je číslice nebo cokoliv jiného. Zde funkci is_numeric bude to pro nás, a to se vrací false. Takže když jsem vytiskl, že to vytiskne nic, tak jsem tady porovnání je vidět, jste náhodou být nepravdivý? A tak teď je to tisk 1. Zřejmě to vytiskne 1 jako pravdivý místo tisku pravdivé jako pravdivé. Zajímalo by mě, jestli mám print_r. Ne, to ještě dělá 1. Vraťme se zpět k ===, == stále existuje, a pokud budete mluvit s Tommym řekne == je naprosto v pořádku. Já řeknu, že == je hrozné a nikdy byste neměli používat. == Rozdíl je v tom == porovnává věci kde může být pravda, i když to není stejného typu, vzhledem k tomu, === porovnává věci a první to jsou kontroly, které stejný typ? Ano. Dobře, teď jdu zjistit, jestli skutečně v porovnání s rovnat. Zde získáte divné věci, jako je 10 rovná - Pojďme se podívat, co to říká. Takže ('10 '== '1 e1'); To vrátí true. Má někdo nějaké dohady, proč to vrátí pravda? To není jen o tom. Možná je to náznak. Ale když jsem se změnit na f - zatraceně to! I nadále používat uvozovky. Důvodem jsou uvozovky jsou na mě řvát, je proto, že jsem si tohle v uvozovkách. Takže jsem mohl uniknout uvozovek sem, ale jednoduché uvozovky snazší. Takže ('10 '== '1 F1'); nevytiskne pravda. ('10 '== '1 E1'); vytiskne pravda. [Student] Je to hex? >> Není to hex, ale je to blízko, že je to jako - 1E1, vědecké notace. Uznává 1E1 jako 1 * 10 ^ 1 nebo cokoliv. Ti jsou rovné celá čísla. Pokud se nám to === pak to bude false. Vlastně jsem tušení, jestli budeme dělat == co (10 a '10abc ");? Dobrá. Tak to je pravda. Takže stejně jako když jste (10 + '10abc "), a to by bylo 20, zde (10 == '10abc '); je pravda. Ještě horší jsou věci jako (false == NULL); je pravda nebo (false == 0), je pravda, (false == []); Existují podivné případy - To je jedna z těch podivných případů. Všimněte si, že (false == []); je pravda. ('0 '== False); je pravda. ('0 '== []); Je false. Takže == je v žádném případě tranzitivní. může být rovná b a může být rovná c, ale b nemusí být rovna c.. To je ohavnost pro mě, a vy byste měli vždy používat. === [Student] Můžeme to udělat! == Stejně? >> [Bowden] Ano. Ekvivalent by být! = A! ==. To je vlastně vychován v PSet spec kde mnoho funkcí návratu - Použití PHP je dobré o tom. Klade ve velkém červeném poli, "To vrátí false, pokud je chyba." Ale vrací 0, je naprosto rozumný věc vrátit. Přemýšlejte o jakékoli funkci, která se očekává, že vrátí celočíselnou hodnotu. Řekněme, že tato funkce má spočítat počet řádků v souboru nebo tak něco. Za normálních okolností, předáte této funkci souboru a bude to vrátí celočíselnou hodnotu, která představuje počet řádků. Takže 0 je zcela přiměřený počet, pokud soubor je jen prázdný. Ale co když předat neplatný soubor a funkce se stane vrátit false Pokud předat neplatný soubor? Pokud jste právě dělat == jste nerozlišuje případ mezi neplatný soubor a prázdný soubor. Vždy používejte ===. To je vše z nich. V PHP, typ pole se liší od toho, co jste zvyklí v C. Opravdu, možná jste již všimli výše, když jste viděl, že to je typ pole. Držák Syntaxe je nová od PHP 5.4, která je nejnovější verze PHP. Než to si vždycky museli psát pole ('a' -> 1, 'b' -> 2. To bylo konstruktor pole. Nyní PHP konečně přišel kolem pěkné syntaxi pouhých hranatých závorkách, která je jen o tolik lepší než pole. Ale vzhledem k tomu PHP 5.4 je nejnovější verze, se můžete setkat místa, která nemají ani PHP 5.3. Přes léto jsme narazili na tento problém, kde PHP 5.3 bylo to, co jsme měli na zařízení, ale server, který jsme nasadili všechny naše studijní knihu a odeslat a všechny ty věci, aby Byl PHP 5.4. Není to věděl, jsme vyvinuli v 5,3, tlačil na 5,4, a teď najednou nikdo z našeho kódu funguje protože tam se stalo, že byly změny mezi 5,3 a 5,4 které nejsou zpětně kompatibilní, a máme jít a opravit všechny naše věci, které nefungují pro PHP 5.4. Pro tuto třídu, protože zařízení má PHP 5.4, to je naprosto v pořádku používat hranaté závorky. Ale pokud hledáte do věcí po internetu, pokud hledáte nějakou druh pole věci, s největší pravděpodobností budete vidět kouzlo se syntaxí konstruktoru Array, protože to je už od PHP se narodil a hranatá závorka syntaxe byl asi za posledních pár měsíců nebo kdykoliv 5,4 obešel. To je, jak se index. Stejně jako v C, jak byste index v hranatých závorkách jako $ pole [0], $ array [1], $ array [2], indexování stejným způsobem, pokud se stalo, že se vaše indexy že řetězce. Takže $ array ['a'] a $ array ['b']. $ Array [b]. Proč by to být v pořádku? To bude pravděpodobně generovat varování, ale stále fungují. PHP inklinuje k tomu, že. To inklinuje jen, "budu vás varovat o tom, ale já jsem prostě jít dál "A dělat, co budu moci." To bude pravděpodobně si to přeložit na řetězec, ale je možné, že v určitém okamžiku v minulosti někdo řekl, define B, které se "HELLO WORLD". Takže teď b může být konstantní a $ array [b] bude skutečně dělat "HELLO WORLD". Myslím, že v tomto okamžiku, nebo alespoň naše PHP nastavení, Pokud se pokusíte index do pole, a že klíč neexistuje, bude to nepodaří. Já si nemyslím, že to bude jen varovat. Nebo alespoň si můžete nastavit tak, aby se nejen vás varovat, že jen rovně nahoru nezdaří. Způsob, jak zjistit, zda skutečně existuje taková index je isset. Takže isset ($ array ['HELLO WORLD "]) vrátí false. isset ($ array ['b']) vrátí true. Můžete kombinovat této syntaxi. Jsem si jistý, co to pole by skončit, je - můžeme vyzkoušet si to. Oh, potřebuji PHPWord. To je míchání syntaxe, kde zadáte, co je klíč a není specifikováno, co je klíč. Takže 3 tady je hodnota. Jste výslovně řekl, co jeho hlavní bude. Co si myslíte, že jeho klíč bude? [Student] 0. >> Hádám 0 jen proto, že je to první jsme ještě neurčili. Můžeme skutečně udělat pár těchto případů. Takže print_r je vytisknout rekurzivní. Bude-li vytisknout celý pole. To by vytisknout subarrays na pole, pokud byla nějaká. Takže print_r ($ array); php.test.php. Vypadá to, jako by dal 0. Je tu vlastně něco mít na mysli, ale budeme se vrátit k ní v druhém. Ale co když jsem se náhodou, aby se tento index 1? PHP nerozlišuje mezi řetězce indexy a celočíselných indexů takže v tomto bodě jsem právě definoval index 1 a můžu si dělat i $ pole [1] a $ array ['1 '] a to bude stejný index a stejný klíč. Tak co teď myslíš, že 3 bude? >> [Student] 2. >> [Bowden] Hádám 2. Jo. Je to 2. Co kdybychom to je 10, to je 4? Co si myslíte index 3 bude? Přemýšlím 11. Můj odhad na to, co dělá PHP - a myslím, že jsem to viděl před - je to jen sleduje, co nejvyšší číselná index to používal doposud je. Je to nikdy přiřadit řetězec index 3. To bude vždy číselná index. Tak to udržuje nejvyšší k němu patří účelově tak daleko, který se stane být 10, a bude to dávat 11-3. To, co jsem řekl předtím, všimněte si, jak je to tiskne toto pole. Vytiskne klíče 10, klíč 4, klíč 11, tlačítko d. Nebo dokonce jdem - Asi jsem neměl dát 0, ale je to tisk 1, 2, 3, 4. Co když přejdu tu? Nebo pojďme skutečně přejít tyto 2. Nyní se vytiskne 2, 1, 3, 4. PHP pole nejsou stejně jako vaše pravidelné tabulky hash. Je to naprosto rozumné uvažovat o nich jako hash tabulky 99% času. Ale ve svých hash tabulkách nemá smysl v pořadí, ve kterém byly vloženy věci. Takže jakmile vložíte jej do hash tabulky, Předpokládám, že to není propojený seznam a vy jste mohli posoudit v rámci propojeného seznamu který byl vložen jako první. Ale tady jsme se vkládá 2 první a ví, kdy to tisku z tohoto pole, že 2 je na prvním místě. To není jej vytisknout jen v libovolném pořadí. Technické údaje struktura, která je to s použitím je uložena mapa, tak to mapuje klíče hodnot a pamatuje pořadí, ve kterém byly vloženy tyto klíče. V podstatě je to pro některé komplikace, kde je to otravné skutečně - Řekněme, že máte pole 0, 1, 2, 3, 4, 5 a chcete, aby se index 2. Jedním ze způsobů, jak to udělat, podívejme se jak to vypadá. 0, 2, 1, 3, 4. Odstavení se stane odjistí obě proměnné a pole indexů. Takže unset ($ pole [2]); Teď, co se to bude vypadat? 2 je prostě pryč, tak to je naprosto v pořádku. Více nepříjemné je, pokud chcete, aby věci skutečně jako pole. Dám náhodných čísel. Nyní všimnete mé indexy. Chci, aby to být jen jako pole C, kde to jde od 0 do délky - 1 a můžu iterovat přes to jako takový. Ale jakmile jsem se odjistí druhý index, co bylo v indexu 3 není nyní stal index 2. Místo toho to prostě odstraní tento index a teď jdete 0, 1, 3, 4. To je naprosto rozumné. Je to jen nepříjemné a vy budete muset dělat věci, jako je pole spojovat. Jo. [Student] Co by se stalo, kdyby jste měli pro smyčce a chtěli byste jít přes všechny prvky? Když to hit 2, by to dát někdy? Iterace přes pole. Existují 2 způsoby, můžete to udělat. Můžete použít pravidelné smyčky for. To je další složitost PHP. Většina jazyků, řekl bych, má nějakou délku nebo len, nebo tak něco označující délku pole. V PHP je to count. Takže count ($ array); $ i + +) Řekněme, tisk ($ array [$ i]); Notice: Undefined offset: 2. Je to jen tak nepodaří. To je důvod, proč, z větší části, už nikdy nebudete muset iteraci pole, jako je tento. To by mohlo být přehnané, ale už nikdy nebudete muset iteraci pole, jako je tento protože PHP poskytuje své foreach syntaxi, kde foreach ($ pole as $ item). Nyní, když jsme se tisknout ($ item); - Dáme projednávat v druhé -, že funguje naprosto v pořádku. Způsob, jakým foreach pracuje, je první argument je pole, které jste iterace. A druhý argument, bod, díky každém průchodu smyčky for to bude trvat na další věc v poli. Takže pamatujte pole má rozkaz. Poprvé přes cyklus for, položka bude 123 pak to bude 12 pak sníží o 13, pak bude 23, bude to 213. Věci se opravdu divně, když děláte něco takového foreach. Podívejme se, co se stane, protože byste nikdy neměli udělat. Co kdybychom unset ($ array [1]); To bylo pravděpodobně očekávali. Ty iterace tohoto pole, a pokaždé, když budete zajištění a odjištění první index. Takže pro index 0, první věc, bod bere na hodnotu 0, takže to bude 123. Ale uvnitř smyčky for my unset index 1, tak, že znamená 12 je pryč. Tak tisku. PHP_EOL. PHP_EOL je jen řádek, ale je to technicky více přenosný od konce řádků v systému Windows se liší od konce řádků na Mac a UNIX. Na Windows newline je \ r \ n, vzhledem k tomu, všude jinde to bývá, jen aby se \ n. PHP_EOL je nakonfigurován tak, aby používal bez ohledu řádek vašeho systému je. Tak tisku, že. Pojďme se print_r ($ array) na konci. Neměl jsem tušení, že by chování. 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. Neberte mé slovo, ale vypadá to, že foreach vytvoří kopii pole a pak se položka nabývá všech hodnot této kopie. Takže, i když změníte pole uvnitř smyčky for, to bude jedno. Položka bude na původních hodnotách. Pojďme zkusit odjištění ji. Co když je to $ array [1] = "ahoj"; I když jsme dali "hello" do pole, bod nikdy netrvá na tuto hodnotu. Je tu další syntaxe foreach smyčky , kde můžete dát 2 proměnných oddělených šipkou. Tento první proměnná se bude klíčovým této hodnoty, a tato druhá proměnná bude stejný přesný položka. To je nezajímavé zde, ale pokud bychom se vrátit k naší původní případě "A" -> 1, "B" -> 1, zde, pokud jsme jen iteraci pro každé pole jako položka, položka bude 1 pokaždé. Ale pokud chceme také znát klíč spojený s danou položku pak děláme jako $ key -> $ položky. Takže teď můžeme udělat tisku ($ key. ":". Teď je to iterace a tisk jednotlivých tlačítek a jejich přidružené hodnoty. Další věc, kterou můžeme udělat v foreach smyček je můžete vidět tuto syntaxi. Ampersandy před názvy proměnných mají tendenci být jak PHP dělá odkazy. Kde jsou odkazy velmi podobné ukazatele, nemáte ukazatele, takže nikdy jednat s pamětí přímo. Ale vy máte odkazy, kde 1 proměnná se odkazuje na stejnou věc, jako jiné proměnné. Uvnitř zde pojďme dělat $ item. Pojďme zpět k 1, 10. Pojďme udělat $ item + +; To ještě existuje v PHP. Můžete stále dělat + +. php.test.php. Musím vytisknout. print_r ($ array); Tiskneme 2, 11. Kdybych právě udělal foreach ($ pole as $ item), pak položka bude hodnota 1 poprvé přes smyčku. To bude zvyšovat 1-2 a pak jsme hotovi. Takže pak to půjde přes druhého průchodu smyčkou a tato položka je 10. To zvýší položka 11, a pak to je jen vyhodit. Pak jsme print_r ($ array), a podívejme se, že je to jen 1, 10. Takže přírůstek jsme se ztratili. Ale foreach ($ array as $ item a) Nyní tato položka je stejná položka toto právo zde. Je to to samé. Takže $ item + + je modifikace pole 0. V podstatě, můžete si také udělat $ K -> $ položky a můžete to udělat $ array [$ k] + +; Takže další způsob, jak dělat to, že jsme svobodní změnit položku, ale to nezmění náš původní pole. 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íč a zvýšit že. Tento více přímo modifikuje naši původní nabídku. Dokonce si můžete udělat, že pokud z nějakého důvodu chtěli schopnost upravovat - Vlastně, to je naprosto rozumné. Nechtěl jsi muset napsat $ array [$ k] + +, jste jen chtěl napsat $ item + +, ale stále chtěl říci if ($ k === '") pak přírůstek položku a poté vytisknout naší nabídku. Tak co teď očekáváme print_r dělat? Jaké hodnoty by měly být vytištěny? [Student] 2 a 10. >> [Bowden] Pouze v případě, že klíč byl "" my skutečně vytisknout, že. Pravděpodobně jste velmi zřídka, pokud vůbec, bude muset definovat funkce v PHP, ale můžete vidět něco podobného, ​​kde můžete definovat funkci jako funkce cokoliv. Obvykle byste řekl ($ foo, $ bar) a poté jej definovat jako něco, co. Ale když jsem to, pak to znamená, že bez ohledu na volání cokoliv, bez ohledu na volání baz, takže první argument předán baz lze změnit. Pojďme udělat $ foo + +; a uvnitř tady jdem BAZ ($ item); Nyní jsme volání funkce. Argument je pořízena odkazem, což znamená, že pokud změníme ho jsme úpravou věc, která byla předána dovnitř A tisk to očekáváme - pokud jsem zpackal syntaxi - máme 2, 11, takže to bylo vlastně zvýší. Všimněte si, že potřebujeme odkazy v 2 místech. Co když jsem to udělal? Co to znamená? [Student] se změní. Jo >>. Položka je jen kopie hodnoty v poli. Takže bod se změní na 2, ale pole ['a'] bude stále 1. Nebo co když to udělám? Nyní položka je poslán jako kopii Baz. Takže kopie argumentu bude zvýšen na 2, ale bod sám byl nikdy zvýšen 2. A položka je totéž jako pole držáku cokoliv, takže pole bylo nikdy zvýšen. Takže obě tato místa potřebují. PHP je obvykle docela chytrý o tom. Můžete si myslet, chci předat odkazem - Toto bylo vlastně otázka na jednom z psets. Byla to questions.txt věc, kde se říká, Proč by se chcete předat tuto struct odkazem? Co bylo odpověď na tuto otázku? [Student] Takže nemusíte kopírovat něco velkého. Jo >>. Struct může být libovolně velký, a když minete struct se jako argument je třeba, aby zkopírujte celý struct předat jej do funkce, vzhledem k tomu, pokud jste právě předat struct odkazem pak to prostě musí kopírovat 4-byte adresy jako argument funkce. PHP je trochu chytřejší než to. Pokud mám nějakou funkci a předám do něj řadu 1000 věcí, znamená to, že to bude muset zkopírovat všechny 1000 z těch věcí předat do funkce? Nemusí k tomu, že okamžitě. Je-li uvnitř této funkce vlastně nikdy upravuje foo, takže if ($ foo === 'hello') return true.; Povšimněte si, že vlastně nikdy změněna argument uvnitř této funkce, což znamená, že vše, co bylo předána jako foo nikdy, je nutné zkopírovat protože to není jeho úpravu. Takže cesta PHP funguje, je argumenty jsou vždy předány odkazem dokud se skutečně snaží modifikovat. Teď když řeknu, že $ foo + +, to bude nyní vytvořit kopii původního foo a upravit kopii. To šetří čas. Pokud jste nikdy dotýkat tuto masivní pole, jste vlastně nikdy změnit to, není třeba, aby se kopie, vzhledem k tomu, jestli jsme jen dát tuto ampersand To znamená, že není ani kopírovat i když se to změnit. Toto chování se nazývá copy-on-write. Uvidíte ho i na jiných místech, zvláště pokud užíváte operačního systému kurz. Copy-on-write je docela obvyklý vzor, ​​kde si nemusíte pořizovat kopie něco pokud je to skutečně mění. Jo. [Student] Co kdyby jste měli přírůstek uvnitř testu, tak jen 1 prvek z 1000 by bylo třeba změnit? Nejsem si jistý. Myslím, že by zkopírovat celou věc, ale je možné, že je dost chytrý, aby - Vlastně, co si myslím, je představit jsme měli pole, které vypadá takto: $ pole2 = [ Pak index "a" je pole [1 2 3 4], a index "b" je pole cokoliv. Musím čárky mezi všemi z nich. Představte si, že tam jsou čárky. Pak 'c' je hodnota 3. Dobře. Nyní řekněme, že my $ baz ($ pole2); kde baz nebere to odkazem. Takže $ foo ['c'] + +; To je takový příklad, kdy jsme kolem pole2 jako argument a potom se mění v konkrétní index pole o zvyšování ji. Upřímně netuším, co PHP se chystá udělat. To lze snadno vytvořit kopii celého věc, ale pokud je to chytrý, to bude kopie těchto klíčů, kde to bude mít své odlišné hodnoty ale toto může ještě poukázat na stejné pole 1,2,3,4 a toto může ještě poukázat na stejné pole. Budu iPad to. Míjíme v tomto poli, kde ten chlap body 3, ten chlap body [1,2,3,4], ten chlap poukazuje na [34, ...] Teď, když jsme kolem jej do baz, jsme mění toto. Pokud PHP je chytrý, to může jen dělat - Jsme pořád museli kopírovat nějakou paměť, ale pokud tam byly tyto obrovské vnořené subarrays jsme nemuseli kopírovat ty. Já nevím, jestli je to to, co to dělá, ale dovedu si představit, že to dělá. To je také docela velkou výhodou C po PHP. PHP je život tak mnohem jednodušší pro mnoho věcí, ale tak nějak nemají absolutně žádnou představu, jak dobře to bude provádět protože nemám ponětí, pod kapotou, když je to dělat tyto kopie věcí, oh, je to, že bude konstantní časové kopie, je to jen změní 1 ukazatel, je to bude směšně těžké lineární kopie? Co když to nemůže najít místo? Je to pak třeba spustit úklid dostat některé více prostoru? A garbage collection může trvat libovolně dlouho. V C nemusíte mít strach o těchto věcech. Každý řádek, který vám napsat můžete do značné míry uvažovat o tom, jak to bude provádět. Pojďme se podívat zpět na to. Jak příjemné je to, že nemusíte řešit hašovacích funkcí, propojené seznamy, nebo něco podobného, ​​že? Vzhledem k tomu, pracovat s hash tabulek je tak snadné teď, tady je zábavná logická pracovat. Otevřete soubor s názvem unique.php a v něm napsat program, PHP (Také známý jako "scénář"). Máme tendenci volat jim skripty, pokud jsou krátké věci, které spustíte z příkazového řádku. V podstatě, každý jazyk, který nesestavují, ale budete spustit spustitelný soubor na příkazovém řádku, můžete volat, že spustitelný skript. Mohl bych stejně dobře napsat program v jazyce C, který to dělá, ale nemyslím si, říkám skript, protože jsem se poprvé zkompilovat a spustit binárku. Ale tento program PHP budeme volat skript. Nebo pokud bychom ji napsal v roce Python nebo Perl nebo Node.js nebo některý z těchto věcí, bychom jim říkat, že všechny skripty, protože jejich spuštění v příkazovém řádku ale nemáme zkompilovat. Mohli bychom to docela rychle. Nebudeme používat argv. Řekněme, foukat přes to. Nazvěme to jedinečné, napsat program. Můžete předpokládat, že vstup bude obsahovat jedno slovo na řádku. Vlastně, bude argv být dost triviální použití. unique.php. První věc, kterou nejprve chceme zjistit, jestli jsme byli předáni 1 argument příkazového řádku. Stejně jako byste očekávat, že argc a argv v C, máme stále ty v PHP. Takže if ($ argc! == 2) pak nebudu zabývat tisku zprávy nebo tak něco. Já budu jen opustit, chybový kód 1. Mohl bych také vrátit 1. Zřídka v PHP jste v tomto stavu, kdy jsme na - Obvykle jste ve funkci nazývá funkce volána funkce nazývá funkce. A když se něco pokazí a vy jen chcete opustit všechno úplně, exit jen ukončí program. To také existuje v C. Pokud jste ve funkci ve funkci do funkce ve funkci a chcete jen zabít program, můžete volat exit a bude to prostě ukončit. Ale v PHP je to ještě vzácnější, že jsme na této nejvyšší úrovni. Obvykle jsme uvnitř jakési funkce, proto ho označujeme východ tak, že jsme se nemuseli vracet do 1 věc, které si pak uvědomí, že je chyba tak, že se vrátí až v případě, že uznává, že je to chyba. Nechceme, aby se s tím vypořádat, tak ukončete (1); return (1), v tomto případě by bylo rovnocenné. Pak to, co chceme otevřít chceme fopen. Argumenty budou vypadat dost podobně. Chceme fopen ($ argv [1], a chceme jej otevřít pro čtení. , Který vrací zdroj, který jdeme volat f. To vypadá dost podobně, jak to dělá C až nemáme říkat soubor *. Místo toho jsme jen říct, $ f. Dobře. Vlastně si myslím, že to dokonce nám dává náznak jako na funkci PHP s názvem souboru. PHP souboru. Co to udělá, je přečíst si celý soubor do pole. Nemusíte ani potřeba fopen ho. Bude to udělá za vás. Takže $ lines = file ($ argv [1]); Nyní všechny řádky v souboru jsou v řadách. Nyní chceme seřadit řádky. Jak můžeme řadit řádky? My třídit řádky. A nyní můžeme vytisknout nebo cokoliv jiného. Pravděpodobně nejjednodušší způsob je foreach ($ linky jako $ line) echo $ line; [Student] Nebylo by dokonce jsme překročit čáry odkazování něco do druhu? To je místo, kde by se trochu možné definovat jako funkce sort (& $ array). Při volání funkce nechcete předat odkazem. Je to funkce, která definuje to, jako že se to jako reference. To je vlastně přesně to, co se stalo když dáme vše na našich serverech, když jsme šli 5,3 až 5,4. Až do 5,4, to bylo naprosto rozumné. Funkce neočekává to brát jako referenční, ale můžete předat jako referenční takže pokud funkce nemá náhodou upravit, je to ještě upravit. Jak 5,4, jste neměl dělat. Takže teď jediný způsob, jak předat odkazem, je-li funkce výslovně dělá. Pokud nechcete, aby se ji změnit, pak se budete muset udělat, $ copy = $ tratě a průchod kopie. Takže teď linky budou zachovány a kopie se změní. php.unique.php. Možná jsem pokazil něco vymyslet. Neočekávaná "sort". Tam to bude něco, co to dělá pro nás. Není to ani tam. Všimněte si, když si přečtete v příručce, že první argument se očekává, že bude pole a trvalo odkazem. Proč je tento stěžuje na mě? Protože mám tuto funkci druh stále tady, že nechci. Dobře, php.unique.php. Nechtěl jsem předat argument, protože nemám soubor. Je to php.unique.php na test.php. Zde je test.php vše vytisknout v pěkné seřazeném pořadí. Všimněte si, že jsou seřazena řád je trochu divné pro kód souboru protože všechny naše prázdné řádky budou na prvním místě pak se přijde všem našim 1 level vroubkováním pak přijď všechny naše bez zářezů. Jo. >> [Student] Tak zdrojového kódu nebyla předána odkazem? Je to, že obecně předávány hodnotou? [Bowden] Když zavoláte funkci, nikdy určuje, zda byl přijat odkazem. Je to definice funkce, která určuje, zda byl přijat odkazem. A při pohledu na funkce definici druhu, nebo jen při pohledu na to, trvá argumentu odkazem. Takže bez ohledu na to, zda chcete, aby ji pomocí odkazu, dělá si to odkazem. Upravuje pole v místě. To je prostě není povoleno. Nemáte oprávnění k tomu. >> [Student] Oh, dobře. [Bowden] Toto, sort bude trvat linky s odkazem a upravit ji. A opět, pokud jste nechtěli, aby dělal to, že byste mohli udělat kopii druhu. I v tomto případě, kopie není ve skutečnosti kopie linek. Je to jen ukazuje na stejnou věc, dokud to nejprve dostane upravené, kde to se nejprve dostat upravena v třídění funkce, kde, protože je to kopírování při zápisu, nyní kopie kopie se bude provedena. Můžete si také udělat. To je další místo, kde můžete vidět ampersand. Vidíte to ve smyčkách foreach, můžete vidět v deklarace funkce, a uvidíte, když právě přiřazování proměnných. Nyní jsme dosáhli nic a díky tomu protože kopírování a linky jsou doslova totéž. Můžete použít řádky a zkopírovat zaměnitelně. Můžete to udělat unset ($ kopii), a že není unset linky, můžete jen ztratit svůj odkaz na stejnou věc. Tak jako tohoto bodu, nyní vedení je jediný způsob, jak můžete přistupovat řádky. Otázky? Jo. [Student] Úplně mimo téma, ale nemusíte uzavřít PHP s - >> Ty ne. Dobře. [Bowden] bych jít až tak daleko, že říkají, že je to špatné praxe ukončit. To je asi přehnané, zejména ve skriptu, ale uvidíme, co se stane, když udělám tohle. To neudělal nic. Co když jsem chtěl - [povzdechne si] Musím předat argument. Shoot. Volal jsem to špatně. Takže php.unique.php s argumentem. Teď nemám ani potřebovat. Předám to platný argument. Tato tištěná, co je to tisk. Jsem tisku kopie a kopie neexistuje. Tak linky. Je vytištěna všechno, a pak zjistíte všechny tyhle krámy tady, protože v ničem PHP, který je mimo PHP tagy je jen tak být vytištěny doslova. To je důvod, proč HTML, je to tak pěkné, že můžu dělat div bla, bla, bla třídu nebo cokoliv, bla, bla, bla a pak udělat nějaké PHP kód a poté proveďte konec div. A teď tisku to budu mít pěkné div se nahoru, všechno, co PHP tištěný, div na dně. Katastrofální, když se něco takového stane, což je docela běžné, jen zbloudilá řádek v dolní části souboru. Ty by si, že to by bylo, že velký problém dokud vezmete v úvahu fakt, že s prohlížeči - Jak přesměruje práci nebo v podstatě jakékoli záhlaví práce, když si připojení k webovému serveru a odešle zpět všechny tyto hlavičky a věci jako reakci 200 nebo reakce přesměrování nebo cokoliv, záhlaví jsou platné pouze do první bajt dat je odeslán. Můžete přesměrovat tisíckrát, ale jakmile první bajt dat je odeslán jste neměl k přesměrování znovu. Pokud se mají rozptylové řádek v dolní části souboru a řekněme, že jste tuto funkci použít, a pak chcete - Řekněme, že je to další soubor, který je index.php a require_once něco - Já si nemyslím, že je dobrý příklad toho. Problém se stane, když dostane zopakoval tento řádek v dolní části. Nemusíte mít nic společného byly rezonovat ještě. I když jste neměli v úmyslu na nic dostat ozývalo, to něco dostat ozvěnou a tak teď jste neměl posílat žádné další záhlaví a budete se stížností. Prostě není třeba tyto uzavírací tagy. Pokud máte v plánu na tom něco s HTML - a je to naprosto rozumné udělat tady div cokoliv a pak na tomto místě si můžete nebo nemůžete zahrnout. To nezáleží. Ale v PHP skripty je to vzácné, zavřete jej. Když je všechno PHP, absolutně všechno, nemáte opravdu potřebujete zavřít / byste neměli zavřít. Jednání s řetězci je mnohem hezčí, než v C. V PHP můžete zadat řetězec s jednoduchými nebo dvojitými uvozovkami. S jednoduchými uvozovkami není možné použít "escape" sekvence. Neustále uniknout, bla, bla, bla. Takže printf je velmi vzácný v PHP. 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. Ale vy chcete dělat 001.jpg 002.jpg a. Takže pro tento druh věcí, kde jsem vlastně chtít naformátovat text bych použít printf. Ale jinak bych prostě použít zřetězení. Nikdy jsem použít printf. Jsme jen rozlišovat detaily mezi apostrofy a dvojité uvozovky. Největší rozdíl je, že jednoduché uvozovky, bude vytištěn doslova. Tam je žádný znak typu dat v PHP, na rozdíl od C, takže to je ekvivalentní to. Jsou oba řetězce. A pěkná věc o jednotlivých citátem řetězců je, že jsem mohla říct "ahoj svět!" bla, bla, bla, $ $ Wooo. Co se stane, když jsem tisknout je, že bude tisknout to doslova. Pojďme se zbavit všech našich věcí. Takže echo $ str1; Je to doslova tištěné všechny ty věci: znaky dolaru, Zpětné lomítko n, které byste myslíte, že by bylo nové řádky - všechny ty věci se vytiskne doslova. Jediná věc, kterou potřebujete k útěku, jsou jednoduché uvozovky protože jinak by si, že to zavírání apostrofy. Uvozovky, zcela odlišné. Vidíme, že zvýrazňování syntaxe je cluing nás na to, co je asi jít hrozně špatně. php.unique. Undefined variable: wooo, protože to je interpretováno jako proměnná s názvem wooo. Uvozovky vám vložit proměnné do - Řekněme, že $ name = "Rob"; Takže echo "Ahoj, mé jméno je $ name!"; Uznává to jako proměnné. Když běžím, že - a já se vloží nový řádek - Ahoj, mé jméno je Rob! a hello world! To je proto, že jsem nikdy odstraněn tisk wooo výše. K dispozici je 1 další krok můžete udělat. $ Pole = [1, 2, 3]; Co když chci tisknout první index pole? Vy $ pole [0]. Na zvýraznění syntaxe je stopa. Co je to dělat? php.unique. Ahoj, mé jméno je 1! což není to, co jsem chtěl. Zvýraznění syntaxe mi lhal. Zkusme '' -> 1, 'b' -> 2. To je, jak bych si to napsat. Neočekávaný apostrof (T_ENCAPSED bla, bla, bla, bla, bla). Myšlenka je, že to není to přiznáváme jako součást pole. Je to přiznáváme jako pole indexované dopisem na. Chcete-li udělat ve složených závorkách, a nyní, co je v tomto rovnátka kudrnatými bude interpolovat, což je slovo, které používáme pro magicky vložení těchto proměnných do správných místech. Nyní dělá, php.unique, a Ahoj, jmenuji je 1! podle očekávání nebo Ahoj, jmenuji se Rob! Jedna věc, která je docela hezké o jednotlivých citací je, že - Tam je nějaký náklady na interpolační. Pokud používáte dvojité uvozovky, interpret musí jít přes tento řetězec, Ujistěte se, že, "Oh, tady je proměnná. Teď musím jít pro tuto proměnnou a vložte jej sem." I když nechcete používat žádné proměnné, nic uvnitř těchto uvozovek musí být přerušen, ale to bude ještě pomalejší, protože je třeba jít přes uvozovek Hledám věci, které je třeba interpolovat. Takže jediné citace může být trochu rychlejší, pokud nemusí nic být přerušen, a mám tendenci používat i jednoduché uvozovky pro, "Ahoj, mé jméno je". $ Array ['a'] stejně. To se děje za rovnocenné, co jsme měli předtím. Ale je to věc názoru. Pokud používáte PHP, pravděpodobně nezajímá o rozdílu rychlostí. Není dostatek rozum, ven začít. Jakékoliv konečné otázky? My vlastně ani dostat přes to všechno, ale tohle byla nuda. Poslední věc, která je docela hezké v PHP je, když máte co do činění s HTML, budete používat to trochu, tak si pěkné místní syntaxe pro tisk proměnné. Bez uvedení PHP zde, toto je nazýváno krátké tagy. Oficiálně od PHP 5.4, je zastaralý to. Je doporučeno, aby php. Toto je i nadále podporována, takže krátké tagy s