[Powered by Google Translate] [Afsnit 8 - Mere behagelig]
[Rob Bowden - Harvard University]
[Dette er CS50. - CS50.TV]
>> Disse uger afsnit noter vil være temmelig korte,
så jeg bare har tænkt mig at holde taler, er du fyre kommer til at holde stille spørgsmål,
og vi vil forsøge at fylde så meget tid som muligt.
En masse mennesker tror, ​​at denne Pset ikke nødvendigvis er svært, men det er meget lang.
Den Pset spec selv tager en time at læse.
Vi giver dig en masse SQL du kunne muligvis behov for at bruge.
Vi går du gennem en masse af det, så det burde ikke være alt for dårlig.
Har nogen startet eller færdig?
Det er den sidste Pset. Åh, min Gud.
Normalt er der en JavaScript ene efter dette, men kalender ændre tingene
gør alt 1 uge kortere, og vi ikke længere har en JavaScript Pset.
Jeg ved ikke, hvordan det påvirker, om JavaScript vil blive vist på eksamen
eller Quiz 1.
Jeg forestiller mig, det vil være noget som du behøver at vide på højt niveau ting om JavaScript,
men jeg tvivler på, vi ville bare give dig straight JavaScript-kode
da du ikke har haft en Pset i det.
Men det vil være ting for quiz revision i næste uge.
>> Afsnit med spørgsmål.
En masse af disse ting er noget dårligt formuleret, men vi vil diskutere hvorfor.
I modsætning til C, er PHP en "dynamisk-skrevet" sprog. Hvad betyder det, spørger du?
Nå, siger farvel til alle dem char, float, int, og andre søgeord du skal bruge
når erklære variable og funktioner i C.
I PHP, er en variabels type, bestemt af den værdi, den i øjeblikket bedrift.
Så før vi skriver denne kode i en fil kaldet dynamic.php,
PHP er dynamisk skrives. Det er rigtigt.
Jeg er uenig med, at det betyder, at vi siger farvel til char, float, int,
og andre søgeord.
Den nøjagtige forskel mellem dynamisk maskinskrevet og subsidiært,
der er statisk skrevet, er der dynamisk skrevet, er alle dine typekontrol og kram
sker under kørslen, mens statisk skrevet det sker ved oversættelsen.
Ordet statiske generelt synes at betyde kompilere tid ting.
Jeg tror der er andre anvendelser for det, men i C, når du erklærer en statisk variabel,
opbevaringen heraf fordeles påkompileringstidspunktet.
Her dynamisk skrevet betyder blot, at -
I C, hvis du forsøger at tilføje en streng og et heltal, når du kompilere det,
det kommer til at klage fordi det kommer til at sige, at du ikke kan tilføje en int og en pegepind.
Det er bare ikke en gyldig operation.
Det er en anden ting, som vi vil komme til i et sekund.
Men den slags kontrol, at det klager påkompileringstidspunktet,
er statisk typekontrol.
Der er sprog, hvor man ikke behøver at sige char, float, int, og alle disse ting,
men sproget kan fortælle fra rammerne af ting, hvad type det er meningen at være,
men det er stadig statisk indtastet.
Så hvis du tager 51, OCaml, du aldrig behøver at bruge nogen af ​​disse typer,
men det vil stadig påkompileringstidspunktet siger, du kan ikke gøre dette, fordi du blander en int og en streng.
Dynamisk skrevet betyder bare, at engang i løbet køres tid du vil få en klage.
Hvis du også har brugt Java før i almindelighed næsten enhver C-type sprog
vil blive statisk skrives, så C, C + +, Java, alle af dem er generelt statisk indtastes.
I Java når du kompilerer noget, og du siger
string s lig ny noget, der ikke er en streng,
der kommer til at klage fordi disse typer bare ikke passer sammen.
Det kommer til at klage ved oversættelsen.
Men det har også noget dynamisk tid ting som hvis du forsøger at kaste noget
til en type, der er mere specifik end den nuværende type,
der er ikke noget den kan gøre påkompileringstidspunktet at kontrollere, om der stemmer kommer til at lykkes.
Java har også nogle dynamiske type kontrol af, at så snart det bliver til denne linje kode
når det er faktisk bliver kørt, det kommer til at gøre de medvirkende,
tjekke om dette stemmer var gyldig i første omgang,
og hvis det ikke var, så det kommer til at klage over, at du har en ugyldig type.
Dynamisk type, kontrol.
Skriv dette i en fil kaldet dynamic.php.
Dynamic.php.
Vil jeg pakke det formatering.
Vi har en variabel, vi har sat det til det hele tal 7,
så vil vi udskrive den og% s -
Oh, vi udskriver typen af ​​det, er så getType vil vende tilbage til typen af ​​den variable.
Vi er bare udskriver den type igen og igen.
Vi har lige php.dynamic.php.
Vi vil se, at den ændres fra heltal til streng til Boolean som vi går igennem.
I C er der ingen Boolean datatype, er der ingen streng datatype.
Der er char * og Boolesk bare tendens til at være int eller char eller noget.
I PHP disse typer, der findes, og det er en af ​​de store fordele ved PHP end C -
at strengoperationer er uendeligt lettere i PHP end C. De bare arbejde.
>> Så vi kommer tilbage her.
Vi kørte dynamic.php.
Dette fortæller PHP tolk, kaldet php, til at køre PHP-kode i dynamic.php.
Hvis du har nogle fejl i filen, vil tolk fortælle dig!
Tolken, dette er en anden stor forskel mellem PHP og C.
I C du nødt til at oversætte noget, og derefter kører det kompileret fil.
I PHP du aldrig kompilere noget.
Så PHP fortolkeren er dybest set bare at læse denne linje for linje.
Det rammer var = 7 så det rammer printf så det rammer var så det rammer printf og så videre.
Der er en smule for at udarbejde det gør, og det cacher resultatet
så hvis du kører scriptet senere du kan gøre nogle,
men dybest set er det en linje for linje slags ting.
Det betyder, at mange af de optimeringer, vi får i C,
ligesom kompilering, er det bare generelt compileren kan gøre en masse tricks for dig.
Det kan tage ud ubrugte variabler, kan det gøre alle disse slags ting,
det kan gøre hale rekursion.
I PHP, du ikke vil få denne fordel
fordi det bare kommer til at starte fuldbyrdende linje for linje for linje,
og det gør ikke rigtig genkende disse ting så let
da det ikke er 1 stor samling pass over ting og derefter udførelse;
det er bare linje for linje.
Så det er tolk.
>> Tilbage til vores dynamiske skrive: pretty cool, eh?
Du absolut ikke kunne gøre det i C!
Nu, se om du kan finde ud af, hvilken type af hver af de følgende værdier.
Se dette som reference.
Så 3,50. Hvilken type tror du der kommer til at være?
Her er de typer, vi har.
Vi har bools, heltal, flydende punkter, strygere, arrays, objekter,
og derefter ressourcer, som er form for vag.
Jeg tror, ​​der er faktisk et eksempel her.
Så er der NULL. NULL er en speciel type.
I modsætning til C hvor NULL er blot en pointer med adresse 0,
i PHP, er NULL sin egen type, hvor det eneste gyldige ting af denne type er NULL.
Dette er meget mere nyttigt for fejlkontrol.
I C hvor vi havde dette problem hvor Hvis du returnere NULL,
betyder det, at du returnerer en NULL pointer eller bruge NULL til at betyde fejl
af eller hele denne forvirring, vi havde på et tidspunkt.
Her vender NULL betyder generelt fejl.
En masse ting også returnere false for fejl.
Men pointen er den NULL type, det eneste af den NULL type er NULL.
Så tilbagekald er ligesom du kan definere nogle anonyme funktioner.
Du behøver ikke at give funktionen et navn, men du vil ikke have at beskæftige sig med det her.
Ser man på de typer, som de ikke forventer os at vide,
hvad tror du, hvilken type 3,50 er? >> [Studerende] Float.
Yeah.
Altsaa her, hvad tror du, hvilken type af denne er? >> [Studerende] Array.
Yeah. Det første var float, den anden er et array.
Bemærk, at dette array ikke er som et C-array
hvor du har index 0 har en vis værdi, index 1 har en vis værdi.
Her indeks er a, b og c og værdierne er 1, 2, og 3..
I PHP er der ingen forskel mellem en associativ array og bare en almindelig opstilling
som du ville tænke på det i C.
Der er blot dette, og under hætten en regelmæssig række er bare et associativt array
hvor 0 kort til en vis værdi på samme måde en kort til en vis værdi.
Af denne grund, kan PHP være temmelig dårligt for virkelig hurtig kode / benchmarking ting
da der i C, når du bruger et array du ved, at adgang til et medlem er konstant tid.
I PHP adgang til en medlem er der ved hvor meget tid?
Det er sandsynligvis konstant, hvis det hashes korrekt.
Hvem ved, hvad det virkelig gør under kølerhjelmen?
Du har virkelig brug for at se på gennemførelsen for at se, hvordan det kommer til at beskæftige sig med det.
Så fopen.
Jeg tror her lad os bare PHP manual fopen til at se på returtype.
Vi ser her kan du slå op stort set enhver funktion i PHP manualen
og dette er en slags manden side af PHP.
Afkastet typen vil være ressource.
Det er derfor, jeg slog det op, fordi vi ikke rigtig definere ressource.
Ideen om ressource i C du slags fik en FIL * eller hvad;
i PHP ressourcen er din FILE *.
Det er, hvad du kommer til at læse fra, det er hvad du vil skrive til.
Det er som regel eksterne, så det er en ressource, du kan trække ting fra og kaste ting til.
Og endelig, hvad er den type NUL? >> [Studerende] NULL.
Yeah. Så det eneste, der er NULL er NULL.
NULL er NULL.
>> Et træk af PHP-typen system (for bedre eller værre) er dens evne til at jonglere typer.
Når du skriver en linje af PHP kode, der kombinerer værdier af forskellige typer,
PHP vil forsøge at gøre det fornuftige.
Prøv hver af de følgende linjer af PHP kode. Hvad er udskrevet?
Er det hvad du forventede? Hvorfor eller hvorfor ikke?
Dette faktum om PHP er hvad gør det, hvad vi kalder svagt indtastet.
Svagt skrevet og stærkt skrevet,
der er forskellige anvendelser for disse begreber,
men de fleste mennesker bruger svagt skrevet og stærkt skrevet at betyde den slags ting
hvor ("1" + 2), der virker.
I C, der ikke ville arbejde.
Du kan forestille dig dette ikke fungerer.
En masse mennesker blandes op dynamisk skrive og svag skrive og statisk skrive og stærk skrive.
Python er et andet eksempel på et sprog, der er dynamisk skrevet.
Du kan smide rundt typer i variabler og det kommer til at afgøre på kørselstidspunktet
eventuelle fejl kontroller,.
I Python det kommer til at udføre dette, og det vil se ("1" + 2);
og dette vil mislykkes, fordi det siger du kan ikke tilføje en streng og et heltal.
I PHP, som er lige så dynamisk skrevet, vil dette ikke mislykkes.
Svag typebestemmelse har at gøre med det faktum, at det gør tingene med typer
som ikke rigtig mening nødvendigvis.
Så ("1" + 2), og jeg kan forestille mig, at det at være strengen 12, kan jeg forestille mig, det er den streng 3,
Jeg kan forestille mig, det er det hele tal 3.
Det er ikke nødvendigvis godt defineret, og vi sandsynligvis kommer til at se her
at når vi udskriver ("1" + 2), det er nok kommer til at ende med at blive anderledes
end udskrivning (1 + "2").
Og det plejer at være, efter min mening, til det værre.
Her kan vi prøve disse.
Et andet lille trick om PHP er du ikke behøver at faktisk skrive filen.
Det har kørt denne kommando mode.
Så php-r, så vi kan smide i kommandoen her:
"Print ('1 '+ 2)," og jeg smider en ny linje.
Dette trykte 3.
Det ser ud som det udskrives 3, og det er det hele tal 3.
Så lad os nu prøve den anden vej rundt:
"Print (1 + '2 ');
Vi får 3, og er det også kommer til at være heltal 3? Jeg ærligt har ingen idé.
Det ligner, der er konsistent.
Der er aldrig nogen chance for at det er strengen 12 eller sådan noget
fordi PHP, i modsætning til JavaScript og Java også,
har en separat operatør for sammenkædning.
Sammenkædning i PHP er prik.
Så udskrivning (1 '2 '.) Vil give os 12.
Denne tendens til at føre til forvirring, hvor folk forsøger at gøre noget som str + =
nogle andre ting, som de ønsker at tilføje til slutningen af ​​deres streng, og det kommer til at mislykkes.
Du er nødt til at gøre str. =
Så glem ikke sammenkædning i PHP er en prik.
Andre ting, du kan prøve: Print ("CS" + 50);
Jeg har fortalt dig, at der ikke er noget håb for denne resulterer i CS50
idet sammenkædning ikke +.
Hvad tror du, det kommer til at ende med at blive?
Jeg ærligt har absolut ingen idé.
Det ser ud til det er bare 50.
Det ser strengen, og jeg vædde på, hvis vi sætter 123CS -
Det ser den første streng, det forsøger at læse et helt tal fra det eller et nummer fra det.
I dette tilfælde er det ser 123CS.
"Det giver ingen mening som et heltal, så jeg bare at tænke på 123".
Så 123 + 50 vil være 173.
Og her begynder det at læse dette som et heltal.
Det ser ikke noget, så det bare behandler det som 0. Så 0 + 50 vil være 50.
Dette Jeg antager kommer til at gøre noget lignende.
Jeg tænker 99.
Ja, fordi det kommer til at tage det første -
So 99.
Her (10/7), hvis dette var C, hvad ville det vende tilbage?
[Studerende] 1. >> Ja, det ville være 1, fordi 10/7 er at dividere 2 heltal.
Et heltal divideret med et heltal vil returnere et heltal.
Det kan ikke returnere 1 point hvad det så end ville være, så det er bare at vende tilbage 1.
Her udskrivning (10/7); det kommer til rent faktisk at fortolke det.
Og det betyder, at hvis du rent faktisk ønsker at gøre heltal afrunding og den slags,
du behøver at gøre print (gulv (10/7));
I C er det nok underligt, at du kan stole på afkortede heltal regelmæssigt,
men i PHP, kan du ikke fordi det automatisk vil gøre det til en float.
Og så (7 + true); hvad tror du der kommer til at være?
Jeg kan gætte 8, hvis det kommer til at fortolke sandt som 1.
Det ser ud til det er 8.
>> Så alt vi har gjort i de sidste 10 minutter, du bør absolut aldrig gøre.
Du vil se kode, der gør dette.
Det behøver ikke at være så enkel som dette.
Du kunne have 2 variabler, og 1 variabel sker for at være en streng
og den anden variabel sker for at være en int, og derefter tilføjer du disse variabler sammen.
Da PHP dynamisk der skrives, og det vil ikke gøre nogen typekontrol for dig
og da det svagt er skrevet, og da det bare vil automatisk smide disse ting sammen
og alt vil bare arbejde, er det svært at selv vide, at denne variabel skal være en streng nu,
så jeg skal ikke tilføje det til denne variabel, som er et heltal.
Bedste praksis er, hvis en variabel er en streng, holde det som en streng for evigt.
Hvis en variabel er en int, holde det som en int evigt.
Hvis du ønsker at beskæftige sig med tal og strygere,
du kan bruge varsint - det er JavaScript.
Intval. Jeg gør det hele tiden. PHP og JavaScript jeg blander alt.
Så intval vil returnere heltal værdien af ​​en variabel.
Hvis vi passerer i "print (intval ('123 ')); får du 123.
Intval ikke selv tænkt sig at gøre kontrollen for os, at det er udelukkende et heltal.
PHP manual, der er bare så mange funktioner til rådighed,
så her jeg mener, hvad jeg ville bruge er is_numeric først.
Jeg kan gætte, at returnerede falsk.
Det er en anden ting, vi er nødt til at gå over er ===.
Så is_numeric ('123df «), ville du ikke tænke på, at så is_numeric.
I C ville du nødt til at gentage over alle tegn
og kontrollere, om hver karakter er ciffer eller hvad.
Her is_numeric vil gøre det for os,
og det er tilbage falsk.
Så da jeg udskrevet det, det trykte ingenting, så her er jeg sammenligne det at se,
har du tilfældigvis er falsk? Og så nu er det udskrivning 1.
Tilsyneladende udskriver den 1 som sand i stedet for at printe sandt som sandt.
Jeg spekulerer på, om jeg gør print_r. Nej, det stadig gør 1.
>> Går tilbage til ===, == stadig eksisterer,
og hvis du taler med Tommy han vil sige == er helt fint.
Jeg har tænkt mig at sige, at == er forfærdeligt, og du bør aldrig bruge ==.
Forskellen er, at == sammenligner tingene
hvor det kan være tilfældet, selvom de ikke er af samme type,
hvorimod === sammenligner ting og først kontrollerer er de samme type?
Ja. Okay, nu vil jeg se, om de rent faktisk sammenligne at være lige.
Du får underlige ting som 10 lig - Lad os se, hvad det siger.
Så ('10 '== '1 e1');
Det returnerer sandt.
Er der nogen der har nogen gæt hvorfor dette returnerer sandt?
Det handler ikke kun om det. Måske dette er et hint.
Men hvis jeg ændre det til en f - darn det! Jeg holder ved hjælp anførselstegn.
Grunden de dobbelte citater råben på mig, er fordi jeg har sat dette i anførselstegn.
Så jeg kunne undslippe de dobbelte anførselstegn i her, men enkelte anførselstegn gøre det lettere.
Så ('10 '== '1 f1'); udskriver ikke sandt. ('10 '== '1 E1'); udskriver sandt.
[Studerende] Er det hex? >> Det er ikke hex, men det er tæt på, at det er ligesom -
1E1, videnskabelig notation.
Det erkender 1E1 som 1 * 10 ^ 1 eller whatever.
Det er lige heltal.
Hvis vi gør === så det kommer til at være falsk.
Jeg har faktisk ingen idé, hvis vi gør == hvad (10 og '10abc ');? Ok. Så det er sandt.
Så ligesom når du gjorde (10 + '10abc «), og det ville være 20,
her (10 == '10abc '); er sandt.
Endnu værre er ting som (falsk == NULL); er sandt
eller (false == 0), er sandt, (false == []);
Der er underlige tilfælde - Det er en af ​​de mærkelige sager.
Bemærk, at (falsk == []) er sandt.
('0 '== False), er sandt.
('0 '== []) Er falsk.
Så == er på ingen måde transitiv.
a kan være lig med b og a kan være lig med c,
men b måske ikke være lig med ca.
Det er en vederstyggelighed for mig, og du bør altid bruge ===.
[Studerende] Kan vi gøre! == Så godt? >> [Bowden] Ja.
Den tilsvarende ville være! = Og! ==.
Dette er faktisk opdraget i Pset spec
hvor en masse funktioner afkast -
PHP manual er godt om dette.
Det lægger en stor rød boks, "Dette vil returnere falsk, hvis der er en fejl."
Men tilbage 0 er en helt rimelig ting at vende tilbage.
Tænk enhver funktion, som forventes at vende tilbage et heltal.
Lad os sige, denne funktion er meningen at tælle antallet af linier i en fil eller noget.
Under normale omstændigheder passerer man denne funktion en fil
og det kommer til at returnere et heltal, der repræsenterer antallet af linjer.
Så 0 er et helt rimeligt antal, hvis filen er bare tom.
Men hvad nu hvis du passerer det en ugyldig fil og funktionen sker for at returnere falsk
hvis du passerer det en ugyldig fil?
Hvis du bare gør == du ikke differentiere tilfældet mellem ugyldig fil og tom fil.
Brug altid ===.
Det er alt af dem.
>> I PHP, er det tabeltype anderledes, end du er vant til i C.
Faktisk har du måske allerede bemærket dette ovenfor, når du så, at det er af typen array.
Konsollen syntaks er ny som i PHP 5,4, som er den nyeste version af PHP.
Før dette kan du altid nødt til at skrive array ('a' -> 1, 'b' -> 2.
Det var constructoren for et array.
Nu PHP er endelig kommet rundt til nice syntaks af blot kantede parenteser,
der er bare så meget bedre end array.
Men i betragtning af PHP 5,4 er den nyeste version,
kan du støde på steder, der ikke engang har PHP 5.3.
I løbet af sommeren vi løb ind i dette spørgsmål, hvor PHP 5,3 var, hvad vi havde på apparatet,
men den server, vi indsatte alle vores karakterbog og indsende og alt det der til
var PHP 5.4.
Ikke kender dette, vi udviklede i 5,3, skubbede til 5,4,
og nu pludselig ingen af ​​vores kode virker
fordi der tilfældigvis har været ændringer mellem 5,3 og 5,4
som ikke er bagud kompatible,
og vi er nødt til at gå og ordne alle vores ting, der ikke fungerer for PHP 5,4.
For denne klasse, har siden apparatet gør PHP 5,4,
det er helt fint at bruge kantede parenteser.
Men hvis du søger ting op omkring Internettet,
hvis du søger op eller anden form for array-ting, mest sandsynligt du vil se
magien ud arrayet konstruktionsfunktionsyntaks siden, der har eksisteret siden PHP blev født
og firkantede beslag syntaks har eksisteret i de sidste par måneder
eller når 5,4 kom rundt.
Dette er, hvordan du indeks.
Ligesom i C hvordan du ville indekset med firkantede parenteser som $ array [0], $ array [1], $ array [2],
du index på samme måde, hvis du tilfældigvis har dine indeks er strenge.
Så $ array ['a'] og $ array ['b'].
$ Array [b]. Hvorfor skulle det være forkert?
Det vil sandsynligvis generere en advarsel, men stadig arbejde. PHP har tendens til at gøre det.
Det har tendens til bare, "Jeg har tænkt mig at advare dig om dette, men jeg vil bare at holde i gang
"Og gøre, hvad jeg kan."
Det vil sandsynligvis oversætte dette til en streng,
men det er muligt at på et tidspunkt i fortiden nogen sagde
definere b for at være "Hello World".
Så nu B kunne være en konstant og $ array [b] rent faktisk vil gøre "Hello World".
Jeg tror på dette punkt, eller i det mindste vores PHP-indstillinger,
hvis du forsøger at indeksere i et array, og at nøglen ikke eksisterer, vil det mislykkes.
Jeg tror ikke, det vil bare advare dig.
Eller i det mindste du kan indstille den, så den ikke bare advare dig, det bare lige op mislykkes.
>> Den måde, du kontrollere, om der rent faktisk er sådan et indeks er isset.
Så isset ($ array ['Hello World']) vil returnere falsk.
isset ($ array ['b']) vil returnere sandt.
Du kan blande disse syntakser.
Jeg er temmelig sikker på, hvad dette array ville ende med at blive, er - Vi kan teste det ud.
Åh, jeg har brug PHPWord.
Dette er at blande den syntaks, hvor du angiver, hvad nøglen er
og du behøver ikke angive, hvad nøglen er.
Så 3 højre her er en værdi.
Du har ikke udtrykkeligt sagt, hvad dens nøgle bliver.
Hvad tror du sit nøgle kommer til at være?
[Studerende] 0. >> Jeg gætte 0 kun fordi det er det første vi har ikke specificeret.
Vi kan faktisk gøre et par af disse sager.
Så print_r er udskrive rekursiv. Det vil udskrive hele array.
Det ville udskrive subarrays af arrayet hvis der var nogen.
Så print_r ($ array); php.test.php.
Det ser ud, som den gav det 0.
Der er faktisk noget at huske på her, men vi vil komme tilbage til det i en anden.
Men hvad nu hvis jeg kommer til at lave dette indeks 1?
PHP skelner ikke mellem streng indekser og integer indekser,
så på dette punkt Jeg har netop defineret et indeks 1 og jeg kan gøre begge dele $ array [1] og $ array ['1 ']
og det vil være det samme indeks og samme nøgle.
Så hvad nu tror du 3 kommer til at være? >> [Studerende] 2. >> [Bowden] Jeg kan gætte 2.
Yeah. Det er 2.
Hvad hvis vi gjorde dette er 10, det er 4? Hvad tror du indekset på 3 bliver?
Jeg tænker 11.
Mit gæt på hvad PHP gør - og jeg tror, ​​jeg har set det før -
er det blot holder styr på, hvad det højeste numeriske indeks det bruges hidtil er.
Det er aldrig kommer til at tildele en streng indeks til 3. Det vil altid være et numerisk indeks.
Så det holder styr på det højeste det er tildelt hidtil, hvilket sker for at være 10,
og det kommer til dannelse af 11 til 3.
Hvad jeg sagde før, bemærk den måde, det er ved at udskrive denne array.
Den udskriver tast 10, tast 4, tast 11, tasten d.
Eller endda lade os gøre -
Jeg gætter jeg ikke sætte et 0, men det er udskrivning 1, 2, 3, 4.
Hvad hvis jeg skifter her? Eller lad os faktisk skifte disse 2.
Nu udskriver 2, 1, 3, 4.
PHP er arrays er ikke ligesom din almindelige hash tabellen.
Det er helt rimeligt at tænke på dem som hash tabeller 99% af tiden.
Men i dine hash tabeller er der ingen fornemmelse af, i hvilken rækkefølge tingene blev indsat.
Så så snart du indsætter det i din hash tabel,
antage, at der er ingen linkede liste, og du kan dømme i en sammenkædet liste
som blev indsat først.
Men her har vi indsat 2 første, og det ved, hvornår det er at udskrive dette array, at 2 kommer først.
Det betyder ikke printe det ud i en hvilken som helst rækkefølge.
De tekniske data struktur, at det er ved hjælp af en ordnet kort,
så den rummer nøglerne til værdier og den husker den rækkefølge, hvori disse nøgler blev indsat.
Dybest set er det til nogle komplikationer, hvor det er irriterende at der faktisk -
Lad os sige du har et array 0, 1, 2, 3, 4, 5
og du ønsker at tage ud index 2.
En måde at gøre det på, lad os se hvad der ligner.
0, 2, 1, 3, 4.
Unset sker for at nulstille både variable og array-indeks.
Så frakoblet ($ array [2]);
Nu hvad dette kommer til at se ud? 2 er lige gået, så det er helt fint.
Mere irriterende er, hvis du vil have tingene til rent faktisk at være som et array.
Jeg vil sætte tilfældige tal.
Læg nu mærke mine indeks.
Jeg vil have det til bare være ligesom en C-array, hvor den går fra 0 til længde - 1
og jeg kan gentage over det som sådan.
Men så snart jeg frakoble det andet indeks, hvad der var i indeks 3 ikke nu blevet indeks 2.
I stedet er det bare fjerner nævnte indeks, og nu du gå 0, 1, 3, 4.
Det er helt rimeligt.
Det er bare irriterende, og du er nødt til at gøre ting som array-splejsning. Yeah.
>> [Studerende] Hvad ville der ske, hvis du havde en for-løkke
og du ønskede at gå over alle elementer?
Når det ramte 2, ville det give nogensinde?
Iteration over et array. Der er 2 måder, du kan gøre det.
Du kan bruge en almindelig for-løkke.
Dette er en anden forviklinger af PHP.
De fleste sprog, jeg ville sige, har en form for længde eller len eller noget
angiver længden af ​​et array.
I PHP er det tæller.
Så count ($ array); $ i + +)
Lad os bare print ($ array [$ i]);
Notice: Undefined offset: 2.
Det er bare kommer til at mislykkes.
Dette er grunden til at, for det meste, du aldrig behøver at gentage over et array som denne.
Det kunne være en overdrivelse, men du aldrig behøver at gentage over et array som dette
fordi PHP giver sin foreach syntaks hvor foreach ($ array som $ emne).
Nu, hvis vi udskriver ($ emne) - we'll diskutere det i en anden - det virker helt fint.
Den måde, foreach arbejder er den første argument er det array, du iteration over.
Og det andet argument, post, gennem hver passage af for-løkken
det kommer til at tage den næste ting i array. Så husk array har en ordre.
Første gang gennem for-løkken, er post vil 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.
Tingene bliver virkelig underligt, når du gør noget som foreach.
Lad os se hvad der sker, fordi du aldrig bør gøre dette.
Hvad hvis vi frakoblet ($ array [1]);
Det var sandsynligvis forventet.
Du iteration over dette array, og hver gang du frakoble den første indeks.
Så for indeks 0, tager den første ting, punkt på værdien 0, så det kommer til at være 123.
Men inde i for-løkken vi frakoblet indeks 1, så betyder 12 er væk.
Så udskrive. PHP_EOL.
PHP_EOL er bare linjeskift, men det er teknisk set mere bærbar
da newlines i Windows er forskellig fra newlines på Mac og UNIX.
På Windows linjeskift er \ r \ n, hvorimod alle andre steder det har en tendens blot at være \ n.
PHP_EOL er konfigureret således, at den bruger uanset newline af dit system er.
Så udskrive denne. Lad os ikke print_r ($ array) i slutningen.
Jeg havde ingen idé om, at det ville være adfærd.
Vare stadig tager på værdien 12, selvom vi frakoble 12 før vi nogensinde fik det fra arrayet.
Tag ikke mit ord på dette, men det ligner foreach opretter en kopi af array
og derefter punkt tager på alle værdier af denne kopi.
Så selvom du ændrer array inde i for-løkken,
det vil ikke pleje. Item vil tage på de oprindelige værdier.
Lad os prøve frakobling det.
Hvad hvis det er $ array [1] = "hej";
Selvom vi sætter "hello" i array, punkt aldrig tager på denne værdi.
Der er en anden syntaks til foreach løkker
hvor du lægger 2 variabler adskilt af en pil.
Denne første variabel vil være nøglen til denne værdi,
og denne anden variabel bliver nøjagtig de samme element.
Dette er uinteressant her, men hvis vi går tilbage til vores oprindelige tilfælde af 'a' -> 1,
'B' -> 1,
her, hvis vi bare gentage for hver array som elementtype, emne vil være 1 hver eneste gang.
Men hvis vi vil også gerne vide nøglen tilknyttet dette punkt
så gør vi som $ key -> $ element.
Så nu kan vi gøre print ($ key. ':'.
Nu er det iteration over og udskrivning af hver nøgle og dens tilhørende værdi.
>> En ekstra ting, vi kan gøre i foreach loops er du måske se denne syntaks.
-Tegn før variabelnavne tendens til at være, hvordan PHP gør referencer.
Hvor referencer er meget lig pegepinde,
du ikke har pegepinde, så du aldrig beskæftige sig med hukommelse direkte.
Men du har referencer hvor 1 variabel dækker det samme som en anden variabel.
Inde i her lad os gøre $ element. Lad os gå tilbage til 1, 10.
Lad os gøre $ element + +; Det eksisterer stadig i PHP. Du kan stadig gøre + +.
php.test.php. Jeg er nødt til at udskrive det. print_r ($ array);
Vi udskriver 2, 11.
Hvis jeg bare havde gjort foreach ($ array som $ emne), så item vil være værdien 1
første gennemløb af løkken. Det vil forøge 1 til 2 og derefter er vi færdige.
Så det vil gå igennem det andet gennemløb af løkken, og denne post er 10.
Det spring emne til 11, og så det er bare smidt væk.
Så vi print_r ($ array), og lad os se, at dette er kun 1, 10.
Så tilvækst vi gjorde var tabt.
Men foreach ($ array som & $ emne)
nu denne post er den samme post som denne her. Det er det samme.
Så $ element + + er at ændre opstilling 0.
Dybest set, kan du også gøre $ k -> $ emne, og du kan gøre $ array [$ k] + +;
>> Så en anden måde at gøre det, er vi frie til at ændre punkt,
men det vil ikke ændre vores oprindelige array.
Men hvis vi bruger k, som er vores nøgle, kan vi så bare indekset i vores array ved hjælp af denne nøgle
og øg det.
Denne mere direkte ændrer vores oprindelige array.
Du kan endda gøre det, hvis en eller anden grund du ville evnen til at modificere -
Faktisk, det er helt rimeligt.
Du havde ikke ønsker at skulle skrive $ array [$ k] + +,
De ville bare skrive $ element + + men du stadig ønskede at sige if ($ k === 'a')
derefter tilvækst emne og derefter udskrive vores array.
Så nu hvad forventer vi print_r at gøre? Hvilke værdier skal udskrives?
[Studerende] 2 og 10. >> [Bowden] Kun hvis nøglen var 'a' har vi faktisk udskrive det.
>> Du har sandsynligvis meget sjældent, om nogensinde, bliver nødt til at definere funktioner i PHP,
men du kan se noget lignende, hvor du definerer en funktion som funktion uanset.
Normalt ville du sige ($ foo, $ bar), og derefter definere det at være hvad som helst.
Men hvis jeg gør dette, så det betyder, at uanset hvad kalder uanset hvad,
uanset kalder baz, så den første argument sendt til baz kan ændres.
Lad os gøre $ foo + +;
og indersiden af ​​her lad os gøre baz ($ emne);
Nu er vi kalder en funktion.
Argumentet er taget som reference, hvilket betyder, at hvis man ændre det
vi ændre de ting, der blev vedtaget i.
Og udskrivning dette forventer vi - med mindre jeg rodet op syntaks - vi fik 2, 11,
så det var faktisk øges.
Varsel vi har brug for referencer i 2 steder.
Hvad hvis jeg gjorde det? Hvad betyder dette?
[Student] Det vil ændre sig. >> Yeah.
Varen er blot en kopi af værdien i array.
Så emne vil skifte til 2, men det array ['a'] vil stadig være 1.
Eller hvad hvis jeg gør dette?
Nu vare sendes som en kopi til baz.
Så kopi af argumentet vil blive forøget til 2,
men selve elementet blev aldrig inkrementeret til 2.
Og punkt på dagsordenen er det samme som array-beslag uanset hvad,
således at arrayet er aldrig blevet inkrementeret.
Så begge disse steder har brug for det.
>> PHP er normalt temmelig smart om dette.
Du tror måske, jeg ønsker at videregive ved henvisning -
Dette var faktisk et spørgsmål på en af ​​psets.
Det var en questions.txt ting, hvor det siges,
Hvorfor har du måske lyst til at passere denne struct som reference?
Hvad var svaret på det?
[Studerende] Så du ikke behøver at kopiere noget stort. >> Yeah.
En struct kan være vilkårligt stor, og når du passerer struct ind som et argument
er det nødvendigt at kopiere, at hele struct at videregive det til den funktion,
hvorimod hvis du bare forbi struct ved henvisning
så det skal bare kopiere en 4-byte-adresse som argument til funktionen.
PHP er en lille smule klogere end det.
Hvis jeg har nogle funktion og jeg passerer den et array på 1.000 ting,
betyder det det er nødt til at kopiere alt 1.000 af disse ting
at passere den i funktion? Det behøver ikke at gøre det samme.
Hvis indersiden af ​​denne funktion aldrig det faktisk ændrer foo,
så hvis ($ foo === 'hello') returnere sandt.;
Bemærk at vi faktisk aldrig ændret argumentet indersiden af ​​denne funktion,
hvilket betyder, at hvad der var passeret ind som Foo aldrig skal kopieres
fordi det ikke er at ændre det.
Så den måde PHP værker er argumenterne er altid sendes som reference
indtil du rent faktisk forsøge at ændre det.
Nu hvis jeg sige $ foo + +, og det vil nu lave en kopi af den originale foo og ændre kopien.
Det sparer tid.
Hvis du aldrig røre denne massive array, du faktisk aldrig ændre det,
det behøver ikke at gøre kopien,
hvorimod hvis vi bare sætte denne tegnet betyder det ikke engang kopiere det
selv hvis du ændre det.
Denne adfærd kaldes copy-on-write.
Du vil se det andre steder, især hvis du tager et operativsystem kursus.
Copy-on-write er en temmelig sædvanlige mønster, hvor du ikke behøver at lave en kopi af noget
medmindre det rent faktisk er under forandring. Yeah.
[Studerende] Hvad hvis du havde tilvækst inde i testen,
så kun 1 element ud af 1.000 vil skulle ændres?
Jeg er ikke sikker.
Jeg tror, ​​det ville kopiere hele ting, men det er muligt, det er smart nok at -
Faktisk, hvad jeg tænker, er forestille vi havde et array, der ser sådan ud: $ matrix2 = [
Så indeks »a« er en vifte af [1 2 3 4], og indeks 'b' er en vifte af hvad som helst.
Jeg har brug komma mellem alle dem. Forestille der er komma.
Så 'c' er værdien 3.
Okay.
Lad os nu sige, vi gør $ baz ($ matrix2);
hvor baz ikke tager dette som reference.
Så $ foo ['c'] + +;
Det er sådan et eksempel, hvor vi passerer matrix2 som et argument
og så er det at modificere et specifikt indeks af arrayet ved at forøge den.
Jeg ærligt har ingen idé om, hvad PHP vil gøre.
Det kan nemt lave en kopi af hele ting, men hvis det er smart,
det vil gøre en kopi af disse taster, hvor det vil have sin særegne værdi
men dette kan stadig pege på den samme array 1,2,3,4
og dette kan stadig pege på den samme array.
Jeg vil iPad det.
Vi passerer i dette array, hvor denne fyr point til 3, denne fyr point til [1,2,3,4],
denne fyr peger på [34, ...]
Nu, hvor vi passerer den til baz, vi ændre denne.
Hvis PHP er smart, kan det bare gøre -
Vi havde stadig at kopiere noget hukommelse, men hvis der var disse enorme indlejrede subarrays
vi ikke brug for at kopiere dem.
Jeg ved ikke, om det er, hvad det gør, men jeg kan forestille mig, det gør det.
Dette er også en temmelig stor fordel af C over PHP.
>> PHP gør livet så meget lettere for en masse ting,
men du slags har absolut ingen idé om, hvor godt det vil udføre
fordi jeg har ingen idé under kalechen, når det gør disse kopier af ting,
Åh, er, at vil være en konstant tid kopi,
er det bare at ændre 1 pegepind, er det vil være et latterligt svært lineær kopi?
Hvad hvis den ikke kan finde plads?
Er det så nødvendigt at køre garbage collection for at få nogle mere plads?
Og garbage collection kan tage vilkårligt lang.
I C du ikke behøver at bekymre sig om disse ting.
Hver eneste linje, du skriver du kan temmelig meget grund om, hvordan det kommer til at udføre.
>> Lad os se tilbage på disse.
Hvor dejligt er det, at du ikke behøver at beskæftige sig med hash-funktioner,
hægtede lister, eller noget?
Da arbejdet med hash tabeller er så let nu, her er en sjov puzzle at arbejde på.
Åbn en fil kaldet unique.php og i den skriver et PHP-program
(Også kendt som et "script").
Vi er tilbøjelige til at kalde dem scripts, hvis de er korte ting, som du kører på kommandolinjen.
Dybest set, alle sprog, som du ikke kompilere, men du kommer til at køre den eksekverbare
på kommandolinjen, kan du kalde det eksekverbart script.
Jeg kunne lige så godt skrive et C-program, der gør dette,
men jeg kan ikke kalde det et script siden jeg første kompilere det og derefter køre den binære.
Men denne PHP program vil vi kalde et script.
Eller hvis vi skrev det i Python eller Perl eller Node.js eller nogen af ​​disse ting,
vi ville kalde dem alle scripts fordi du kører dem på kommandolinjen
men vi har ikke kompilere dem.
Vi kunne gøre det temmelig hurtigt.
Vi vil ikke bruge argv. Lad os bare blæse gennem denne.
Kald det unikke, skrive et program.
Du kan antage, at input vil indeholde et ord pr linje.
Faktisk vil argv være temmelig trivielt at bruge.
unique.php.
Første ting først, vi ønsker at se, om vi er blevet passeret 1 kommando-line argument.
Ligesom du ville forvente argc og argv i C, har vi stadig har dem i PHP.
Så if ($ argc! == 2) så vil jeg ikke beskæftige sig med at udskrive en besked eller noget.
Jeg vil bare afslutte, fejlkode af 1.
Jeg kunne også returnere 1.
Sjældent i PHP er du til denne tilstand, hvor vi er på -
Normalt er du i en funktion kaldt af en funktion kaldes af en funktion kaldes af en funktion.
Og hvis noget går galt, og du blot ønsker at afslutte alting helt,
exit bare afslutter programmet.
Det findes også i C.
Hvis du er i en funktion i en funktion i en funktion i en funktion
og du bare ønsker at dræbe programmet, kan du ringe exit, og det vil bare afslutte.
Men i PHP er det endnu mere sjældent, at vi er på dette topniveau.
Normalt er vi inde i en slags funktion, så vi kalder exit
så vi ikke behøver at vende tilbage op 1 ting som derefter indser at der er en fejl
så der returnerer op, hvis det erkender, at der var en fejl.
Vi ønsker ikke at beskæftige sig med det, så afslut (1);
afkast (1), i dette tilfælde ville svare.
>> Så hvad vi ønsker at åbne vi ønsker at fopen.
Argumenterne kommer til at se temmelig ens.
Vi ønsker at fopen ($ argv [1], og vi ønsker at åbne det for læsning.
Der returnerer en ressource, som vi vil kalde f..
Det ser temmelig svarende til, hvordan C gør det undtagen vi ikke behøver at sige FILE *.
I stedet siger vi bare $ f. Okay.
Faktisk, jeg tror, ​​det selv giver os et vink om PHP funktion kaldet fil. PHP-fil.
Hvad dette vil gøre, er at læse en hel fil ind i et array.
Du behøver ikke engang behøver at fopen det. Det kommer til at gøre det for dig.
Så $ lines = file ($ argv [1]);
Nu er alle de linjer i filen er i linjer. Nu ønsker vi at sortere linierne.
Hvordan kan vi sortere de linjer?
Vi sorterer linjerne.
Og nu kan vi udskrive dem eller hvad.
Sandsynligvis den nemmeste måde er foreach ($ linjer som $ line) echo $ linje;
[Studerende] Vil vi ikke engang krydse linjer ved at referere noget i sort?
Det er her slags ville blive defineret som funktion sort (& $ array).
Når du kalder den funktion, du ikke kan passere det som reference.
Det er den funktion, der definerer det som at tage det som reference.
Det er faktisk præcis, hvad der gik galt
når vi sætter alt til vores servere, når vi gik fra 5,3 til 5,4.
Indtil 5,4, var dette helt rimeligt.
En funktion forventer ikke at tage det som reference, men du kan passere det som reference
så hvis funktionen sker at ændre det, er det stadig modificeret.
Som på 5,4, du er ikke meningen at gøre dette.
Så nu er den eneste måde, du passerer ved henvisning er, hvis funktionen udtrykkeligt gør det.
Hvis du ikke ønsker, at ændre det, så er du nødt til at gøre $ kopi = $ linjer og pass kopi.
Så nu linjer vil blive bevaret og kopi vil blive ændret.
php.unique.php. Jeg kunne have rodet noget op.
Uventet 'sort'.
Der kommer til at være noget, der gør dette for os.
Det er ikke engang dér.
Bemærk, når du læser manualen, at det første argument forventes at være et array
og det har taget som reference.
Hvorfor er dette klager til mig? Fordi jeg har denne funktion slags stadig her, at jeg ikke ønsker.
Okay, php.unique.php. Jeg har ikke videregive det et argument, fordi jeg ikke har en fil.
Det er php.unique.php på test.php.
Her er test.php alle printes ud i en nice sorteret orden.
Bemærk, at sorteret orden er lidt underligt for en kode-fil
fordi alle vores tomme linjer vil komme først
derefter vil komme alle vores 1 niveau fordybninger
derefter kommer alle vores ingen fordybninger.
Yeah. >> [Studerende] Så for kildekoden ikke blev vedtaget som reference?
Er der generelt forbi værdi?
[Bowden] Når du kalder en funktion, er det aldrig afgør, om det blev vedtaget som reference.
Det er den funktion definition, der bestemmer, om det blev vedtaget som reference.
Og hvis man ser på den funktion definition af sort eller bare kigge på dette,
det tager argumentet som reference.
Så uanset om du vil have det til at tage det som reference, det tager det som reference.
Det ændrer opstillingen på plads.
Det er bare ikke tilladt. Du har ikke tilladelse til at gøre dette. >> [Studerende] Åh, okay.
[Bowden] Dette er slags kommer til at tage linjer ved henvisning og ændre den.
Og igen, hvis du ikke vil have det til at gøre det, kan du lave en kopi af slags.
Selv i dette tilfælde, er kopien faktisk ikke en kopi af linjer.
Det bare henvist til den samme ting, indtil det først bliver ændret,
hvor det første kommer til at få ændret i den slags funktion,
hvor, fordi det er copy-on-write, nu en kopi af kopi vil finde sted.
Du kan også gøre dette. Det er det andet sted du kan se tegnet.
Du ser det i foreach loops, kan du se det i funktion erklæringer,
og du kan se det, når bare tildele variabler.
Nu vi har udrettet noget ved at gøre dette
fordi kopi og linjer er bogstaveligt talt det samme.
Man kan bruge linjer og kopiere flæng.
Du kan gøre frakoblet ($ kopi), og som ikke forsatte linier,
du bare miste din reference til det samme.
Så som i dette punkt, nu linjer er den eneste måde du kan få adgang linjer.
>> Spørgsmål?
Yeah.
[Studerende] Helt off topic, men du behøver ikke at lukke PHP med - >> Du gør ikke.
Okay.
[Bowden] Jeg vil gå så langt som til at sige, at det er dårlig praksis at lukke dem.
Det er nok en overdrivelse, især i et script,
men lad os se hvad der sker, hvis jeg gør dette.
Det gjorde intet. Hvad hvis jeg ønskede - [suk]
Jeg er nødt til at passere et argument.
Optag. Jeg kaldte det forkert.
Så php.unique.php med et argument.
Nu ved jeg ikke engang brug for dette.
Jeg vil videregive det et gyldigt argument.
Dette trykt hvad det er udskrivning.
Jeg udskriver kopi og kopi findes ikke. Så linjer.
Det trykte alt, og derefter mærke alt dette junk ned her,
fordi i PHP noget, der er uden for PHP tags
bare skal udskrives bogstaveligt.
Det er derfor, HTML, det er så rart, at jeg kan gøre div blah, blah, blah klasse eller hvad ved jeg,
blah, blah, blah, og derefter gøre nogle PHP-kode og derefter gøre ende div.
Og nu udskriver dette får jeg min nice div op øverst, alt det PHP trykte, div nederst.
Disastrous når sådan noget sker, som er temmelig almindelig,
blot en vildfaren linjeskift i bunden af ​​filen.
Man skulle ikke tro, det ville være så stor en deal
indtil du tænker på, at med browsere -
>> Hvordan omdirigerer arbejde eller dybest set noget headers arbejde,
når du laver din forbindelse til en hjemmeside og sender det tilbage alle disse overskrifter og ting
lignende reaktion 200 eller respons omdirigere eller hvad,
overskrifter er kun gyldige indtil den første byte af data bliver sendt.
Kan omdirigere tusindvis af gange, men så snart den første byte af data sendes
du er ikke meningen at omdirigere igen.
>> Hvis du har en vildfaren linjeskift i bunden af ​​en fil
og lad os sige, at du bruger denne funktion og derefter du vil -
Lad os sige, det er en anden fil, der er index.php og du require_once noget -
Jeg kan ikke tænke på et godt eksempel på det.
Spørgsmålet sker, når denne linje i bunden bliver gentaget.
Du ønsker ikke noget at være blevet gentaget endnu.
Selvom du ikke har til hensigt på noget at blive gentaget, noget bliver gentaget
og så nu er du ikke meningen at sende flere headers
og du kommer til at få klager.
Du skal bare ikke brug for disse afsluttende tags.
Hvis du har planer om at gøre noget med HTML -
og det er helt rimeligt at gøre hernede div uanset
og derefter ved dette punkt kan du eller du kan ikke inkludere dem.
Det er faktisk ligegyldigt.
Men i PHP-scripts det er sjældent at lukke den.
Når alt er PHP, absolut alt,
du ikke virkelig nødt til at lukke det / du bør ikke lukke den.
>> Beskæftiger sig med strygere er meget pænere end i C.
I PHP kan du angive en streng med enkelt eller dobbelt citationstegn.
Med apostroffer du kan ikke bruge "Escape"-sekvenser.
Konstant flygte, blah, blah, blah.
Så printf er meget sjælden i PHP.
Jeg tror jeg ville bruge printf, hvis jeg ønskede at gøre en slags ting - i Pset 5 du brugt sprintf eller whatever.
Men du ønsker at gøre 001.jpg og 002.jpg.
Så for den slags ting, hvor jeg rent faktisk ønsker at formatere den tekst, jeg ville bruge printf.
Men ellers ville jeg bare bruge strengsammensætning.
Jeg har aldrig rigtig bruge printf.
Vi er bare differentiere detaljerne mellem enkelte anførselstegn og dobbelte anførselstegn.
Den største forskel er, at enkelte anførselstegn, vil det blive udskrevet bogstaveligt.
Der er ingen tegndatatype i PHP, i modsætning til C, så det svarer til det.
De er begge strenge.
Og det gode ved ét tilbud strings er jeg kunne sige "hej verden!" blah, blah, blah,
$ $ Wooo.
Hvad sker der, når jeg udskriver det er det vil udskrive det bogstaveligt.
Lad os slippe af med alle vores stuff.
Så echo $ str1;
Det bogstaveligt udskrevet alle disse ting: dollartegn,
backslash n, som man skulle tro ville være linjeskift -
alle disse ting det udskrives bogstaveligt.
Det eneste du behøver at flygte, er enkelte anførselstegn
fordi det ellers ville synes det er at lukke enkelte anførselstegn.
Anførselstegn, helt anderledes.
Vi har allerede se syntaksfremhævning er cluing os til, hvad der er ved at gå grueligt galt.
php.unique. Undefined variable: wooo fordi det tolkes som en variabel kaldet wooo.
Anførselstegn kan du indsætte variabler i -
Lad os sige $ name = "Rob";
Så echo "Hej, mit navn er $ navn!"
Det anerkender dette som en variabel.
Når jeg kører det - og jeg vil indsætte en ny linje - Hej, mit navn er Rob! og goddag verden!
Det er fordi jeg aldrig fjernet trykning af wooo ovenfor.
Der er 1 skridt du kan gøre.
$ Array = [1, 2, 3];
Hvad hvis jeg ønsker at udskrive den første indeks for array?
Du gør $ array [0].
De syntaksfremhævning er et fingerpeg. Hvad er dette vil gøre?
php.unique.
Hej, mit navn er 1! der er ikke, hvad jeg ønskede.
Syntaksfremhævning løj for mig.
Lad os prøve 'a' -> 1, 'b' -> 2.
Det er, hvordan jeg ville have til at skrive det.
Uventet ét tilbud (T_ENCAPSED blah, blah, blah, blah, blah).
Ideen er, at det ikke er at anerkende dette som en del af array'et.
Det er ikke anerkender dette som en tabel indekseres ved brev en.
Du ønsker at gøre det omgivet af krøllede parenteser,
og nu, hvad der er i denne klammeparentes vil blive interpoleret,
hvilket er det ord, vi bruger til magisk indsætte disse variabler ind de rigtige steder.
Nu gør dette, php.unique, og Hej, mit navn er 1! som forventet
eller Hej, mit navn er Rob!
En ting, der er lidt rart, om enkelte citater er, at -
Der er nogle omkostninger at interpolere.
Hvis du bruger anførselstegn, tolken har til at gå over denne streng,
at sikre, at, "Åh, her er en variabel. Nu har jeg brug for at gå få denne variabel og indsætte det her."
Selv hvis du ikke bruger nogen variabler,
intet indersiden af ​​disse dobbelte anførselstegn skal interpoleres,
men det vil stadig være langsommere, fordi det skal gå over de dobbelte anførselstegn
leder efter ting, der skal interpoleres.
Så enkelt anførselstegn kan være en smule hurtigere, hvis intet skal interpoleres,
og jeg har en tendens til selv bruge enkelte anførselstegn for, "Hej, mit navn er '. $ Array ['a'] alligevel.
Det kommer til at svare til, hvad vi havde før.
Men det er et spørgsmål om præference.
Hvis du bruger PHP, har du sandsynligvis ligeglad den hastighed forskel.
Der er ikke nok til at ræsonnere dem ud til at begynde med.
>> Eventuelle sidste spørgsmål?
>> Vi faktisk ikke engang komme igennem det hele, men denne ting var kedeligt.
Den sidste ting, der er lidt rart i PHP er, når du beskæftiger sig med HTML,
du vil bruge det en smule, så den pæne genvej syntaksen for udskrivning af en variabel.
Uden at sætte PHP her, kaldes det korte tags.
Officielt fra PHP 5,4, er dette frarådes.
Du anbefales at sætte php.
Dette understøttes stadig, så korte tags med <? = Er stadig helt fint.
Det er ved understøttet standard, så du kan bruge disse som du ønsker, og de er temmelig praktisk.
>> Eventuelle spørgsmål?
Ok.
>> Ophold klassiske, San Diego.
[Griner]
Bye. [Griner]
[Bifald] [griner]
>> [CS50.TV]