[Powered by Google Translate] [§ 8] [mindre komfortable] [Nate Hardison] [Harvard University] [Dette er CS50.] [CS50.TV] Velkommen til vår nest siste avsnitt. I denne uken skal vi snakke om PHP, og så neste uke vi vil gjøre en liten gjennomgang for Quiz 1. Vi kommer til å starte på side 3 av problemet setter pack, og vi vil arbeide gjennom den delen av spørsmålene ganske raskt. På side 3, begynner vi å snakke om denne forskjellen mellom C og PHP i den forstand at PHP er et dynamisk skrevet språk, mens C er statisk skrevet, og har noen veldig raskt gjort noen koding i noe som PHP eller Python eller Ruby før, JavaScript? Helt nytt? Okay. Alle disse språkene som jeg nettopp nevnte er svært forskjellig fra språk som C og C + + og Java i den forstand at når du deklarerer en variabel du ikke nødt til å erklære hva slags variabel det er, så i C vi ble sittende fast å måtte alltid si dette kommer til å bli en int variabel, eller dette kommer til å bli en char * variabel, mens med PHP, med Python, med Ruby, med mange av disse mer moderne språk du ikke trenger å gjøre det i det hele tatt. Du bare deklarerer variabelen, og i tilfelle av PHP du erklærer at det er en variabel med prefikset med en $ tegn, og deretter type variabelen er bestemt av hvilken verdi det er å holde, som er litt kult. Å leke seg med dette litt, har vi prøve PHP-kode her mellom start og slutt tagger. Vi bruker denne typen som HTML i den forstand at vi har disse vinkelparentesene her for å åpne og lukke. Du vil se dette med HTML. Du vil se den samme typen syntaks med XML også. Dette indikerer starten på en PHP-blokk. Dette? Php er spesifikk for PHP. Vi stenger alt med en> også. La oss åpne opp en fil i apparatet vi bruker hva du vil. I denne pakken står det å ringe dynamic.php. I sannhet, kan du kalle det hva du vil, men filnavnet vil komme opp og være viktig senere, så bare husk hva du kaller det. Jeg kommer til å bytte over til apparatet, og jeg kommer til å gjøre en katalog for § 9 Jeg tror vi på nå. Og vi vil gå inn i § 9, og jeg kommer til å bruke gedit. La oss se, gedit, og jeg kommer til å ringe meg dynamic.php. Boom. Innen dynamic.php, siden dette er en PHP-fil og jeg ønsker å kjøre dette gjennom PHP tolk Jeg trenger å starte alt av med de åpne koder, så jeg kommer til å starte de med en gang, gi meg selv en liten plass i mellom kodene, og da poenget med denne øvelsen var å spille rundt med denne funksjonen kalles getType, så getType, denne funksjonen her. Legg merke til at det har understrek ingen eller mellomrom eller bindestrek eller noe sånt skille 2 ord, få og skrive, bare ett ord helt. Men hva dette vil gjøre er hvis jeg passerer i en variabel til getType, si $ VAR eller $ x, Dette vil fortelle meg slags i en debugging format hva navnet på denne typen er. Vi kommer til å eksperimentere her. Spesielt hvis du ser tilbake på pset spec Vi har et par forskjellige linjer med kode her. I den første linjen i koden initialisere vi denne variabelen, $ var, å være lik 7, og så har vi denne printf linjen som sier hei, er printf Var blank. Printf er en av mange måter vi kan skrive ut ting i PHP. Ofte vil du se ekko funksjonen brukes i stedet for printf, men printf vi er alle kjent med å ha blitt koding i C for en stund. Hva du faktisk kan gjøre er å la oss se om kopier og lim fungerer. Jeg kommer til å gi dette en sjanse. Vi vil gå tilbake over til apparatet. Ok, og der vi går. Og avstanden er litt funky, men her vi går. Vi har fått denne koden her. [Student] Er det ikke god stil til fane det? Beklager? [Student] Er det vanlig å fane det? Høyre, så Sam spør om det er konvensjonen til fane det eller ikke. Vanligvis ja. I dette tilfellet har jeg valgt å la være. Ærlig, vil du se forskjellige ting for forskjellige programmerere. PHP er vanligvis brukes ofte i kombinasjon med HTML og andre språk, og så noen ganger utskriften vil se litt funky Hvis du innrykk innen PHP start og slutt tagger. Det avhenger egentlig. I dette tilfellet kopier og lim ikke lime inn kategoriene i for meg, men det definitivt ikke, som du sa, gjør det klarere. Greit, hvis du lagrer denne koden i dynamic.php så hva du kan gjøre er å komme ned til din terminal vindu der jeg er akkurat her nede i gedit, og å gjøre tilsvarende kompilere bruke sminke og deretter kjører koden i C alt du trenger å gjøre med PHP-filen er å starte opp PHP tolk, som er et lite program som heter PHP, og argumentet du gir tolken er filen du ønsker å tolke. I dette tilfellet, dynamic.php. Whoops, hvor fikk jeg plassere den? Oh, la jeg det i § 9, og her er jeg. Det er derfor. Nå hvis jeg kjører det igjen Vi ser at i mitt første getType funksjon samtale Var er et heltall. I den neste Var er en streng, og deretter i den tredje Var er en boolsk. Hva er interessant om dette er hvis vi rulle opp ser vi at disse er typer som ligner på de som vi hadde i C. Vi hadde ints i C. Vi måtte liksom strenger i C, så strenger var ikke en helt legit type i den forstand at vår CS50 streng var virkelig hva? Beklager? Missy? [Missy] Char *. Ja, det var dette char * vi brukte. Helt i begynnelsen av semesteret brukte vi strengen type, men det var virkelig en char * under panseret. Vi bare skriver definert det, mens i PHP disse strengene er en faktisk type. Det er ikke mer av dette char * type ting. Du vil se at vi kan gjøre mange flere ting med strenger mye lettere i PHP enn vi kunne i C, og så til slutt har vi dette boolean type, og den store forskjellen her er at hvis vi blar ned ser vi at navnet på disse typene er nå heltall, streng, og boolean istedenfor int og bool, og som du plukker opp forskjellige programmeringsspråk, forutsatt at på et tidspunkt i livet vil du komme i kontakt med ulike de du vil legge merke til små quirks som dette der C kaller heltall ints. Noen kaller det heltall. Det er andre ord som du vil kjøre inn. Big int vi så i dag i SQL. Det er også tall og deretter bool, boolean, alle slags forskjeller der. Dette er ikke veldig interessant, men nå skal jeg gi dere en liten bit av tid- hvis vi zoome ut igjen for å arbeide gjennom denne øvelsen nederst på side 3 der den ber hvilke typer svarer til disse verdiene her nederst. Vi har 3,50. Vi har denne tingen her, noe som er interessant. Vi har ikke sett det før, men hvis du har fulgt med i forelesning du sannsynligvis allerede vet hva det er. Så har vi dette, som dette er slags funky. Du kjenner igjen dette. Hva er dette i C? Sam? Hva ville dette gi deg i C? Det ville åpne en fil som heter dynamic.php og gjøre den lesbar. Ja, og hva ville være den type variabel som vi ville tildele dette til? >> File stjerne. Nøyaktig, ville vi tildele denne til en fil stjerne. Dette er legitim PHP også. Kjør det. Se hva som skjer når du passerer det i getType. Og deretter også sjekke ut hva null er, hva som kan være i PHP. Jeg skal gi deg et par minutter. Du kan bokstavelig talt kopiere og lime inn disse verdiene i, og så får vi gjøre litt tilfeldig samtale på deg og se hva du har. [Student] Jeg har et spørsmål. << Ja. I en av forelesningene David sa at det er noe du kan sette på toppen av filen slik at du ikke trenger å skrive i PHP hver gang. Hva var det? Han var sannsynligvis snakker om pund bang, hash smell. Det er et direktiv om at hvis du merker en fil som kjørbar så hva den gjør er når du kjøre filen det vil si skallet program bruke PHP tolken til å tolke innholdet i filen. Spørsmålet blir hva var dette spesiell linje at vi kunne inkludere øverst av våre PHP-filer til ikke å inkludere Dette PHP linje eller denne PHP-kommandoen når vi ønsker å kjøre filen? Og du kan faktisk gjøre dette med en haug med forskjellige filer. Jeg tror det avhenger av hvor PHP binære er lagret, men ofte usr / bin / php er et bra sted å starte. Du kan finne ut av dette akkurat ved å gå ned igjen til apparatet og skrive ut hvilke php. Den hvilken kommando tallene ut når du utfører binære eller en kommando der tilsvarende filen er. Dette forteller meg at PHP er virkelig aliasing dette binærfil som er lagret i usr / bin, som er der mye av systembinærfiler er installert. For eksempel, hvis jeg blar opp til toppen, nå som jeg har satt dette #! linje her Jeg kan bla nedover, og jeg kan prøve å kjøre dynamic.php, men jeg får denne feilen om tillatelse nektes, og hva det betyr er at denne filen ikke er for tiden å gi kjørbare tillatelser. Det er ikke merket som en fil som noen kan kjøre. Når du kjørte foreta eller Clang og du fikk en kjørbar fra det kompilatoren var smart nok til å vite at hei, jeg bygger en kjørbar. Du sannsynligvis vil utføre det, så det ville automatisk konfigurere tillatelsene for deg. Dette er ikke tilfelle, men når du oppretter en normal fil fra bunnen av, grunnen blir vanligvis du ikke ønsker å ha noen fil på systemet ditt være kjørbare, slik at du faktisk nødt til å gå inn og manuelt gjøre det. Den enkleste måten å gjøre det på er med chmod kommandoen, og chmod + x sier legge den kjørbare bit fordi det er skrivebeskyttet bit, skrive litt og kjørbare bit, R, W og X, og si chmod + x vil slå på den kjørbare bit for deretter filen som vi angir, som i dette tilfellet vil være dynamic.php. [Student] Er det slått på for alle? La oss sjekke ut dette, så hvordan skulle jeg sjekke for å se tillatelsene? Vet du hvordan jeg ville sjekke for å se rettighetene til en fil? [Uhørlig student respons] Beklager? >> [Student] XSD. XSD gir oss filen i hacks. Liste over alle filene,-l, vil vise meg alle filene i katalogen min slags i sine lange, ordrik notering, og så her ser vi at Dette dynamic.php fil ble sist endret 5 november kl 16:21. Eieren av denne filen er jharvard. Det er brukeren som er logget inn Det er brukeren jeg jobber som, og hvis du er også i apparatet du også jobbe som bruker jharvard. Du er i studenter gruppen, og dette er ting som du ser ofte nok. Vi kan gå inn i mange detaljer her, men for det meste hva du ønsker å se på når du ønsker å se hvorvidt en fil er kjørbar er først og fremst brukeren som eier filen, eieren, så dette jharvard, og da har vi tillatelsene biter over her til venstre, og måten å lese dette er at den siste bit vanligvis brukes for merking hvorvidt-i det minste i dette tilfelle denne siste bit vil ofte være satt til ad for å indikere at filen er en katalog og ikke bare en vanlig fil. Deretter følgende tre biter rett her bestemme tillatelsene som eieren av filen har, så i dette tilfellet jharvard, som eier av filen, kan lese og skrive denne filen, men det er en dash sier at jharvard ikke kan kjøre denne filen. De neste tre biter er for gruppen, så dette er studentene i gruppen så hvis det var flere brukere på maskinen min, og vi hadde flere brukere som en del av studentene gruppen, så de kan alle lese denne filen, men de kan ikke skrive det, og likeledes noen andre, verden kan bare lese denne filen også. Det er en god, lang writeup om dette, slik at du kan lese på nettet. I oppgavesettet spec går vi inn i dette i mer detalj. [Student] Er 218 henviser til verden? Den 218 er-på toppen av hodet mitt jeg glemmer, men nei. La oss se. Jeg blanking på det akkurat nå. Tilbake til hva vi var i ferd med å gjøre med dette chmod + x der vi ønsket å gi dynamic.php kjørbare tillatelser, og spørsmålet var hvorvidt dette ville gi kjørbare tillatelser til alle eller bare jharvard, og vi kan se dette ved å kjører kommandoene og skrive ls-l, og nå ser vi at det er merket som kjørbar. Du se at det var en fargeendring. Nå dynamic.php er oppført i grønt, og det ser ut som svaret på spørsmålet er hva, Charlotte? [Charlotte] Bare jharvard. >> Bare jharvard, ja. Hvis vi ønsket å slå den kjørbare litt på for alle hvordan kan vi gjøre det? Noen tanker? >> A + x? Ja, akkurat. Charlotte sa vi kan gjøre chmod av en + x av dynamic.php, og nå hvis vi kjører ls-l ser vi at de kjørbare biter er faktisk slått på for alle. Og du kan faktisk gjøre det motsatte av dette, slik at du kan slå den av for alle bruker minus. Nå er det slått av, og nå kan vi slå den på igjen for jharvard slik at vi faktisk kan kjøre den nå, og nå kan du se når vi kjører koden denne spesielle #! linje på toppen, #! linje, fortalte skallet, fortalte vår terminal hei, når denne filen kjøres, bruke / usr / bin / php å tolke denne filen og deretter skrive ut resultatet. [Uhørlig student spørsmål] Jada, la meg rulle opp. Akkurat som denne. Du vil se alle disse direktivene starte med dette pund og deretter utropstegn, noen ganger kalt en shebang, hash smell. [Student] Hvordan kan vi kjøre den med php dynamic.php før vi gjør det kjørbar? Spørsmålet var hvordan kan vi kjøre dette ved hjelp av PHP binære mens dynamic.php er ikke kjørbar? Dette er super viktig fordi dette er nøyaktig hvordan det kommer til å fungere når du skriver oppgavesettet 7. Mesteparten av tiden PHP-filer er ikke direkte kjørbar. Den måten som fungerer er fordi det er den PHP binære som er kjørbar. Tolken er ting som blir henrettet, og så hva det gjør er bokstavelig talt slurping i hele innholdet av vår dynamic.php fil og går linje for linje og gjennomføring disse kommandoene, så det er ved hjelp av vår PHP-fil som en liste med instruksjoner. Det er ikke direkte utfører det. Det er der vi sier at disse filene er tolket under kjøring. Det er en løpe tid språk i stedet for noe som er bestemt ved kompilering, ikke et kompilert språk som C. Er det en måte å få en kjøretid språk til å handle som om det er en kompilering språk, som om du har alle kjører gjort på serveren snarere enn du vet hva jeg mener? Ja, så spørsmålet er er det en måte å få kjøre tid språk for å opptre mer som kompilering typer språk? Og det er, jeg mener, det er et aktivt område av forskning for mange av disse selskapene. Jeg tror Facebook har gjort mye arbeid med PHP og sammenstille det ned, noe som gjør det raskere, optimalisere det siden deres nettsted er bygget på PHP. Hvis du har fulgt node.js det hele tatt, som er en slags JavaScript tolk å kunne kjøre JavaScript utenfor nettleseren, utenfor nettleseren, fordi tradisjonelt JavaScript ville bare kjøre inne i Firefox eller Chrome, og det vil bli brukt til å lage kule animasjoner skje på en webside og gjøre din nettside dynamisk. Som er blitt bygget på en mye arbeid som Google har gjort å lage JavaScript og C + + binde sammen, så det er mye aktiv forskning for å få disse språkene til å arbeide og optimalisere dem, først og fremst fordi så mange mennesker kan kode i PHP og JavaScript fordi det er mye enklere. Det er mye hyggeligere. Du har ikke pekere. Du har ikke typer flyter rundt. De ønsket å få fordelene av disse kompilering språk med alle typesjekking og hastigheten og nedre minnebruk og alle som samtidig opprettholde fleksibilitet og brukervennlighet av disse nyere. Tilbake til vår opprinnelige plan for angrep. Vi har noen av disse spørsmålene her i vårt problem set spec. La oss gå gjennom dem veldig raskt, og vi vil gå rundt i rommet. Charlotte, er hva slags 3,50? [Charlotte] Det er en dobbel. >> Det er en dobbel. Jimmy, hva er dette neste? >> En rekke. En matrise, fantastisk, og Jared, hva er fopen? [Jared] Det er en ressurs. >> Det er en ressurs. Det er litt av en ny en, ikke en fil stjerne, ikke en fil. Det er en ressurs er den type i PHP, og jeg beklager, Ella, er den siste null hva? Null. Null, hvordan er det staves i PHP? >> Den samme måte. På samme måte, hovedsteder? >> Ja. Ja, greit. Here we go, vi har en dobbel, har vi en matrise, vi har en ressurs, og så har vi null. La oss se nå har du sett- la oss se, så nå er jeg gjette hva jeg ønsker også å gjøre er å trekke opp denne nettsiden her, dette php.net / manual, så hvis dere kopierer det og åpne opp en nettleser. Jeg kommer til å trekke opp Chrome, sette det i. Jeg ønsker å vise deg dette ikke bare fordi vi kan snakke hele dagen om typer og alt det morsomme ting men heller fordi dette er PHP manualen, og det er mange PHP programmerere der ute. Det finnes en rekke PHP-nettsider der ute, og som et resultat, er det en masse dokumentasjon på PHP, og den manuelle, dette php.net, er et veldig bra sted å gå når du har spørsmål om hva som er den beste måten å gjøre X i PHP eller hvordan ser en funksjon ut? Bare slags bli kjent med hvordan dette ser ut, fordi du vil komme hit ofte, satt litt for problem 7. Hvis du ender opp med å gjøre et avsluttende prosjekt som bruker PHP Dette vil være et sted du vil bli svært godt kjent med. Ofte måten å gjøre dette er at de bruker Google til å søke etter nettstedet, og de ikke bruke søkeboksen som er her oppe i øvre høyre, som er slags liten. Hvis du Googling rundt etter noe å gjøre med PHP og du ser en av de manuelle koblinger dukker opp kan du vanligvis stole på at som en ganske god ressurs. Awesome, så ut av disse typene, bare ut av nysgjerrighet, hvilke har vi ikke sett? Noe vi ikke har sett her? [Student] Resource. >> Vi så ressurs med fopen samtalen. [Student] Objekter. >> Objekter vi ikke har sett for sikker. Tilbakeanrop vi ikke har sett. Det er noen av disse pseudo-typer. Vi definitivt bare så heltall og dobbel. Vi fikk ikke se noen av de andre, så hvis vi klikker på heltall vi kan se er det noen andre heltall som de har her? De er alle-så heltall, heltall, heltall. Noen språk har større heltall typer, som vi så på MySQL dag var det int og deretter stor int. Cool. Så, PHP manualen. La oss gå tilbake til vårt problem sett spec, og vi vil nå bla ned til side 4. En av de tingene som skjer når du får disse språkene som ikke har denne statisk skrive, så disse språkene hvor du må erklære typen en variabel opp foran er at du får tilfeller der du kan begynne å ha variabler av ulike typer samspill med hverandre, og PHP gjør denne tingen der den prøver å gjøre hva den anser å være den mest fornuftige tingen å gjøre når du har samhandle to forskjellige typer med hverandre. For eksempel, hvis vi ser på disse linjene med kode her ser du at vi har fått det som skjer når Vi prøver å legge til strengen 1 til heltall 2. Hva skjer hvis vi prøver å legge en streng som ikke er en numerisk verdi men heller faktiske tegn, CS til nummeret 50? Så får vi se er det noe annet som skjer der stedet for å legge en streng til et tall vi legger et nummer til en streng, og så videre og så videre til et punkt der vi får en slags rare ting her hvor vi har 7 + sant. Hva pokker betyr det? Hvis dere går videre og lime litt av denne koden apparatet. Du kan holde den i dynamic.php. Vi får se hva som skjer. [Student] Bare bruke print, ikke printf? Ja, så vil du finne at utskriften er også en gyldig funksjon for utskrift i PHP. Det er mange forskjellige måter å gjøre det. Vi får se med et par av eksemplene senere når vi begynner å snakke om den unike problemet som vi kommer til å skrive og deretter konsentrasjoner problem som vi kommer til å skrive at selv om vi har fopen og fclose det er ofte ikke den enkleste måten å lese i innholdet i en fil. PHP har mange av disse C-lignende restene. [Student] Når jeg satt i alle 6 av de tingene jeg bare får ett nummer som en utgang. [Nate H.] Når du putter i alle 6 av disse tingene. La oss se er det fordi det er muligens- en ting er at disse trykte anrop ikke blir avsluttet på slutten med nye linjer. Det er ingen ny linje skille hver av disse trykte samtaler, så kanskje du får en stort antall, og det er egentlig bare amalgam av nye linje tegn. [Student] Ok, hvordan kan jeg være sikker på- Vel, det er en haug med forskjellige måter. Du kan manuelt sette i en utskrift av en ny linje karakter, et ekko av en ny linje karakter, ut av ny linje. [Student] Så ekko er det samme som printf? Printf er som C printf hvor du skriver en formatert streng. Du leverer det formatet strengen og deretter alle plassholderdata variabler. Det er ofte noe som ikke brukes, la oss se, som en ansvarsfraskrivelse, Jeg er mindre kjent med PHP enn jeg er med andre web språk, og når jeg har programmert i PHP jeg vanligvis ikke bruker printf fordi jeg synes det er raskere å bruke streng interpolering evner som den har, som vi vil gå inn i, og jeg vil vise deg i løpet av et sekund, mens i C slags vi har å gjøre dette hacky ting å få det til å skrive ut riktig. Du kan faktisk sette variabler direkte inn strenger i PHP. Printf er slags altfor lang for hva jeg vanligvis gjør. Ja, Ella. [Ella] Vanligvis hvis du får parse error betyr det at- som på C det ikke fortelle deg nøyaktig hvor feilen er, og hva det er, så betyr det at utseende gjennom hele koden og finne ut av det? Det er vanligvis mer målrettet enn det. Jeg tror i så fall var det litt av, så jeg tror i så fall vi manglet et semikolon. Det prøvde å gjøre følelse av alt, så liker disse tolket språk, er tolken skal prøve og gjøre sitt beste for å gjøre alt arbeidet på riktig måte. Du vil se, for eksempel i JavaScript Du vil ofte Online uttalelser ender med et semikolon akkurat som de gjør i PHP, akkurat som de gjør i C. I JavaScript noen av JavaScript tolker i mange av nettleserne vil sette i semikolon for deg Hvis du tilfeldigvis til å mangle dem. De vil prøve å få plass til noen sloppiness på din del. Det er der det kanskje prøver og prøver og prøver å gjøre ting fungerer, og så til slutt vil det komme til et punkt der det står greit, Jeg kan ikke gjøre ting fungerer på bailing, og det er der du får en linje nummer som kan virke litt off fra det eksakte stedet. Ok, så la oss gå gjennom dette veldig raskt. Vi slapp med Ella, så la oss gå over til Missy, og Missy, hva print av strengen 1 pluss nummer 2 gir deg? [Missy] 3. >> 3. Gjør det fornuftig? Liksom? Betyr det gir deg et nummer? Gir det deg en streng? [Missy] En rekke. >> Det er et tall. Men det er skrive den ut, så det kommer til å gi deg noen form for streng. En ting vi kan gjøre for å sjekke dette ut er hvis vi gjør $ var = 1 + 2 og så sier vi ekko av getType, så vi bruker en tredje form av utskrift her. Nå kan vi se hva som skjer her. Her er hva vi har er at vi fikk et heltall ut av dette. Selv om vi var å legge denne strengen til et tall, Vi fikk ikke en streng ut av det, akkurat som Missy sa. Vi får et heltall. Ok, så la oss se, neste opp, Kevin. CS + 50? >> [Kevin] 50. [Nate H.] 50. Gjør det fornuftig? [Kevin] Yeah. [Nate H.] Hvorfor? Hvorfor gjør det fornuftig for deg? [Kevin] Fordi det er bare å ha strengen, har tallverdi null. Ja, flott. Slags tvetydige situasjoner, men det er godt å vite hva som skjer. Stella, hva skjer neste med nummer 1 + string 2? [Stella] 3. >> 3 igjen. Og i dette tilfellet, får vi en streng eller et nummer? La oss gi dette en sjanse. Noen raskere enn meg får svar? Charlotte? Åh, jeg didn't-okay, la oss se, vi kommer til å gjøre det samme slags ting hvor vi har fått en rekke pluss en streng, og vi kommer til å ekko typen, se hva vi får. Vi får også et heltall. Det spiller ingen rolle hvilken som er streng, som en er nummeret. Vi fremdeles kommer til å få et heltall. Det er fortsatt kommer til å gjøre hva vi kan forvente. All right, så Sam, hva 90 + 9 flasker øl på veggen? [Sam] 99. >> 99. Ingen flasker øl på veggen, skjønt. Det gir oss litt mer informasjon om hva som skjer. [Sam] Hvis du hadde skrevet 9 i brev så ville du ha 90, ikke sant? [Nate H.] Yeah. Spørsmålet var om vi hadde skrevet 9 som N-I-N-E ville vi ha fått 99 eller 90? Vi ville få 90. Det er bokstavelig talt bare ute etter siffer tegn. Det er ikke smart nok til å innse antall ord, og at ting. Ja. [Student] Er det noe slikt som typecasting i PHP? Det er, og det er akkurat slik du ville gjøre det i C. Hva om 10/7, Charlotte? [Charlotte] 1,4285. [Nate H.] Yeah, så hva kan være overraskende om dette? Hva ville skje hvis du gjorde dette samme slags ting i C, hvis du gjorde 10/7 i C? [Charlotte] Det ville bare gi deg-avhengig av hvordan du typecasted Jeg antar det vil gi deg bare et begrenset antall sifre etter desimaltegnet. Ja, så et begrenset antall sifre etter desimaltegnet. Hva annet kan være-vil det gi deg noen sifre etter desimalen? Ofte ikke, så igjen, avhengig av hvordan du typecasting det det kan eller ikke kan konvertere den til et flyttall. Her var det slags hyggelig at det gjorde. Hadde vi vist deg dette tilbake når vi begynte å gjøre denne typen ting i C det sannsynligvis ville ha gjort litt mer fornuftig at det ikke går bare til en. Og så til slutt, Jamie, hva 7 + sant? [Jamie] 8. >> 8. Hva betyr det? Jeg antar det bare gir sanne verdien av en. Ja. Hva skjer hvis vi endrer det til false? [Student] 7. Ja, så husk hvor vi snakker om disse binære verdier, 1 er på, 0 blir av? Nå har vi sant er 1, er 0 false, og du kanskje ikke har sett dette i C eksempler på at vi har gjort det siste semesteret, men historisk bool type i C ikke har vært en reell type, slik at folk har brukt 0 og 1 i stedet for sant og usant. Dette er en manifestasjon av det. Ok, så en viktig del om alt dette er at vi har disse forskjellige typer. De kan kommunisere med hverandre. De kan ofte samhandle med hverandre på måter som er hyggelig, som vi har sett her. Det er hyggelig å kunne ha streng 1 og nummer 2, legge dem sammen og få 3. Det er fornuftig. Men når du skriver nettsteder, og spesielt når du behandler brukerundersøkelser, så si at du har skrevet et webskjema som samler informasjon fra brukeren, og deretter går å behandle den på baksiden slutten, på serversiden i PHP-koden Hvis du forventer at verdien som brukeren har skrevet inn og sendt i skjemaet for å være et heltall eller for å være et flyttall eller noe sånt du må eksplisitt kaste det og deretter gjøre noen type kontroll. Du ønsker ikke å bare stole på denne typen sjonglering system for å gjøre ting fungerer, spesielt for sikkerhetsmessige årsaker, og bare for robusthet av nettstedet ditt. Bare noe å huske på at når du håndterer skjemadata, noe som kommer i posten eller få superglobals sørg for at du alltid validere den og konvertere den og typecast det. Og akkurat som vi snakket om et øyeblikk siden at typecasting PHP er nøyaktig den samme som i C hvor du har parentes og deretter den typen. Holde det i tankene. En funksjon som vil komme godt med når du gjør dette er vi har brukt, og dette er typen som en side- Vi har brukt denne getType funksjonen her å finne ut hvilken type en variabel, og mens dette er nyttig for feilsøking og å se hva en variabel type er du ikke ønsker å bruke dette, for eksempel i en tilstand der du sjekke for å se om getType på $ var = heltall gjøre noe. Dette er dårlig, dårlig, dårlig. I stedet er det disse funksjonene kalles er heltall, er streng, er array som du ønsker å bruke i stedet, så i dette tilfellet hva jeg ønsker å gjøre i stedet for denne fyren her er å bruke er heltall var. Og de er ofte referert er is_ * i den forstand at du kan erstatte * med heltall, string, et cetera, og bare for å sørge for at virkelig rask Dette er int php. Ser ut som du kan gjøre er enten int eller det er heltall også? Ja, alias, så int heltall aliaser. Cool. Hvordan gjør vi det? La oss plukke opp tempoet litt. Nå skal vi snakke om matriser, slik at du kan se i neste del av spec snakker vi om hvordan arrays i PHP er litt annerledes enn de er i C. I sannhet, de er slag av en blanding av matriser som du har lært å kjenne og elske i C der alt er av samme type lagret fortløpende og contiguously i minnet, og du har disse numeriske indekser. Du har indeks 0, 1 indeksen, 2 indeks, og du lagre verdier på disse indeksene. Du kan også i C, når du skrev Speller, mange av dere gjorde hash table tilnærming, og du så at det vi hadde en annen type lagring hvor vi kartlegge en nøkkel til en verdi, så når du prøvde å lagre noe i hash table du måtte oppgi at du ønsket å lagre den med en bestemt nøkkel, og at nøkkelen bestemmes plasseringen av verdi og hvor det vil bli lagret. Du har slags fikk begge disse begrepene skjer på samme tid i en PHP array, og som et resultat, vi ofte kaller disse assosiative arrays hvor vi knytte en nøkkel i en verdi. I neste del snakker vi om en enkel PHP matrise hvor vi har nøkler a, b, og c, alle strenger, tilordning til heltallene 1, 2, og 3. Og du kan ha nøkler av forskjellige typer. Du kan ha noen nøkler som er strenger, noen nøkler som er heltall. Du kan ha verdier av forskjellige typer. Du kan ha en verdi som er en streng, en verdi som er et heltall, en verdi som er en gjenstand eller annen matrise, for eksempel alle i samme rekke objekt, som er slags merkelig. Du trenger ikke å ha en matrise som er akkurat en type element i den. Du kan ha mange forskjellige ting som skjer der inne. Den andre ting å merke seg er at når du ser noe som dette i koden, som er gyldig PHP å erklære en matrise akkurat som dette, 0, 1, 2, 3, 4, 5, som vil erklære en initialisert $ arr å være denne tabellen. Men hva du faktisk får under panseret er denne typen implisitt generasjon av nøkler hvor vi har fått 0-0, 1-1, 2-2, 3-3. Og det viser seg at selv om du har en rekke som denne fyren her oppe der du har a, b og c som nøklene og deretter begynne å bruke matrisen trykk metoden for å begynne å bruke denne tabellen som en stabel, slik at du kan se at denne matrisen objektet, er denne tabellen virkelig bli overbelastet. Vi kan bruke den som en matrise. Vi kan bruke den som en hash table. Vi kan bruke den som en stabel. Når du begynner å presse ting på denne tabellen det første du presse på dette vil være indeksen 0 og deretter indeks 1 og indeks 2. Du kan få denne typen implisitt generasjon av nøkler med mindre du angir dem eksplisitt. Måten du angir tastene eksplisitt, selvfølgelig, er ved hjelp av denne braketten notasjon, som er lik matriser unntatt i stedet for å bare tillate heltall indekser i her, nå er vi la noe. Hvis du vil at nøkkelen til å være en streng, ville du angi det som dette. Hvis du vil at det skal være en int, angir du den med int du vil bruke. Spørsmål om det så langt? En av de fine ting om denne ideen er at du kan bare trenger én verdi lagret med en bestemt nøkkel. Hvis vi går tilbake til vår appliance-la meg slette noen av disse greiene. Og la oss si at jeg initialisere en matrise for å være 0, 1, 2, gjort. Hvis jeg nå vet at for eksempel hvis jeg echo $ arr [0] Jeg kommer til å få verdien 0 skrives ut, og siden det bare kan være noen en verdi lagret for en bestemt nøkkel hvis jeg lagre noe på $ arr [0], sier en, så jeg vet når jeg echo $ arr [0] en gang Jeg kommer ikke til å få 0 skrives ut som før. Jeg bare kommer til å få en. Så dette er i utgangspunktet si at jeg ikke kan ha $ arr [0] lagring 2 forskjellige verdier. Det kan ikke lagre både 0 og strengen a, som dette bokstavelig erstatter hva var på $ arr [0] tidligere. Grunnen til at jeg tar opp dette er kjøre den, se hva som skjer. Se her at jeg fikk 0 skrives ut og deretter en ned her. Det finnes ingen ny linje der fordi jeg var lat og ikke sette det i. Hva er kult om dette er kan vi bruke dette som en måte å fange opp denne ideen om et sett hvor vi ikke kan ha flere nøkler i en matrise. Vi kan ikke ha identiske nøkler i en matrise. Jeg kan ikke ha 0 tasten og verdien 1 og 0 for og verdien en eller tast 0 og verdien sant. Tastene er all-det er bare 1 nøkkel i tabellen. Selv om du kan ha den samme verdien som er lagret flere ganger i matrisen under ulike nøkler det er ikke mulig å ha identiske nøkler flere ganger i PHP array. Hvis vi ser på dette neste problem, unique.php, der vi ønsker å åpne opp en PHP-fil inneholder en liste over strenger, en streng per linje, og vi ønsker å finne alle de unike strenger i denne filen alt vi har å gjøre er å bruke en av disse PHP arrays og bruke strenger i filen som nøklene til denne tabellen og holde oppdatere vårt utvalg som vi lagre disse nye nøkler. Som vi lese hver linje av filen vi kan lagre det i matrisen, og på slutten vil vi ha som våre nøkler i array vår alle de unike strenger i filen. Gjør det fornuftig? La oss se hvordan dette fungerer. Vi kommer til å åpne opp, ifølge spec, som kalles en ny fil unique.php. Åpne. Oops, beklager, ny fil. Vi kommer til å starte den av med samme start-og slutt-koder. Vi kommer til å lagre det i § 9, og vi kommer til å kalle det unique.php. Ok, nå zoome inn Ideen her er å åpne en fil, les i filen linje for linje. For hver linje i filen vi har en rekke der vi har  linjen som våre viktigste. Og så når vi kommer til slutten her $ Arr tastene er de unike linjer fra filen siden vi vet at hvis jeg legger linje inn i denne matrisen flere ganger vil det bare fortsette å overstyre den gamle verdien, og vi kan faktisk sette matrise linje inn som seg selv bare sånn. Dette er slags merkelig. Vi lagrer samme nøkkel verdi-paret igjen og igjen og igjen, men siden vi er garantert at det vil være bare en nøkkel kalt linje så hvis vi har en fil som sier-en fil av dyrelyder og det har vaff, vaff, meow, meow, moo, moo, og hver gang vi leser et dyr støy ut som woof og vi lagre den i matrisen vår får vi vaff, og deretter andre gang vi lagrer woof det vil overskrive første gang at vi lagret det. Til slutt vil vi bare ha én oppføring i rekken for hver av de dyr lyder i vårt dyrelyder fil. Gjør dere føle deg trygg på at du kan takle åpningen av en fil i PHP? En måte å gjøre det-la oss gå over dette raskt-én måte å gjøre det er med fopen, som vi så tidligere. Du kan fopen some_file.txt. Du kan åpne den i lesemodus, akkurat som i C. Det er en perfekt god måte å gjøre det. Du også da for å lese i filen linje for linje har de samme funksjonene, mange av dem, som du gjorde i C. Du har fgets. Du har feof, selv om vi ikke liker å bruke det fordi, husk, det var ikke stor i C. Du kan gjøre det på samme måte, men her er en veldig kul ting. Beklager, jeg ønsker ikke å gjøre $ fil, men det er en funksjon som heter fil i PHP, og denne funksjonen rett her kult fordi den leser hele innholdet av filen som du angir, så some_file.txt, leser hele innholdet i denne filen inn i en matrise og lar så iterere over det, som er ganske kjekk. Hvis vi går, for eksempel, til vår web browser og vi ser på Google for PHP-fil du kan se her at vår manuelle sier at filen leser hele filen inn i en matrise, og vi kan file_get_contents å returnere innholdet i en fil som en streng, men vanligvis bare å få det som en matrise er virkelig fint fordi hva det gjør er det bryter det opp slik at hvert element i matrisen er en linje av filen, så hvis vi ser på fil 0, er at den første linjen i filen. Fil 1, andre linje, fil 2, tredje linje, og så videre og så videre. Ville det ikke vært fint hvis det var alt du måtte gjøre i C? Ganske kjekk liten. David viste dette i foredraget, og idiom han viste var som i tillegg til vår standard for loop-in PHP hadde vi at for ($ i = 0; i <10; i + +), og du kan gjøre dette i PHP også, samme ting- vi har også denne kule konstruere kalt foreach. Foreach er veldig praktisk når iterating i matriser eller disse datastrukturer fordi det tillater deg å trekke ut hvert element i matrisen uten å måtte manuelt gjøre indekseringen selv, uten å måtte manuelt lage en indeks variabel, øke den, trekke ut verdien i matrisen på det punktet, fordi det er en veldig vanlig ting å gjøre. Du har sannsynligvis gjort det tonnevis av ganger når du gjorde C stuff løpet av semesteret, så med dette foreach vi kan sløyfe over denne filen array, og syntaksen er at vi ønsker å nå sløyfe over denne matrisen og angi at variabelen vi skal bruke til å lagre elementet av denne matrisen lokalt, lokale for omfanget av denne foreach loop, er vi kommer til å kalle det linje. Hvis det er en fil av bare ord, og det er ett ord på en linje Vi kan kalle det ordet også, egentlig bare du gi denne et navn, hva du vil kalle det, og deretter inne i loopen kan du gjøre hva du vil med denne variabelen linje. Hvis det ikke er nok til å få verdien i matrisen, og du vil også få indeksen sammen med det du kan angi et navn for indeksen samt verdien, og nå har du tilgang til 2 variabler. Du har $ i og linje der $ i er indeksen i matrisen, og linje er linjen som du hentet fra filen. For eksempel, hvis vi ønsket å skrive ut echo linje 0 av filen som dette, vi kunne gjøre det akkurat som dette, "er Line $ i av filen $ linje," og her er noe vi heller ikke har sett ennå enten der jeg har bare helt hoppet over hele denne% s% d virksomhet at vi måtte håndtere i C, og i stedet har jeg gått rett til skrive variablene i linje string min. Dette kalles variabel interpolering, string interpolasjon hvor du stuffing variablene rett i, og PHP tolk er smart nok når det er lesing gjennom en streng som begynner med anførselstegn, ikke apostrof, med enkle siterte strenger du ikke kan gjøre dette, men med doble sitert strenger slik det står gjennom den ser etter variabler. Det jakte dem ned, og hvis det ser variabler det vil ta verdien av variabelen og dytte i strengen hvis det kan konvertere den til en streng representasjon, som er ganske kjekk. For nå, la oss kommentere ut resten av alt, lagre dette, og hva vi kan gjøre nå er at vi kan åpne opp en fil som vi kan kalle some_file.txt-la oss lage en ny fil- og vi kan sette i en haug med tull ting her bare for å teste alt ut, lagre det, kaller det some_file.txt, som jeg gjør her oppe på toppen, og nå om jeg zoome ut bare for å kontrollere at alt er i samme katalog- det ser ut som jeg har unique.php og some_file.txt i samme katalog. Hvis jeg kjører php unique.php se hvordan det skrives ut hver linje i filen min og hva linjen er? Det er ganske kraftig, ikke sant? Se, det tok 3 linjer med kode for å åpne opp en fil. Vel, 4 linjer med kode. Jeg kan ikke telle i dag, klart. Men egentlig bare 2 interessante linjer med kode, fordi de andre 2 var klammeparentes, men i dette mye kode kunne vi åpne en fil, iterate gjennom det, trekke ut linjenummer og selve linjen og skrive det ut. Kule ting. Charlotte. [Charlotte] Jeg har et spørsmål om syntaks. Så foreach avtaler med hver enkelt linje av filen som du åpner, og når du ønsker å gjøre ting med hver enkelt linje du bare gjøre det som og deretter knytte verdien. [Nate H.] Hva du kan gjøre akkurat her-spørsmålet var den foreach har å gjøre med tabellen, så foreach syntaks er foreach egentlig, og merker at det ikke er plass eller noe mellom for og hver. De må gå rett ved siden av hverandre, og så tar det i en matrise, og da har du dette andre søkeord kalt som må være der, og deretter etter som du kan enten sette en variabel navn, i så fall kommer til å trekke ut verdiene i tabellen, ikke indeksene, eller hvis du gjør det som vi har skrevet under du får nøklene og verdiene. Du har foreach element i matrisen eller par av tabellen som tastet til verdi eller som bare verdi. Avhengig av hva du trenger, hvis du ikke trenger nøklene, så kan du gå med verdien. Hvis du vil tastene du kan gå med dem også. [Charlotte] Jeg har også innsett at vi aldri erklærte jeg eller linje. Hvordan det engang vet hva de er? [Nate H.] Hva mener du med fortolle? [Charlotte] Vi har aldri fortalt dem hva jeg eller linje betyr. [Nate H.] Vi har aldri fortalt datamaskinen hva jeg eller linje betyr i forhold til- [Charlotte] At de indeksert eller at they're- [Nate H.] Vi har aldri fortalt at dette er ment å være indeksen eller nøkkelen og verdien, og det er fordi det er PHP-tolken. Dette fungerer som erklæringen og sier OK, er nøkkelen til å bli en variabel kalt jeg lagret i en variabel kalt jeg. Verdien skal lagres i en variabel kalt linje, så dette fungerer som erklæringen av disse variablene og sier $ i er en nøkkel, og $ linjen er en verdi. Ja, Ella. [Ella] Hvis tastene ikke er gjort numerisk Hvordan bestemmer det hvilken rekkefølge det kommer til å skrive ut alt? Er det akkurat som den rekkefølgen det er lagt inn i? [Nate H.] La oss gi det et forsøk. La oss lage en variabel kalt arr, og vi kan gjøre en går til 7. La oss si 0 går til en annen tabell med 1, 2 eller eple. La oss si 7 går til en, går b til 2, og 3 går til 4. Dette er en slags sprø jakt eksempel fordi vi blande opp strenger og heltall over alt. Det er ingen reell for å denne tabellen. Jeg mener, vi kunne bestille alt i alfabetisk rekkefølge etter nøklene. Vi kunne bestille alt alfabetisk etter verdien. Vi kan prøve og ta hensyn til at noen er strenger, noen er ints, og vi kan prøve og konvertere dem alle til samme type og se hva som skjer, eller vi kan vurdere dem i verdien som vi allerede har angitt dem der vi legger denne fyren i første, denne fyren i andre, denne fyren i tredje, denne fyren i fjerde, et cetera. La oss se hva som skjer når vi kjører denne koden. Hvis vi blar du ned og gjøre det samme slags ting, og her er det ikke som skrives ut de nye linjene. Når den lese ting ut av filen ble inkludert de nye linjene i verdiene, som var grunnen til det skrives ut pent, mens her er det ikke, så det er derfor alt er smushed sammen. La oss legge til i den nye linjen bare for å gjøre det hyggelig. La oss kjøre det, og så her se på hva som skjedde. Det skrives alt ut i den rekkefølgen vi sette det inn i matrisen. Det bevarer orden i den forstand. Kommer tilbake til dette problemet med uniques der vi ønsker å være i stand til å iterere over en fil, og vi vil gi den some_file.txt, og vi kommer til å iterere over det som dette. Vi sa at vi ønsket å bruke en matrise for å sørge for at vi hadde fått alle de unike linjer ut av det, og vi kunne gjøre det veldig lett ved å bare lagre i en matrise som vi selvfølgelig erklære utenfor en loop, og vi sa at hvis vi brukte linjene i filen som nøklene i array vår hvis vi gikk inn i en duplikatlinje vi skulle overstyre den forrige verdien. Det er ikke alltid mulig å ha to nøkler som er identiske i samme rekke. Vi kan gjøre nettopp det. Vi vil bli kvitt denne ekko uttalelse her. Her er vi lagrer linjen i filen i matrisen vår bruker seg selv som nøkkelen. Ingenting til det, og det viser seg at vi ikke engang trenger denne nøkkelen. Vi trenger ikke at jeg variabel. På dette punktet hvis vi skulle gjøre en annen foreach loop og vi var å sløyfe over hver arr og linje nå hvis vi ekko-oops, beklager. Vi kan ikke bruke komma. Vi må bruke dette som søkeord. Hvis vi nå ekko linje vi skulle få alle de unike ordene i filen. Hvis vi går opp til some_file.txt, og la oss si at vi eple, banan, eple, eple, banan, hvis vi skriver ut alle de unike ordene i denne filen vi skal bare få eple og banan for å skrive ut. Hvis vi lagre denne, nå her vi vil zoome tilbake i, php unique.php, og ta-da. Vi har med hell uniqued filen. Den siste delen av dette problemet er som ber deg å sortere denne tabellen før du skrev det ut fordi i dette enkle eksempelet som vi nettopp har gjort Vi var heldig i den forstand at fil- vi gjorde dette contrived eksempel med epler og bananer. Det var allerede sortert. Men ved hjelp av den enkle typen funksjonen kan du sortere en array, som er ganske kjekk. Den siste tingen jeg ønsket å snakke med dere om veldig raskt er at denne typen PHP er vel og bra, og det er super praktisk å vite hvordan du skal gjøre hvis du noen gang trenger å gjøre små, raske ting programmatisk. For eksempel, hvis jeg trenger å skrive et program som for eksempel setter alle i seksjoner jeg ikke kommer til å gå og skrive det i C. Det kommer til å bli lang. Det kommer til å bli en slags smerte, spesielt hvis det er filer som er involvert, akkurat som dere har sett. Det er så hyggelig at med bare dette mye kode her vi var i stand til å rippe gjennom en fil, trekke ut alle de unike verdiene og skrive dem ut igjen. Men for dine oppgaver, for dine prosjekter, hvis du bygger nettsteder med PHP strømmen er at vi kjører våre PHP-filer gjennom denne tolk, og tolken behandler alt innen PHP-koder, forlater alt annet urørt og spytter ut resultatene. Vi kan gjøre dette for å bygge HTML programmatisk. Nå, hvis vi går tilbake til spec, det siste problemet i spec snakker om denne ideen om konsentrasjoner og skape en drop-down menyen, som du kanskje eller kanskje ikke ønsker å gjøre, avhengig av hva det endelige prosjektet gjør, som lar brukeren velge fra en liste over alle mulige konsentrasjoner deres en konsentrasjon. Nå er denne typen av en smerte å skrive dette ut og må gjøre alt dette manuelt, spesielt når du har for å sikre at at du har alle de vinkelparenteser på rett sted og alle sitater på rett sted, så med PHP kan du gjøre dette programmatisk, og du kan gjøre dette veldig raskt. La oss se hvordan du gjør dette. Vi kommer til å åpne opp en ny fil. Vi kommer til å sette i vår PHP-koder. Vi kommer til å kalle det concentrations.php, og nå når du gjør dette, slik en god ting tenke når du prøver å mikse og matche din PHP og HTML er å finne ut, ok, hva er den delen som jeg ønsker å programmatisk generere? Hva er den delen som jeg kan programmatisk generere? Det er sant at du kan gjøre alt i HTML innsiden av PHP blokker. Du kan ekko alle HTML som strenger. For eksempel, hvis jeg ønsker å begynne å gjøre de utvalgte koder innsiden av PHP Jeg kan si ekko, sier velg name = konsentrasjon, og deretter ned under kunne jeg ha en annen ekko tag eller en annen ekko kalt lukke velge. Dette er en måte å gjøre det fordi det er dette bokstavelig talt kommer til å gjøre er skrive ut denne strengen når det kjøres gjennom PHP tolk, så resultatet vil være HTML. Hvis jeg lagre denne filen som det er akkurat nå og jeg kjører php concentrations.php se på hva jeg fikk. Jeg fikk denne åpne Lukk Velg tag. Hvis jeg skulle gjøre dette, og jeg skulle redde dette resultatet til en fil, si, concentrations.html-vent, det ser ut som jeg har gått over til den andre siden- nå hvis jeg åpner opp her concentrations.html du ser at jeg har en gyldig HTML-fil. Er den slags rare? Vi bruker PHP for å lage HTML, lage gyldig HTML. Måten vi gjør det er vi bare ha PHP print HTML som vi ønsker den skal skrive ut. Dette er bokstavelig talt hvordan PHP-nettsider virker. Når du besøker en nettside som sender deg til noe sånt noe, noe, noe dot com slash index.php datamaskinen er bokstavelig talt kalle opp index.php, kjører det gjennom PHP tolk, og hva junk kommer ut det er å sende tilbake til nettleseren og si hei, nettleser, tolke dette som HTML. Det fine er at det kan være smertefullt å stadig skrive ekko, ekko, ekko, ekko og legge alt i sitater som dette, så hvis du ønsker å skrive HTML som kommer til å være statisk selv kan du gjøre det slik, sette det utenfor, lukke den, og her du bare sette inn PHP koder som du vet Vil du programmatisk generere, og i dette tilfellet er det de alternativ tags som er en smerte å generere. For eksempel kan vi generere tusen alternativ tags ved å gjøre noe som dette, $ i <1000, i + + og sier ekko alternativ value = $-whoops, jeg kan ikke gjøre det. Vel, la oss gi det en sjanse og se hva som skjer. $ I og deretter si $ i