To ganger i måneden besøker vi noen av våre leseres favorittinnlegg fra hele Nettuts historie+.
Selv etter å ha brukt PHP i mange år snubler vi på funksjoner og funksjoner som vi ikke visste om. Noen av disse kan være ganske nyttige, men underutnyttede. Med det i tankene har jeg samlet en liste over ni utrolig nyttige PHP-funksjoner og funksjoner som du bør være kjent med.
Du kan allerede vite at PHP lar deg definere funksjoner med valgfrie argumenter. Men det er også en metode for å tillate helt vilkårlig antall funksjonsargumenter.
For det første er et eksempel med bare valgfrie argumenter:
// funksjon med 2 valgfrie argumenter funksjon foo ($ arg1 = ", $ arg2 =") echo "arg1: $ arg1 \ n"; ekko "arg2: $ arg2 \ n"; foo ('hei', 'verden'); / * utskrifter: arg1: hallo arg2: world * / foo (); / * utskrifter: arg1: arg2: * /
La oss nå se hvordan vi kan bygge en funksjon som aksepterer et hvilket som helst antall argumenter. Denne gangen skal vi bruke func_get_args ():
// Ja, argumentlisten kan være tom funksjon foo () // returnerer en rekke av alle bestod argumenter $ args = func_get_args (); foreach ($ args som $ k => $ v) echo "arg". ($ k + 1). ": $ v \ n"; foo (); / * skriver ingenting * / foo ('hallo'); / * skriver arg1: hei * / foo ('hallo', 'verden', 'igjen'); / * utskrifter arg1: hallo arg2: world arg3: again * /
Mange PHP-funksjoner har lange og beskrivende navn. Det kan imidlertid være vanskelig å fortelle hva en funksjon som heter glob () gjør, med mindre du allerede er kjent med det begrepet fra andre steder.
Tenk på det som en mer kapabel versjon av scandir () -funksjonen. Det kan la deg søke etter filer ved å bruke mønstre.
// få alle php-filer $ files = glob ('*. php'); print_r ($ filer); / * utgangen ser ut som: Array ([0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php) * /
Du kan hente flere filtyper som dette:
// få alle php-filer og txtfiler $ files = glob ('*. php, txt', GLOB_BRACE); print_r ($ filer); / * utdata ser ut som: Array ([0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php [4] => log.txt [5 ] => test.txt) * /
Legg merke til at filene faktisk kan returneres med en sti, avhengig av spørringen din:
$ files = glob ('? /images/a*.jpg'); print_r ($ filer); / * utgangen ser ut som: Array ([0] =>? /images/apple.jpg [1] =>? /images/art.jpg) * /
Hvis du vil få hele banen til hver fil, kan du bare ringe realpath () -funksjonen på de returnerte verdiene:
$ files = glob ('? /images/a*.jpg'); // gjelder funksjonen til hvert arrayelement $ files = array_map ('realpath', $ files); print_r ($ filer); / * utdata ser ut som: Array ([0] => C: \ wamp \ www \ images \ apple.jpg [1] => C: \ wamp \ www \ images \ art.jpg) * /
Ved å observere minnebruken av skriptene dine, kan du kanskje optimalisere koden din bedre.
PHP har en søppelkollektor og en ganske kompleks minnesjef. Mengden minne som brukes av skriptet ditt. kan gå opp og ned under utførelsen av et skript. For å få gjeldende minnebruk, kan vi bruke funksjonen memory_get_usage (), og for å få den høyeste mengden minne som brukes når som helst, kan vi bruke funksjonen memory_get_peak_usage ().
ekko "Initial:" .memory_get_usage (). "bytes \ n"; / * utskrifter Innledende: 361400 byte * / // la oss bruke litt minne for ($ i = 0; $ i < 100000; $i++) $array []= md5($i); // let's remove half of the array for ($i = 0; $i < 100000; $i++) unset($array[$i]); echo "Final: ".memory_get_usage()." bytes \n"; /* prints Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes \n"; /* prints Peak: 13687072 bytes */
For dette skal vi utnytte funksjonen getrusage (). Husk at dette ikke er tilgjengelig på Windows-plattformer.
print_r (getrusage ()); / * utskrifter Array (ru_block) => 0 [ru_msbg] => 2 [ru_msgrcv] => 3 [ru_maxrss] => 12692 [ru_ixrss] => 764 [ru_idrss] => 3864 [ru_minflt] => 1 [ru_nvcsw] => 1 [ru_nvcsw] => 4 [ru_nvcsw] => 4 [ru_nvcsw] => 0 [ru_nvcsw] => 0 [ru_utime.tv_usec] => 0 [ru_utime.tv_sec] => ru_stime.tv_usec] => 6269 [ru_stime.tv_sec] => 0) * /
Det kan se litt kryptisk ut, med mindre du allerede har en systemadministrasjonsbakgrunn. Her er forklaringen til hver verdi (du trenger ikke å huske disse):
For å se hvor mye CPU-effekten skriptet har brukt, må vi se på "brukstid" og "systemtid" -verdiene. Sekundene og mikrosekunder delene leveres som standard. Du kan dele mikrosekunderverdien med 1 million, og legg den til sekunderverdien, for å få totalt sekunder som desimaltall.
La oss se et eksempel:
// sove i 3 sekunder (ikke opptatt) søvn (3); $ data = getrusage (); ekko "Bruker tid:". ($ data ['ru_utime.tv_sec'] + $ data ['ru_utime.tv_usec'] / 1000000); ekko "Systemtid:". ($ data ['ru_stime.tv_sec'] + $ data ['ru_stime.tv_usec'] / 1000000); / * utskrifter Brukertid: 0.011552 Systemtid: 0 * /
Selv om skriptet tok omtrent 3 sekunder å kjøre, var CPU-bruken svært veldig lav. Fordi i søvnoperasjonen, bruker ikke skriptet faktisk CPU-ressurser. Det er mange andre oppgaver som kan ta sanntid, men kan ikke bruke CPU-tid, som å vente på diskoperasjoner. Så som du ser, er CPU-bruken og den faktiske lengden på kjøretiden ikke alltid den samme.
Her er et annet eksempel:
// loop 10 millioner ganger (opptatt) for ($ i = 0; $ i<10000000;$i++) $data = getrusage(); echo "User time: ". ($data['ru_utime.tv_sec'] + $data['ru_utime.tv_usec'] / 1000000); echo "System time: ". ($data['ru_stime.tv_sec'] + $data['ru_stime.tv_usec'] / 1000000); /* prints User time: 1.424592 System time: 0.004204 */
Det tok ca. 1,4 sekunder med CPU-tid, nesten alle var brukertid, siden det ikke var noen systemanrop.
Systemtid er hvor lang tid CPU bruker til å utføre systemanrop for kjernen på programmets vegne. Her er et eksempel på det:
$ start = mikrotime (sant); // Fortsett å ringe mikrotime i ca 3 sekunder mens (mikrotime (true) - $ start < 3) $data = getrusage(); echo "User time: ". ($data['ru_utime.tv_sec'] + $data['ru_utime.tv_usec'] / 1000000); echo "System time: ". ($data['ru_stime.tv_sec'] + $data['ru_stime.tv_usec'] / 1000000); /* prints User time: 1.088171 System time: 1.675315 */
Nå har vi ganske mye systembruk. Dette skyldes at skriptet kaller mikrotime () -funksjonen mange ganger, som utfører en forespørsel gjennom operativsystemet for å hente tiden.
Du kan også legge merke til at tallene ikke helt legger opp til 3 sekunder. Dette skyldes at det også var trolig andre prosesser på serveren, og skriptet brukte ikke 100% CPU for hele varigheten av 3 sekunder.
PHP gir nyttige magiske konstanter for å hente det nåværende linjenummeret (__LINJE__
), filbane (__FIL__
), katalogbane (__DIR__
), funksjonsnavn (__FUNKSJON__
), klassenavn (__KLASSE__
), metodenavn (__METHOD__) og navneområde (__NAMESPACE__
).
Vi kommer ikke til å dekke hver enkelt av disse i denne artikkelen, men jeg vil vise deg noen brukstilfeller.
Når du inkluderer andre skript, er det en god ide å bruke
__FIL__
konstant (eller også__DIR__
, som fra PHP 5.3):
// dette er i forhold til det lastede skriptets sti // det kan føre til problemer når du kjører skript fra forskjellige kataloger require_once ('config / database.php'); // dette er alltid i forhold til denne filens sti // uansett hvor det ble inkludert fra require_once (dirname (__ FILE__). '/config/database.php');
Ved hjelp av __LINJE__
gjør debugging enklere. Du kan spore opp linjenumrene:
// noen kode //? my_debug ("noen feilsøkingsmelding", __LINE__); / * utskrifter Linje 4: noen debug melding * / // noe mer kode //? my_debug ("en annen feilmelding", __LINE__); / * utskrifter Linje 11: En annen feilsøkingsmelding * / funksjon my_debug ($ msg, $ line) echo "Linje $ linje: $ msg \ n";
Det kan være situasjoner der du må generere en unik streng. Jeg har sett mange mennesker bruker MD5 ()
fungere for dette, selv om det ikke er akkurat ment for dette formålet:
// generere unikt streng ekko md5 (tid (). mt_rand (111000000));
Det er faktisk en PHP-funksjon kalt uniqid () som er ment å brukes til dette.
// generere unikt string echo uniqid (); / * utskrifter 4bd67c947233e * / // generere en annen unik streng ekko uniqid (); / * utskrifter 4bd67c9472340 * /
Du kan legge merke til at selv om strengene er unike, ser de ut som de første flere tegnene. Dette skyldes at den genererte strengen er relatert til servertiden. Dette har faktisk en fin bivirkning, siden hvert nytt generert ID kommer senere i alfabetisk rekkefølge, slik at de kan sorteres.
For å redusere sjansene for å få en duplikat, kan du passere et prefiks, eller den andre parameteren for å øke entropi:
// med prefix echo uniqid ('foo_'); / * utskrifter foo_4bd67d6cd8b8f * / // med flere entropi ekko uniqid ("true"; / * utskrifter 4bd67d6cd8b926.12135106 * / // begge ekko uniqid ('bar _', true); / * utskrifter bar_4bd67da367b650.43684647 * /
Denne funksjonen genererer kortere strenger enn MD5 ()
, som også sparer litt plass.
Har du noen gang trengte å lagre en kompleks variabel i en database eller en tekstfil? Du trenger ikke å komme med en fancy løsning for å konvertere arrays eller objekter til formaterte strenger, da PHP allerede har funksjoner for dette formålet.
Det er to populære metoder for serialisering av variabler. Her er et eksempel som bruker serialize () og unserialize ():
// et komplekst utvalg $ myvar = array ('hallo', 42, array (1, 'two'), 'apple'); // konvertere til en streng $ string = serialize ($ myvar); ekko $ streng; / * skriver ut a: 4: i: 0; s: 5: "hei"; jeg: 1; jeg: 42; i: 2; a: 2: i: 0; i: 1; : 3: "two"; i: 3; s: 5: "apple"; * / // du kan reprodusere den opprinnelige variabelen $ newvar = unserialize ($ string); print_r ($ newvar); / * utskrifter Array ([0] => hei [1] => 42 [2] => Array ([0] => 1 [1] => to) [3] => eple)
Dette var den native PHP serialiseringsmetoden. Men siden JSON har blitt så populært de siste årene, bestemte de seg for å legge til støtte for det i PHP 5.2. Nå kan du bruke json_encode ()
og json_decode ()
Fungerer også:
// et komplekst utvalg $ myvar = array ('hallo', 42, array (1, 'two'), 'apple'); // konvertere til en streng $ string = json_encode ($ myvar); ekko $ streng; / * utskrifter ["hei", 42, [1, "to"], "eple"] * / // du kan reprodusere den opprinnelige variabelen $ newvar = json_decode ($ string); print_r ($ newvar); / * utskrifter Array ([0] => hei [1] => 42 [2] => Array ([0] => 1 [1] => to) [3] => eple)
Den er mer kompakt, og best av alt, kompatibel med javascript og mange andre språk. Men for komplekse objekter kan det hende at noen opplysninger går tapt.
Når vi snakker om kompresjon, tenker vi vanligvis på filer, for eksempel ZIP-arkiver. Det er mulig å komprimere lange strenger i PHP, uten å involvere noen arkivfiler.
I det følgende eksemplet skal vi bruke funksjonene gzcompress () og gzuncompress ():
$ string = "Dette er et godt valg, men det er ikke så godt som mulig. Du kan ikke finne noe annet enn det du trenger. Du kan også finne ut hva som helst, men du kan ikke finne noe om det, men det er ikke noe som helst. , konsekvente adipiscing elit. Alquam pretium ullamcorper urna quis iaculis. Etiam ac masse sed turpis tempor luctus. Du er her for å se hva som skjer. ikke med munn, på lacinia augue. Mørk nisi, ornare i mollis i, mollis sed nunc. Etiam på bare å leo congue mollis. Nullam i neque egen metus hendrerit scelerisque eu non enim. Ut fra malesuada lacus eu nulla bibendum id euismod urna sodales . "; $ komprimert = gzcompress ($ streng); ekko "Original størrelse:". StrLen ($ string) "\ n".; / * utskrifter Originalstørrelse: 800 * / ekko "Komprimert størrelse:". StrLen ($ komprimert) "\ n".; / * utskrifter Komprimert størrelse: 418 * / // få den tilbake $ original = gzuncompress ($ komprimert);
Vi var i stand til å oppnå nesten 50% størrelsesreduksjon. Funksjonene gzencode () og gzdecode () gir også lignende resultater ved å bruke en annen komprimeringsalgoritme.
Det er en funksjon kalt register_shutdown_function (), som lar deg utføre noen kode rett før manuset fullfører kjører.
Tenk deg at du vil ta opp noen referansestatistikk ved slutten av manuseksjonen, for eksempel hvor lang tid det tok å kjøre:
// fange starttiden $ start_time = mikrotime (true); // gjør noen ting //? // vise hvor lenge skriptet tok ekko "utførelse tok:". (mikrotime (sant) - $ start_time). "sekunder.";
I begynnelsen kan dette virke trivialt. Du legger bare til koden helt nederst på skriptet, og den kjører før den er ferdig. Men hvis du noensinne rangerer exit () -funksjonen, vil den koden aldri løpe. Også, hvis det er en dødelig feil, eller hvis manuset avsluttes av brukeren (ved å trykke på Stopp-knappen i nettleseren), kan det igjen ikke løpe.
Når du bruker register_shutdown_function (), vil koden din utføres uansett hvorfor skriptet har stoppet å kjøre:
$ start_time = mikrotime (true); register_shutdown_function ( 'my_shutdown'); // gjør noen ting //? funksjon my_shutdown () global $ start_time; ekko "utførelse tok:". (mikrotime (sant) - $ start_time). "sekunder.";
Er du klar over andre PHP-funksjoner som ikke er allment kjent, men kan være ganske nyttige? Vennligst del med oss i kommentarene. Og takk for at du leser!