[Powered by Google Translate] [§ 8 - Mer komfortabelt] [Rob Bowden - Harvard University] [Dette er CS50. - CS50.TV] Disse uken avsnittsnoter kommer til å være ganske kort, så jeg bare kommer til å fortsette å snakke, er dere kommer til å fortsette å stille spørsmål, og vi vil prøve å fylle opp så mye tid som mulig. Mange tror at dette pset er ikke nødvendigvis vanskelig, men det er veldig lenge. Den pset spec selv tar en time å lese. Vi gir deg en rekke SQL kan du muligens trenger å bruke. Vi går gjennom mye av det, så det bør ikke være så ille. Har noen gang eller ferdig? Det er den siste pset. Herregud. Vanligvis er det en JavaScript ene etter dette, men kalender endre ting gjør alt en uke kortere, og vi ikke lenger har en JavaScript pset. Jeg vet ikke hvordan det påvirker om JavaScript kommer til å vises på eksamen eller Quiz 1. Jeg antar det vil være noe som du trenger å vite høyt nivå ting om JavaScript, men jeg tviler på at vi ville bare gi deg rett JavaScript-kode siden du ikke har hatt en pset i den. Men det vil være ting for quiz vurdering neste uke. Seksjon for spørsmål. Mye av dette er ting litt dårlig formulert, men vi vil diskutere hvorfor. I motsetning til C, er PHP et "dynamisk skrevet" språk. Hva betyr dette, spør du? Vel, si farvel til alle de røye, float, int, og andre søkeord du må bruke når erklære variabler og funksjoner i C. I PHP er en variabel typen bestemmes av verdien som det er for tiden holder. Så før vi skriver denne koden i en fil som heter dynamic.php, PHP er dynamisk skrevet. Det er sant. Jeg er uenig med det faktum at det betyr at vi sier farvel til røye, float, int, og andre søkeord. Den eksakte forskjellen mellom dynamisk skrevet og alternativ, som er statisk skrevet, er at dynamisk skrevet, alle av type kontroll og ting skjer under kjøring, mens statisk skrev det skjer ved kompilering. Ordet statisk generelt synes å bety kompilering ting. Jeg antar det er andre bruksområder for det, men i C når du deklarerer en statisk variabel, sin bagasje fordeles på kompilering. Her dynamisk skrevet betyr nettopp det - I C hvis du prøver å legge en streng og et heltall, når du kompilere den, det kommer til å klage fordi det kommer til å si at du ikke kan legge en int og en peker. Det er bare ikke en gyldig operasjon. Det er en annen ting som vi får til i et sekund. Men den slags kontroll, det faktum at det klager på kompilering, er statiske typen sjekking. Det er språk der du ikke trenger å si røye, float, int, og alle disse tingene, men språket kan fortelle fra sammenheng med ting hvilken type det er ment å være, men det er fortsatt statisk skrevet. Så hvis du tar 51, OCaml, du aldri trenger å bruke noen av disse typene, men det fortsatt vil på kompilering sier du ikke kan gjøre dette fordi du mikser en int og en streng. Dynamisk skrevet betyr bare at en gang i løpet av kjøre tid du kommer til å få en klage. Hvis du også har brukt Java før, generelt, nesten alle C-type språk kommer til å bli statisk skrevet, så C, C + +, Java, alle av dem er generelt statisk skrevet. I Java når du kompilere noe og du sier string s tilsvarer nye noe som ikke er en streng, som kommer til å klage fordi disse typene bare ikke samsvarer. Det kommer til å klage på kompilering. Men det har også noen dynamisk tid ting som hvis du prøver å kaste noe til en type som er mer spesifikk enn sin nåværende type, det er ingenting de kan gjøre ved kompilering for å sjekke om det kastet kommer til å lykkes. Java har også noen dynamisk typen sjekker at så snart det kommer til det kodelinje når det faktisk utfører, det kommer til å gjøre det kastet, sjekke om det kastet var gyldig i første omgang, og hvis det ikke var, så det kommer til å klage på at du har en ugyldig type. Dynamisk typen kontroll. Skriv dette inn i en fil som heter dynamic.php. Dynamic.php. Jeg skal pakke det formatering. Vi har en variabel, vi setter den til heltall 7, så vi kommer til å skrive den ut og% s - Åh, vi skriver den type det er så getType kommer til å returnere den type variabelen. Vi bare skriver av type og om igjen. Vi bare php.dynamic.php. Vi vil se at det skifter fra heltall til strengen til Boolean som vi går gjennom. In C er det ingen boolsk datatype, er det ingen streng datatype. Det er char * og boolske bare har en tendens til å være int eller røye eller noe. I PHP disse finnes, og det er en av de store fordelene med PHP over C - at strengoperasjoner er uendelig lettere i PHP enn C. De bare fungere. Så kommer vi tilbake hit. Vi kjørte dynamic.php. Dette forteller PHP tolk, kalt php, å kjøre PHP-kode i dynamic.php. Hvis du har noen feil i filen, vil tolken fortelle deg! Tolken, er dette en annen stor forskjell mellom PHP og C. I C må du kompilere noe og deretter kjøre den kompilert fil. I PHP aldri du kompilere noe. Så PHP tolk er i utgangspunktet bare å lese denne linje for linje. Den treffer var = 7 så den treffer printf da den treffer Var så den treffer printf og så videre. Det er litt av kompilering den gjør det, og det bufrer resultatene så hvis du kjører skriptet senere kan du gjøre noen, men i utgangspunktet er det en linje for linje slags ting. Det betyr at mange av de optimaliseringer som vi får i C, som kompilering, er det bare generelt kompilatoren kan gjøre mye av triks for deg. Det kan ta ut ubrukte variabler, kan det gjøre alle disse slags ting, det kan gjøre halen rekursjon. I PHP ikke du kommer til å få denne fordelen fordi det bare kommer til å begynne å utføre linje for linje for linje, og den ikke gjenkjenner virkelig disse tingene som lett siden det ikke er en stor samling passerer over ting og så kjøring; det er bare linje for linje. Så det er tolk. Tilbake til vår dynamiske skrive: ganske kult, eh? Du definitivt ikke kunne gjøre det i C! Nå, se om du kan finne ut hvilken type hver av følgende verdier. Se dette som referanse. Så 3,50. Hvilken type tror du det kommer til å bli? Her er de typene vi har. Vi har bools, heltall, flytende punkter, strenger, arrayer, gjenstander, og deretter ressurser, som er slags vag. Jeg tror det er faktisk et eksempel her. Så er det NULL. NULL er en spesiell type. I motsetning til C hvor NULL er bare en peker med adresse 0, i PHP, er NULL sin egen type der det eneste gyldige ting av denne typen er NULL. Dette er mye mer nyttig for feilsjekking. I C der vi hadde dette problemet der hvis du går tilbake NULL, betyr det at du returnerer en NULL-peker eller bruke NULL å betegne feil eller alle at forvirring vi hadde på ett punkt. Her retur NULL betyr vanligvis feil. Mange ting også return false for feil. Men poenget er NULL type, er det eneste av NULL attraksjon NULL. Da tilbakeringing er som du kan definere noen anonyme funksjoner. Du trenger ikke å gi funksjonen et navn, men du trenger ikke å forholde seg til det her. Ser vi på de typene som de forventer oss å vite, hva tror du den type 3,50 er? >> [Student] Float. Ja. Så da her, hva tror du den typen dette er? >> [Student] Array. Ja. Den første var flyte, er det andre en en matrise. Legg merke til at denne matrisen er ikke som en C matrise der du har indeks 0 har noen verdi, har indeks 1 noen verdi. Her indeksene a, b, og c og er 1, 2, og 3. I PHP er det ingen forskjell mellom en assosiativ matrise og bare en vanlig matrise som du ville tenke på det i C. Det er nettopp dette, og under panseret en vanlig matrise er bare en assosiativ array hvor 0 kart til noen verdi på samme måte som en kart til noen verdi. Av denne grunn, kan PHP være ganske dårlig for virkelig rask kode / benchmarking ting siden i C når du bruker en rekke vet du at tilgang til et medlem er konstant tid. I PHP tilgang medlem er hvem vet hvor mye tid? Det er sannsynligvis konstant hvis det hashes riktig. Hvem vet hva det egentlig gjør under panseret? Du virkelig trenger å se på gjennomføringen for å se hvordan det kommer til å beskjeftige seg med. Så da fopen. Jeg tror her la oss bare PHP manuell fopen å se på avkastningen type. Vi ser her at du kan slå opp ganske mye noen funksjon i PHP manualen og dette er liksom mannen til PHP. Returtypen kommer til å være ressurskrevende. Det er derfor jeg kikket opp, fordi vi ikke egentlig definere ressurs. Ideen om ressurs, i C snilt av deg fikk en FIL * eller hva; i PHP ressursen er din FIL *. Det er hva du kommer til å lese fra, det er hva du kommer til å skrive til. Det er vanligvis ekstern, så det er en ressurs du kan trekke ting fra og kaste ting til. Og til slutt, hva er type NULL? >> [Student] NULL. Ja. Så det eneste som er NULL er NULL. NULL er NULL. En funksjon av PHP type system (for bedre eller verre) er dens evne til å sjonglere typer. Når du skriver en linje av PHP-kode som kombinerer verdier av forskjellige typer, PHP vil prøve å gjøre fornuftige ting. Prøv ut hver av de følgende linjer med PHP-kode. Hva er skrevet ut? Det er hva du forventet? Hvorfor eller hvorfor ikke? Dette faktum om PHP er det som gjør det det vi kaller svakt skrevet. Svakt skrevet og sterkt skrevet, det er forskjellige bruksområder for disse vilkårene, men de fleste bruker svakt skrevet og sterkt skrevet til å bety denne typen ting der ("1" + 2), det fungerer. I C som ikke ville fungere. Du kan forestille deg dette ikke fungerer. Mange blander dynamisk typing og svak typing og statisk skrive og sterk skrive. Python er et annet eksempel på et språk som er dynamisk skrevet. Du kan kaste rundt typer i variabler og det kommer til å avgjøre under kjøring noen feil checkings. I Python det kommer til å utføre dette, og det vil se ("1" + 2); og dette vil mislykkes fordi den sier at du kan ikke legge en streng og et heltall. I PHP, som er like dynamisk skrevet, vil dette ikke mislykkes. Svak skrive har å gjøre med det faktum at det gjør ting med typer som ikke virkelig fornuftig nødvendigvis. Så ("1" + 2), jeg kan forestille meg at det å være strengen 12, kan jeg tenke det er strengen 3, Jeg kan tenke det er heltallet 3. Det er ikke nødvendigvis godt definert, og vi sannsynligvis kommer til å se her at når vi skriver ut ("1" + 2), det er sannsynligvis kommer til å ende opp med å være annerledes enn trykkteknikker (1 + "2"). Og dette har en tendens til å være, etter min mening, til det verre. Her kan vi prøve disse. En annen lite triks om PHP er at du ikke trenger å faktisk skrive filen. Det gjør har kjørt denne kommandoen modus. Så php-r, så vi kan kaste i kommandoen her: "Print ('1 '+ 2)," og jeg vil kaste en ny linje. Dette skrives tre. Det ser ut som det er skrevet ut 3 og det er heltall 3. Så la oss nå prøve det andre veien rundt: "Print (1 + '2 '); Vi får 3, og det er også tenkt å være heltall 3? Jeg ærlig har ingen anelse. Det ser ut som det er konsistent. Det er aldri noen sjanse for at det er strengen 12 eller noe sånt fordi PHP, i motsetning JavaScript og Java også, har en egen operatør for sammenkjeding. Sammenkobling i PHP er prikk. Så utskrift (1 '2 '.); Kommer til å gi oss 12. Dette har en tendens til å føre til forvirring der folk prøver å gjøre noe som str + = noen andre ting som de ønsker å legge på til slutten av strengen sin, og det kommer til å mislykkes. Du trenger å gjøre str. = Så ikke glem sammensetning i PHP er en prikk. Andre ting du kan prøve: print ("CS" + 50); Jeg har fortalt deg at det ikke er noe håp for denne resulterer i CS50 siden sammensetning er ikke +. Hva tror du dette kommer til å ende opp med å bli? Jeg ærlig har absolutt ingen anelse om. Det ser ut som det er bare 50 år. Det ser strengen, og jeg vedder på at hvis vi setter 123CS - Det ser den første strengen, prøver den å lese et heltall fra den eller et nummer fra den. I dette tilfellet ser det 123CS. "Det gir ikke mening som et heltall, så jeg skal bare tenke på 123". Så 123 + 50 kommer til å bli 173. Og her begynner det å lese dette som et heltall. Det ser ikke noe, slik at det bare behandler det som 0. Så 0 + 50 kommer til å bli 50 år. Dette jeg antar kommer til å gjøre noe lignende. Jeg tenker 99. Ja, fordi det kommer til å ta det første - Så 99. Her (10/7), hvis dette var C, hva ville det tilbake? [Student] 1. >> Ja, det ville være en fordi 10/7 er å dele to heltall. Et heltall delt av et heltall kommer til å returnere et heltall. Det kan ikke returnere 1 poeng uansett det ville være, så det er bare kommer til å returnere en. Her skriver (10/7), det kommer til å faktisk tolke det. Og dette betyr at hvis du faktisk ønsker å gjøre heltall avrunding og sånt, du trenger å gjøre print (etasje (10/7)); I C er det sannsynligvis rart at du kan stole på heltall trunkering regelmessig, men i PHP ikke kan fordi det vil automatisk slå den inn i en flåte. Og så (7 + true); hva tror du det kommer til å bli? Jeg gjetter 8 hvis det kommer til å tolke sant som en. Det ser ut som det er 8. Så noe vi har gjort i de siste 10 minuttene du bør absolutt aldri gjøre. Du vil se koden som gjør dette. Det trenger ikke å være så enkelt som dette. Du kunne ha to variabler, og en variabel skjer for å være en streng og den andre variable skjer for å være en int, og deretter legger du til disse variablene sammen. Siden PHP er dynamisk skrevet, og det vil ikke gjøre noen typesjekking for deg og siden det er svakt skrevet, og siden det vil bare automatisk kaste disse tingene sammen og alt vil bare fungere, er det vanskelig å selv vite at denne variabelen må være en streng nå, så jeg ikke skal legge det til denne variabelen, som er et heltall. Best practice er hvis en variabel er en streng, holde det som en streng alltid. Hvis en variabel er en int, holde det som en int alltid. Hvis du ønsker å håndtere heltall og strenger, kan du bruke varsint - det er JavaScript. Intval. Jeg gjør dette hele tiden. PHP og JavaScript jeg blander opp alt. Så intval skal returnere heltallsverdien en variabel. Hvis vi passerer i "print (intval ('123 ')); du får 123. Intval selv ikke kommer til å gjøre sjekken for oss at det er utelukkende et heltall. PHP manualen, det er bare så mange funksjoner tilgjengelig, så her tror jeg det jeg vil bruke er is_numeric først. Jeg gjetter at returneres falsk. Det er en annen ting vi har å gå over er ===. Så is_numeric ('123df '), ville du ikke tenke på det som is_numeric. I C ville du må iterere over alle tegnene og sjekk for å se om hver karakter er tall eller hva. Her is_numeric kommer til å gjøre det for oss, og den returnerer false. Så når jeg trykket at trykket det ingenting, så her jeg sammenlikne det å se, har du tilfeldigvis være falsk? Og så nå er det utskrift 1. Angivelig det skrives en som sant stedet for å skrive sant så sant. Jeg lurer på om jeg gjør print_r. Nei, det gjør det fortsatt en. Går tilbake til === eksisterer == fortsatt, og hvis du snakker til Tommy at han vil si == er helt greit. Jeg kommer til å si at == er forferdelig, og du bør aldri bruke ==. Forskjellen er at == sammenligner ting der det kan være tilfelle selv om de ikke er av samme type, mens === sammenligner ting og først det sjekker de samme type? Ja. Ok, nå skal jeg se om de faktisk sammenligne å være like. Du får rare ting som 10 lik - la oss se hva som sier. So ('10 '== '1 e1'); Dette returnerer sant. Har noen noen gjetninger hvorfor dette returnerer sant? Det handler ikke bare om det. Kanskje dette er et hint. Men hvis jeg endre det til en f - darn it! Jeg fortsette å bruke anførselstegn. Grunnen anførselstegn er roping på meg fordi jeg har satt dette i anførselstegn. Så jeg kunne unnslippe doble anførselstegn i her, men enkle anførselstegn gjøre det lettere. So ('10 '== '1 f1'); ikke ut sant. ('10 '== '1 E1'); skriver sant. [Student] Er det hex? >> Det er ikke hex, men det er tett at det er som - 1E1, vitenskapelig notasjon. Den gjenkjenner 1E1 som 1 * 10 ^ 1 eller hva som helst. De er likeverdige heltall. Hvis vi gjør === så det kommer til å være falsk. Jeg har faktisk ingen anelse om vi gjør == hva (10 og '10abc '); OK. Så det er sant. Så akkurat som når du gjorde (10 + '10abc '), og det ville være 20, her (10 == '10abc '); er sant. Enda verre er ting som (falske == NULL); er sant eller (false == 0); er sant, (false == []); Det er rare tilfeller av - Det er en av de rare saker. Legg merke til at (falske == []); er sant. ('0 '== False); er sant. ('0 '== []); Er falsk. Så == er på ingen måte transitive. en kan være lik b og en kan være lik c, men b kan ikke være lik C. Det er en vederstyggelighet for meg, og du bør alltid bruke ===. [Student] Kan vi gjøre! == Også? >> [Bowden] Ja. Tilsvarende ville være! = Og! ==. Dette er faktisk brakt opp i pset spec hvor mange funksjoner avkastning - PHP manualen er bra om dette. Det setter i en stor rød boks, "Dette vil returnere false hvis det er en feil." Men tilbake 0 er en helt rimelig ting å gå tilbake. Tenk om noen funksjon som er ventet å returnere et heltall. La oss si denne funksjonen er ment å telle antall linjer i en fil eller noe. Under normale omstendigheter, passerer du denne funksjonen en fil og det kommer til å returnere et heltall som representerer antall linjer. Så 0 er en helt rimelig antall hvis filen er bare tomt. Men hva hvis du passerer det en ugyldig fil og funksjonen skjer for å returnere falsk hvis du passerer det en ugyldig fil? Hvis du bare gjøre == du ikke skille saken mellom ugyldig fil og tom fil. Bruk alltid ===. Det er alle disse. I PHP, er matrisen typen forskjellig fra det du er vant til i C. Faktisk har du kanskje allerede lagt merke til dette ovenfor når du så at dette er av typen array. Braketten syntaks er ny som på 5,4 PHP, som er den nyeste versjonen av PHP. Før dette alltid måtte du skrive array ('a' -> 1, 'b' -> 2. Det var konstruktøren for en matrise. Nå PHP har endelig kommet rundt til gode syntaks av bare hakeparenteser, som er bare så mye bedre enn array. Men vurderer PHP 5.4 er den nyeste versjonen, du kan støte på steder som ikke engang har PHP 5.3. I løpet av sommeren kjørte vi inn i denne saken hvor PHP 5.3 var det vi hadde på apparatet, men serveren som vi utplassert alle våre karakterbok og sende og alt det der til var PHP 5.4. Ikke vite dette, har vi utviklet i 5.3, presset til 5,4, og nå plutselig ingen av koden vår fungerer fordi det har skjedd å ha vært endringer mellom 5,3 og 5,4 som ikke er bakoverkompatibel, og vi må gå og fikse alle våre ting som ikke fungerer for PHP 5.4. For denne klassen, da apparatet ikke har PHP 5.4, det er helt greit å bruke hakeparenteser. Men hvis du leter opp ting rundt på Internett, Hvis du leter opp en slags matrise ting, mest sannsynlig at du kommer til å se spell ut utvalg konstruktør syntaks siden det har eksistert siden PHP ble født og hakeparentes syntaks har eksistert i de siste par månedene eller når 5,4 kom rundt. Dette er hvordan du indeksen. Akkurat som i C hvordan du ville indeksen med hakeparenteser som $ array [0], $ array [1], $ array [2], du indekserer på samme måte hvis du tilfeldigvis har dine indekser blir strenger. Så $ array ['a'] og $ array ['b']. $ Matrise [b]. Hvorfor skulle dette være galt? Det vil trolig generere en advarsel, men fortsatt arbeid. PHP har en tendens til å gjøre det. Det har en tendens til å bare: "Jeg kommer til å advare deg om dette, men jeg skal bare holde det gående "Og gjøre hva jeg kan." Det vil trolig oversette dette til en streng, men det er mulig at på et tidspunkt i fortiden noen sa definere b for å være "Hello World '. Så nå b kan være en konstant og $ array [b] vil faktisk være å gjøre 'Hello World'. Jeg tror på dette punktet, eller i det minste våre PHP-innstillinger, hvis du prøver å indeksere inn i en matrise, og at nøkkelen ikke eksisterer, vil det mislykkes. Jeg tror ikke det vil bare advare deg. Eller i det minste du kan sette den slik at den ikke advare bare deg, det bare rett mislykkes opp. Måten du sjekke for å se om det faktisk er slik indeks er isset. Så isset ($ array ['Hello World']) vil returnere false. isset ($ array ['b']) vil returnere true. Du kan blande disse syntaxes. Jeg er ganske sikker på hva denne tabellen ville ende opp med å bli er - Vi kan teste det ut. Oh, jeg trenger PHPWord. Dette er å blande syntaksen der du angir hva nøkkelen er og du ikke spesifisere hva nøkkelen er. Så 3 her er en verdi. Du har ikke eksplisitt sagt hva styringsrenten skal være. Hva tror du det nøkkel kommer til å bli? [Student] 0. >> Jeg gjetter 0 bare fordi det er den første vi har ikke spesifisert. Vi kan faktisk gjøre et par av disse tilfellene. Så print_r er skrive ut rekursiv. Det vil skrive ut hele matrisen. Det ville skrive subarrays i matrisen hvis det var noen. Så print_r ($ array); php.test.php. Det ser ut som det ga det 0. Det er faktisk noe å huske på her, men vi vil komme tilbake til det i et sekund. Men hva hvis jeg måtte gjøre denne indeksen 1? PHP skiller ikke mellom streng indekser og heltall indekser, Så på dette punktet har jeg bare definert en indeks 1, og jeg kan gjøre begge $ array [1] og $ array ['1 '] og det vil være den samme indeksen og samme nøkkel. Så nå hva tror du 3 kommer til å bli? >> [Student] 2. >> [Bowden] Jeg gjetter 2. Ja. Det er 2. Hva om vi gjorde dette er 10, er dette 4? Hva tror du indeksen på 3 kommer til å bli? Jeg tenker 11. Min gjetning på hva PHP gjør - og jeg tror jeg har sett dette før - er det bare holder styr på hva den høyeste numerisk indeks det er brukt så langt er. Det kommer aldri til å tildele en streng indeksen til 3. Det vil alltid være en numerisk indeks. Så det holder styr på det høyeste en det er tildelt så langt, noe som skjer for å være 10, og det kommer til å gi 11-3. Det jeg sa tidligere, merke slik det er utskrift av denne matrisen. Det skriver tast 10, 4 nøkkel, 11 tast, tast d.. Eller la oss gjøre - Jeg antar jeg ikke sette en 0, men det er utskrift 1, 2, 3, 4. Hva hvis jeg bytter her? Eller la oss faktisk slå disse to. Nå det skrives 2, 1, 3, 4. PHP er arrays er ikke akkurat som din vanlige hash table. Det er helt naturlig å tenke på dem som hash tabeller 99% av tiden. Men i dine hash tabeller er det ingen følelse av rekkefølgen ting ble satt inn. Så så snart du setter det inn i hash table, anta det er ingen lenket liste, og du kan dømme i en lenket liste som ble satt inn først. Men her har vi satt to første, og det vet når det er skrive ut denne tabellen at 2 kommer først. Det skrives ikke ut i bare hvilken som helst rekkefølge. Den tekniske data struktur som den bruker er et ordnet kart, så det kartlegger nøkler til verdier og det husker rekkefølgen disse nøklene ble satt inn. I utgangspunktet er det noen komplikasjoner der det er irriterende å faktisk - La oss si du har en rekke 0, 1, 2, 3, 4, 5 og du ønsker å ta ut indeks 2. En måte å gjøre det på, la oss se hva som ser ut som. 0, 2, 1, 3, 4. Unset skjer for å slette informasjonen både variabler og utvalg indekser. Så unset ($ array [2]); Nå hva dette kommer til å se ut? 2 er bare borte, så det er helt greit. Mer irriterende er hvis du vil at ting skal faktisk være som en matrise. Jeg skal sette tilfeldige tall. Nå merker jeg indekser. Jeg vil at det skal bare være som en C array hvor den går fra 0 til lengde - 1 og jeg kan iterere over det som sådan. Men så snart jeg slette informasjonen den andre indeksen, hva som var i indeksen 3 ikke nå blitt indeks 2. I stedet er det fjerner bare at indeksen og nå du går 0, 1, 3, 4. Dette er helt rimelig. Det er bare irriterende, og du trenger å gjøre ting som matrise skjøt. Ja. [Student] Hva ville skje hvis du hadde en for loop og du ønsket å gå over alle elementene? Når den treffer to, ville det gi noensinne? Iterating over en matrise. Det er 2 måter du kan gjøre det. Du kan bruke en vanlig for-løkke. Dette er en annen intricacy av PHP. De fleste språk, vil jeg si, har noen form for lengde eller len eller noe indikerer lengden av en matrise. I PHP er det teller. Så count ($ array); $ i + +) La oss bare print ($ array [$ i]); Notice: Undefined offset: 2. Det er bare kommer til å mislykkes. Dette er grunnen til at, for det meste, du aldri trenger å iterere over en rekke som dette. Det kan være en overdrivelse, men du aldri trenger å iterere over en rekke som dette fordi PHP gir sin foreach syntaks der foreach ($ array som $ element). Hvis vi nå ut ($ element), - vi vil diskutere det i et sekund - som fungerer helt greit. Måten at foreach arbeider er det første argumentet er tabellen som du gjentar over. Og det andre argumentet, et element gjennom hver passering av for loop det kommer til å ta på den neste tingen i matrisen. Så husk tabellen har en ordre. Første gang gjennom for loop, er element kommer til å være 123 så vil det være 12 så vil det være 13 så vil det være 23 så vil det være 213. Ting blir veldig rart når du gjør noe som foreach. La oss se hva som skjer fordi du aldri bør gjøre dette. Hva om vi unset ($ array [1]); Det var sannsynligvis forventet. Du gjentar i denne matrisen, og hver gang du deaktivering den første indeksen. Så for indeks 0, tar det første, element på verdien 0, så det kommer til å bli 123. Men innsiden av for-løkken vi unset en indeks, så det betyr 12 er borte. Så ut. PHP_EOL. PHP_EOL er bare linjeskift, men det er teknisk mer portable siden linjeskift i Windows er forskjellig fra linjeskift på Mac og UNIX. På Windows linjeskift er \ r \ n, mens overalt ellers pleier det bare å være \ n. PHP_EOL er konfigurert slik at den bruker uansett linjeskift i systemet ditt er. Så ut som. La oss ikke print_r ($ array) på slutten. Jeg hadde ingen anelse om at det ville være atferd. Elementet tar fortsatt på verdien 12, selv om vi slette informasjonen 12 før vi noen gang kom til det fra tabellen. Ikke ta mitt ord på dette, men det ser ut som foreach oppretter en kopi av tabellen og deretter elementet tar på alle verdier av denne kopien. Så selv om du endrer matrisen inne i for loop, det vil ikke vare. Elementet vil ta på de opprinnelige verdiene. La oss prøve deaktivering det. Hva om dette er $ array [1] = "Hei"; Selv om vi setter "hallo" i tabellen, tar vare aldri på denne verdien. Det er en annen syntaks til foreach løkker hvor du setter to variabler atskilt med en pil. Denne første variabelen kommer til å være nøkkelen til den verdien, og denne andre variabelen er kommer til å være den samme nøyaktige element. Dette er uinteressant her, men hvis vi går tilbake til vår opprinnelige tilfelle av 'a' -> 1, 'B' -> 1, her hvis vi bare iterate for hver matrise som element, element kommer til å være en hver eneste gang. Men hvis vi ønsker også å vite nøkkelen forbundet med dette elementet så vi gjør som $ key -> $ element. Så nå kan vi gjøre print ($ key. ':'. Nå er det gjentar om og om utskrift hver tast og dens tilhørende verdi. En ekstra ting vi kan gjøre i foreach løkker er kan du se denne syntaksen. Ampersand før variabelnavn tendens til å være hvordan PHP gjør referanser. Hvor referanser er svært lik pekere, du har ikke pekere, slik at du aldri avtale med minne direkte. Men du har referanser der en variabel refererer til det samme som en annen variabel. Innsiden av her la oss gjøre $ element. La oss gå tilbake til 1, 10. La oss gjøre $ element + +; Det finnes fortsatt på PHP. Du kan fortsatt gjøre + +. php.test.php. Jeg må skrive den ut. print_r ($ array); Vi ut 2, 11. Hvis jeg bare hadde gjort foreach ($ array som $ element) da elementet vil være verdien 1 første gang gjennom løkken. Det vil øke 1 til 2 og da er vi ferdig. Så da vil det gå gjennom en ny omgang med sløyfen og at elementet er 10. Det trinn element til 11, og deretter det er bare kastes. Da vi print_r ($ array), og la oss se at dette er bare 1, 10. Så tilveksten vi gjorde var tapt. Men foreach ($ array som & $ element) nå dette elementet er det samme elementet som dette her. Det er det samme. Så $ element + + er å endre matrise 0. I utgangspunktet kan du også gjøre $ k -> $ element, og du kan gjøre $ array [$ k] + +; Så en annen måte å gjøre det, står vi fritt til å endre element, men det vil ikke endre vår opprinnelige array. Men hvis vi bruker k, som er vår nøkkel, kan vi da bare indeksen inn matrise vår bruker det nøkkelen og øke det. Dette mer direkte endrer vår opprinnelige array. Du kan selv gjøre det hvis noen grunn ville du mulighet til å endre - Egentlig er dette helt rimelig. Du har ikke lyst til å skrive $ array [$ k] + +, du ville bare skrive $ element + +, men du fortsatt ønsket å si if ($ k === 'a') Deretter øke elementet og deretter skrive vår array. Så nå hva forventer vi print_r å gjøre? Hvilke verdier skal skrives? [Student] 2 og 10. >> [Bowden] Bare hvis nøkkelen var 'a' gjør vi faktisk ut som. Du har sannsynligvis svært sjelden, om noensinne, må definere funksjoner i PHP, men du kan se noe lignende der du definerer en funksjon som funksjon uansett. Vanligvis ville du si ($ foo, $ bar) og deretter definerer det å være uansett. Men hvis jeg gjør dette, så det betyr at det kaller uansett, hva kaller baz, så det første argument til baz kan endres. La oss gjøre $ foo + +; og innsiden av her la oss gjøre baz ($ element); Nå er vi ringer en funksjon. Argumentet er tatt ved henvisning, noe som betyr at hvis vi endrer det vi endrer ting som ble vedtatt i. Og utskrift av denne vi forventer - med mindre jeg rotet syntaks - vi fikk 2, 11, så det var faktisk økes. Merker vi trenger referanser i to steder. Hva hvis jeg gjorde dette? Hva betyr dette? [Student] Det vil forandre. >> Ja. Elementet er bare en kopi av verdien i matrisen. Så vil bytte til 2, men array ['a'] vil fortsatt være en. Eller hva hvis jeg gjør dette? Nå elementet er sendt som en kopi til baz. Slik at kopien av argumentet vil økes til 2, men selve elementet ble aldri økes til 2. Og elementet er det samme som rekke brakett uansett, slik at matrisen ble aldri økes. Så begge disse stedene trenger det. PHP er vanligvis ganske smart om dette. Du tenker kanskje jeg ønsker å passere ved henvisning - Dette var faktisk et spørsmål på en av psets. Det var en questions.txt ting der det er sagt, Hvorfor kan det være lurt å passere denne struct ved henvisning? Hva var svaret på det? [Student] Så du trenger ikke å kopiere noe stort. >> Ja. En struct kan være tilfeldig stort, og når du passerer struct inn som et argument det er behov for å kopiere at hele struct å passere den til funksjon, mens hvis du bare passerer struct ved henvisning så det må bare å kopiere en 4-byte adresse som argument til funksjonen. PHP er litt smartere enn som så. Hvis jeg har noen funksjon, og passerer jeg det en rekke 1000 ting, betyr at det er nødt til å kopiere alle 1000 av disse tingene å passere den inn i funksjonen? Det behøver ikke å gjøre det umiddelbart. Hvis innsiden av denne funksjonen er det aldri endrer faktisk foo, så hvis ($ foo === 'Hei') return true.; Legg merke til at vi aldri faktisk endret argumentet innsiden av denne funksjonen, noe som betyr at det ble vedtatt i så Foo aldri trenger å bli kopiert fordi det ikke endre det. Så måten PHP fungerer er argumentene er alltid gått med referanse før du faktisk prøver å endre det. Nå hvis jeg si $ foo + +, det vil nå lage en kopi av den opprinnelige foo og endre kopien. Dette sparer tid. Hvis du aldri berøre dette enormt utvalg, du aldri endre den, det er ikke nødvendig å gjøre kopien, mens hvis vi bare sette dette tegnet som betyr at den ikke engang kopiere den selv om du endrer det. Denne oppførselen kalles kopi-on-write. Du vil se det andre steder, spesielt hvis du tar et operativsystem kurset. Kopier-on-write er en ganske vanlig mønster der du ikke trenger å lage en kopi av noe med mindre det er faktisk endring. Ja. [Student] Hva om du hadde tilvekst inne i testen, så bare en del av 1000 måtte endres? Jeg er ikke sikker. Jeg tror det ville kopiere hele greia, men det er mulig det er smart nok til at - Egentlig hva jeg tenker er forestille vi hadde en matrise som ser slik ut: $ matrise2 = [ Deretter indeksere 'a' er en rekke [1 2 3 4], og indeksen 'b' er en rekke uansett. Jeg trenger komma mellom alle disse. Forestille det er komma. Deretter 'c' er verdien 3. Okay. Nå la oss si at vi $ baz ($ matrise2); der baz ikke ta dette ved referanse. Så $ foo ['c'] + +; Dette er et slikt eksempel der vi passerer matrise2 som et argument og da er det å endre en spesifikk indeks i matrisen ved å inkrementere den. Jeg ærlig har ingen anelse om hva PHP kommer til å gjøre. Det kan lett lage en kopi av hele greia, men hvis det er smart, det vil lage en kopi av disse tastene hvor dette vil ha sin distinkte verdi men dette kan likevel peker til samme matrisen 1,2,3,4 og dette kan fremdeles peker til samme rekke. Jeg skal iPad det. Vi passerer i denne matrisen hvor denne fyren poeng til 3, denne fyren poeng til [1,2,3,4], denne fyren peker på [34, ...] Nå som vi passerer den til baz, vi endrer dette. Hvis PHP er smart, kan det bare gjøre - Vi hadde fortsatt å kopiere noe minne, men hvis det var disse enorme nestede subarrays vi trenger ikke å kopiere dem. Jeg vet ikke om det er det det gjør, men jeg kan forestille meg det gjør det. Dette er også en ganske stor fordel av C over PHP. PHP gjør livet så mye enklere for mange ting, men du typen har absolutt ingen anelse om hvor godt det vil fungere fordi jeg har ingen anelse under panseret når det gjør disse kopier av ting, oh, kommer det til å være en konstant tid kopi, er det bare kommer til å endre en peker, det kommer til å bli en latterlig vanskelig lineær kopi? Hva om det ikke kan finne plass? Betyr det da nødvendig å kjøre søppelrydding å få litt mer plass? Og søppelrydding kan ta vilkårlig lang. I C trenger du ikke å bekymre deg for disse tingene. Hver enkelt linje du skriver du kan ganske mye grunn om hvordan det kommer til å utføre. La oss se tilbake på disse. Hvor fint er det at du ikke trenger å forholde seg til hash funksjoner, knyttet lister, eller noe sånt? Siden arbeidet med hash tabeller er så lett nå, her er en morsom oppgave å jobbe med. Åpne opp en fil kalt unique.php og i det skrive et PHP-program (Også kjent som en "script"). Vi har en tendens til å kalle dem skript hvis de er korte ting som du kjører på kommandolinjen. I utgangspunktet, alle språk som du ikke kompilere, men du kommer til å kjøre den kjørbare på kommandolinjen, kan du kalle det kjørbart skript. Jeg kunne like godt skrive et C-program som gjør dette, men jeg kan ikke kalle det et script siden jeg først kompilere den og deretter kjøre den binære. Men dette PHP program skal vi kalle et skript. Eller hvis vi skrev det i Python eller Perl eller Node.js eller noen av disse tingene, vi vil kalle dem alle skript fordi du kjører dem på kommandolinjen men vi ikke samle dem. Vi kunne gjøre dette ganske raskt. Vi kommer ikke til å bruke argv. La oss bare blåse gjennom dette. Kall det unike, skrive et program. Du kan anta at input vil inneholde ett ord per linje. Egentlig vil argv være ganske trivielt å bruke. unique.php. Første ting først, ønsker vi å sjekke om vi har gått en kommandolinje-argument. Akkurat som du ville forvente argc og argv i C, vi har fortsatt de i PHP. Så hvis ($ argc! == 2) så jeg vil ikke forholde seg til å skrive ut en melding eller noe. Jeg vil bare avslutte, feilkode av en. Jeg kunne også tilbake en. Sjelden i PHP er du på denne tilstanden hvor vi er på - Vanligvis er du i en funksjon kalt av en funksjon kalt av en funksjon kalt av en funksjon. Og hvis noe går galt og du bare ønsker å avslutte alt helt, exit ender like programmet. Dette finnes også i C. Hvis du er i en funksjon i en funksjon i en funksjon i en funksjon og du vil bare drepe programmet, kan du ringe exit, og det vil bare avslutte. Men i PHP er det enda mer sjelden at vi er på dette øverste nivå. Vanligvis vi er inne en slags funksjon, så kaller vi exit slik at vi ikke trenger å gå tilbake opp en ting som deretter innser det er en feil så som returnerer opp hvis det gjenkjenner det var en feil. Vi ønsker ikke å forholde seg til det, så gå ut (1); Avkastningen (1), i dette tilfellet ville være tilsvarende. Så det vi ønsker å åpne vi ønsker å fopen. Argumentene kommer til å se ganske lik. Vi ønsker å fopen ($ argv [1], og vi ønsker å åpne den for å lese. Som returnerer en ressurs som vi kommer til å kalle f. Dette ser ganske lik hvordan C gjør det bortsett fra vi ikke trenger å si FIL *. I stedet har vi bare si $ f. Okay. Egentlig tror jeg dette selv gir oss et hint om PHP funksjon som heter fil. PHP File. Hva dette kommer til å gjøre er å lese en hel fil inn i en matrise. Du trenger ikke engang å fopen det. Det kommer til å gjøre det for deg. Så $ linjer = fil ($ argv [1]); Nå har alle de linjene i filen er i linjer. Nå ønsker vi å sortere linjene. Hvordan kan vi sortere linjene? Vi sorterer linjene. Og nå kan vi skrive dem eller hva. Sannsynligvis den enkleste måten er foreach ($ linjer som $ linje) echo $ linje; [Student] Ville ikke vi selv krysse linjene ved å referere noe inn sort? Det er der slag ville bli definert som funksjon sorter (& $ array). Når du kaller funksjonen du ikke forbi den som referanse. Det er funksjonen som definerer det som å ta det som referanse. Dette er faktisk akkurat hva som gikk galt når vi legger alt til våre servere når vi gikk 5,3 til 5,4. Frem til 5.4, var dette helt rimelig. En funksjon forventer ikke å ta det som referanse, men du kan sende den som referanse så hvis funksjonen ikke skje til å endre det, er det fortsatt endret. Som på 5,4, er du ikke lov til å gjøre dette. Så nå den eneste måten du passerer referanse er hvis funksjonen eksplisitt gjør det. Hvis du ikke vil at den skal endre det, så må du gjøre $ copy = $ linjer og pass kopi. Så nå linjene vil bli bevart og kopi vil bli endret. php.unique.php. Jeg kan ha rotet noe opp. Uventet 'slags'. Det kommer til å være noe som gjør dette for oss. Det er ikke engang der. Legger merke til når du lese bruksanvisningen som det første argumentet er forventet å være en matrise og det har tatt som referanse. Hvorfor er dette klager til meg? Fordi jeg har denne funksjonen sorter fortsatt i her at jeg ikke vil ha. Ok, php.unique.php. Jeg bestod ikke det et argument fordi jeg ikke har en fil. Det er php.unique.php på test.php. Her er test.php alle skrives ut i en fin sortert rekkefølge. Legg merke til at sortert rekkefølge er slags merkelig for en kode fil fordi alle våre tomme linjer skal komme først deretter kommer til å komme alle våre 1 nivå fordypninger så kommer alle våre ingen fordypninger. Ja. >> [Student] Så for kildekoden det ikke ble vedtatt av referanse? Er det generelt vedtatt av verdi? [Bowden] Når du ringer en funksjon, det har aldri avgjør om det ble vedtatt som referanse. Det er funksjonen definisjonen som avgjør om det ble vedtatt som referanse. Og ser på funksjonen definisjonen av slag eller bare ser på dette, det tar argumentet ved referanse. Så uansett om du vil at den skal ta det med referanse, det tar det som referanse. Det endrer tabellen på plass. Dette er bare ikke tillatt. Du har ikke lov til å gjøre dette. >> [Student] Oh, okay. [Bowden] Dette er slags kommer til å ta linjer ved henvisning og endre det. Og igjen, hvis du ikke vil at den skal gjøre det, kan du lage en kopi av slag. Selv i dette tilfellet, er kopien ikke faktisk en kopi av linjer. Det peker bare til det samme til den første blir endret, hvor det første kommer til å få endret på den slags funksjon, hvor, fordi det er kopi-on-skrive, nå en kopi av kopi kommer til å bli gjort. Du kan også gjøre dette. Det er det andre stedet du kan se tegnet. Du ser det i foreach løkker, ser du det i funksjon erklæringer, og du ser det når bare tilordne variabler. Nå har vi oppnådd noe ved å gjøre dette fordi kopiere og linjer er bokstavelig talt det samme. Du kan bruke linjer og kopiere hverandre. Du kan gjøre unset ($ kopi), og som ikke unset linjer, du bare miste referanse til det samme. Så som i dette punktet, nå linjer er den eneste måten du kan få tilgang til linjer. Spørsmål? Ja. [Student] Helt off topic, men du trenger ikke å lukke PHP med - >> Du gjør ikke det. Okay. [Bowden] Jeg vil gå så langt som å si at det er dårlig praksis å lukke dem. Det er nok en overdrivelse, spesielt i et skript, men la oss se hva som skjer hvis jeg gjør dette. Det gjorde ingenting. Hva om jeg ønsket - [sukk] Jeg trenger å passere et argument. Skyt. Jeg kalte det galt. Så php.unique.php med et argument. Nå er jeg ikke engang trenger dette. Jeg skal gi det et gyldig argument. Dette skrives hva det er utskrift. Jeg skriver kopi og kopiere finnes ikke. Så linjer. Det skrives alt, og deretter merke alt dette søppelet her nede, fordi i PHP noe som er utenfor PHP koder er bare kommer til å bli skrevet ut bokstavelig. Det er derfor HTML, det er så hyggelig at jeg kan gjøre div blah, blah, blah klasse eller hva, blah, blah, blah, og deretter gjøre noen PHP-koden og gjør deretter ende div. Og nå skriver dette får jeg min hyggelig div opp toppen, alt som PHP trykt, div nederst. Katastrofal når noe som dette skjer, er som ganske vanlig, bare en bortkommen linjeskift nederst filen. Du ville ikke tro det ville være så stor av en avtale før du vurdere det faktum at med nettlesere - Hvordan viderekobler arbeid eller utgangspunktet enhver overskrifter arbeid, når du gjør tilkoblingen til en nettside og det sender tilbake alle disse overskriftene og ting som respons 200 eller respons omdirigere eller hva, hodene er bare gyldig til første byte data blir sendt. Du kan omadressere tusenvis av ganger, men så snart den første byte data sendes du er ikke ment å omdirigere igjen. Hvis du har en bortkommen linjeskift ved bunnen av en fil og la oss si at du bruker denne funksjonen, og deretter du vil - La oss si det er en annen fil som er index.php og require_once deg noe - Jeg kan ikke tenke på et godt eksempel på det. Spørsmålet som skjer når denne linjen nederst blir ekko. Du ønsker ikke noe å ha blitt lest opp ennå. Selv om du ikke hadde tenkt på noe få ekko, gjorde noe få ekko og så nå du ikke skal sende flere hoder og du kommer til å få klager. Du trenger bare ikke disse avsluttende kodene. Hvis du har tenkt på å gjøre noe med HTML - og det er helt rimelig å gjøre her nede div uansett og deretter på dette punktet kan du eller du ikke kan ta dem. Det spiller egentlig ingen rolle. Men i PHP-skript er det sjelden å lukke det. Når alt er PHP, absolutt alt, du egentlig ikke trenger å lukke det / du bør ikke lukke den. Håndteringen av strenger er mye hyggeligere enn i C. I PHP kan du angi en streng med enkle eller doble anførselstegn. Med enkle anførselstegn kan du ikke bruke "Escape" sekvenser. Stadig unnslippe, blah, blah, blah. Så printf er svært sjelden i PHP. Jeg antar jeg ville bruke printf hvis jeg ønsket å gjøre en slags ting - i pset 5 brukte du sprintf eller hva. Men du vil gjøre 001.jpg og 002.jpg. Så for den slags ting der jeg faktisk ønsker å formatere teksten jeg ville bruke printf. Men ellers ville jeg bare bruke streng sammensetning. Jeg har aldri virkelig bruke printf. Vi bare skille detaljer mellom apostrof og doble hermetegn. Den største forskjellen er at enkle anførselstegn, vil det bli skrevet bokstavelig. Det er ingen char datatype i PHP, i motsetning C, så dette tilsvarer dette. De er begge strenger. Og det fine med enkle sitat strenger er jeg kunne si 'Hei verden!' blah, blah, blah, $ $ Wooo. Hva skjer når jeg skriver ut dette er det vil skrive det bokstavelig talt. La oss bli kvitt alle våre ting. Så echo $ str1; Det bokstavelig talt trykket alle disse tingene: dollartegn, backslash n, som du tror vil være linjeskift - alle disse tingene det skrives bokstavelig. Det eneste du trenger å flykte er apostrof fordi ellers ville det tror det er lukke enkle anførselstegn. Doble anførselstegn, helt annerledes. Vi ser allerede at syntaksutheving er cluing oss på til hva som er i ferd med å gå fryktelig galt. php.unique. Undefined variable: wooo fordi dette blir tolket som en variabel kalt wooo. Anførselstegn lar deg sette variabler inn - La oss si $ name = "Rob"; Så echo "Hei, mitt navn er $ name!"; Det erkjenner dette som en variabel. Når jeg kjører det - og jeg vil legge inn et linjeskift - Hei, mitt navn er Rob! og hallo verden! Dette er fordi jeg aldri fjernet utskrift av wooo ovenfor. Det er en ytterligere skritt du kan gjøre. $ Matrise = [1, 2, 3]; Hva om jeg ønsker å skrive ut den første indeksen array? Du gjør $ array [0]. De syntaksutheving er en anelse. Hva dette kommer til å gjøre? php.unique. Hei, mitt navn er 1! som er ikke hva jeg ville. Syntaksutheving løy for meg. La oss prøve 'a' -> 1, 'b' -> 2. Det er slik jeg ville ha til å skrive det. Uventet enkelt anførselstegn (T_ENCAPSED blah, blah, blah, blah, blah). Tanken er at det ikke er å gjenkjenne dette som en del av matrisen. Det er ikke anerkjenne dette som matrise indeksert av bokstav a.. Du ønsker å gjøre det i klammeparentes, og nå alt som er i denne krøllete brace vil bli interpolert, som er ordet vi bruker for magisk sette disse variablene i de riktige stedene. Nå gjør dette, php.unique, og Hei, mitt navn er 1! som forventet eller Hei, mitt navn Rob! En ting som er slags fint om apostrof er at - Det er noen kostnader til interpolere. Hvis du bruker doble anførselstegn, har tolken til å gå over denne strengen, å sørge for at "Å, her er en variabel. nå jeg trenger å gå få den variabelen og sett den her." Selv om du ikke bruker noen variabler, ingenting innsiden av disse anførselstegn må interpolert, men det vil fortsatt være tregere fordi den trenger å gå over de doble anførselstegn på jakt etter ting som må bli interpolert. Så apostrof kan være litt raskere hvis ikke noe behov for å bli interpolert, og jeg pleier å selv bruke enkle hermetegn for: "Hei, mitt navn er '. $ Array ['a'] uansett. Det kommer til å være tilsvarende det vi hadde før. Men det er et spørsmål om preferanser. Hvis du bruker PHP, har du sannsynligvis ikke bryr seg om hastigheten forskjellen. Det er ikke nok å resonnere dem ut til å begynne med. Noen endelige spørsmål? Vi har faktisk ikke engang komme gjennom det hele, men dette ting var kjedelig. Den siste tingen som er slags fint i PHP er når du arbeider med HTML, du kommer til å bruke det litt, så fin snarvei syntaksen for å skrive ut en variabel. Uten å sette PHP her, dette kalles korte koder. Offisielt som av PHP 5.4, er dette frarådet. Det anbefales å sette php. Dette er fortsatt støttes, så korte koder med