Korišćenje šablona u PHP-u. Korištenje zamjenskih znakova u PHP znakovima i indeksima znakova u stringovima
IN u poslednje vreme diskusije o PHP jeziku na Habréu svode se više na mogućnosti dizajna složeni sistemi, što ne može a da ne raduje. Međutim, nakon što sam pogledao desetak najpriznatijih web okvira (Zend Framework, Adept, CakePHP, CodeIgniter, LIMB, Symfony, MZZ i drugi), bio sam iskreno iznenađen što sam u nekima pronašao značajne nedostatke sa stanovišta elementarne optimizacije. .
Kako bi ova tema bila više tehnički orijentisana, rezultati su predstavljeni u strožijoj formi, što može donekle otežati percepciju.
Dakle, idemo... Zadatak je krajnje jednostavan: provesti eksperimente o brzini formiranja nizova od podnizova u jednostrukim i dvostrukim navodnicima. U principu, ovo pitanje će i dalje biti relevantno dugo vremena zbog posebnosti obrade stringova u PHP-u.
Postoji mnogo članaka o osnovnoj optimizaciji skripti, kako na ruskom tako i na drugim jezicima. Malo govori o stringovima, ali napominje činjenicu da se nizovi u dvostrukim navodnicima "raščlanjuju" na varijable i kontrolne znakove (baš kao u službenoj dokumentaciji). Na osnovu ovoga, logično je pretpostaviti da će korištenje nizova u dvostrukim navodnicima biti nešto sporije u radu od istih operacija sa podnizovima u jednostrukim navodnicima.
Osim zamjene varijabli u nizove i spajanja varijabli sa podstringovima, PHP implementira još najmanje jedan način za generiranje stringova: rad sa sprintf funkcijom. Logično je to pretpostaviti ovu metodu bit će znatno inferiorniji od „standardnih“ zbog nepotrebnog poziva funkcije i raščlanjivanja stringova unutra.
Jedini dodatak, prije nego što vam predstavim kod testne skripte: postoje 2 stvari koje treba uzeti u obzir moguće opcije rad sa stringovima u dvostrukim navodnicima: uzimajući u obzir jednostavne i "napredne" stilove kodiranja. Vjerojatno ne biste trebali obraćati pažnju na činjenicu da su varijable na samom početku reda - to su samo primjeri:
$string = "$_SERVER["HTTP_HOST"] nije administracija regije Uljanovsk. Mi volimo ruski jezik i ne volimo one koji ga govore..."
I
$string = "($_SERVER["HTTP_HOST"]) nije administracija regije Uljanovsk. Mi volimo ruski jezik i ne volimo one koji ga govore..."
Test broj jedan.
Pa, čini se da su sve rezervacije napravljene - vrijeme je da pokažemo rezultate rada. Izvorni kod može se naći tester.
Snimci ekrana pokazuju da moja hipoteza nije potvrđena. Ispostavilo se da je jedina ispravna pretpostavka o radu sa stringovima preko sprintf-a. Najbrže su bile funkcije koje rade posebno s dvostrukim navodnicima.
Nakon kratkog razmišljanja o situaciji, objašnjenje je došlo samo od sebe: poenta je u tome da je referentni niz u koji su izvršene zamjene prekratak: prolazak parsera kroz takav niz je pravi komad kolača. Međutim, čak i ovdje je jasno da izvorna zamjena varijable u string daje prednost u odnosu na „napredni stil“.
Ovo je takođe slabost pristupa konkatenacije: volumen umetnutih podataka premašuje volumen podstringova. Otkud režijski troškovi možete pročitati u već spomenutom habratopicu.
Međutim, i ova razmišljanja su morala biti potvrđena. To je zahtijevalo drugi test sa promjenama mogućih navedenih razloga za ovako nepredvidivo (za mene) ponašanje. Očigledno je dosta toga izmenjeno u petoj verziji (priznajem, u petoj verziji PHP-a sam uradio samo 1 test: da pređem elemente niza).
Test broj dva.
Druga hipoteza: produženje referentnog niza će u konačnici rezultirati povećanjem procenta vremena rada testnih funkcija povezanih s formiranjem nizova u dvostrukim navodnicima, u odnosu na rezultate testa broj 1. Istu situaciju, teoretski, treba promatrati u odnosu na rad sprintf funkcije. To je prije svega zbog potrebe za raščlanjivanjem nizova i povećanja vremena utrošenog na to. U situaciji sa spajanjem podnizova u jednostruke navodnike, mislim da će se uočiti približno isti rezultat kao u prvom testu, što će dati blago smanjenje udjela vremena izvršavanja funkcije quotes_3() u odnosu na vrijeme izvršenja cijelog skripta (ali ne i povećanje performansi).
Zaključci su zapravo samo pozitivni i potvrđuju hipotezu. S blagim povećanjem referentnog niza pojavljuje se veliko opterećenje, što dovodi do smanjenja performansi funkcija za rad s dvostrukim navodnicima i sprintf-om.
Pretpostavka vezana za nizove u pojedinačnim navodnicima se također pokazala tačnom: umjesto 36,75% vremena u prvom testu, u drugom je funkcija quotes_3() zauzela 33,76% vremena izvršavanja skripte
Praktična vrijednost.
Jednostavnim riječima, apstrahirajući od podataka, možemo zaključiti: što je duži red u kojem treba izvršiti zamjena, vjerovatnije, da će se operacija spajanja izvesti brže od traženja varijable u dvostrukim navodnicima. Volonteri mogu pokušati odabrati potrebne parametre umetanja (broj varijabli, dužina referentnog niza, dužine nizova u varijablama) tako da zadovolje jednakost vremena izvršavanja.
To je sve, zapravo. Ostaje samo dodati da u programiranju nema sitnica (mislim, za one koji vole da kažu „štede na šibicama“ (c) Adelf). Poznavajući takve suptilnosti i uzimajući ih u obzir, možete napisati kod koji će biti optimizovan na svim nivoima;)
PS:
Testovi izvedeni koristeći Zend Studio za Eclipse 6.0.0 (Debugger + Profiler uključen).
PHP verzija 5.2.5
Debian Linux OS
PPS:
Bilo bi mi drago da neko objavi rezultate ovih testova. Mislim da će to omogućiti objektivniju procjenu potrebe za korištenjem jedne ili druge metode zamjene nizova. Također bih cijenio zdravu kritiku stila i dizajna prezentacije.
Vrijednosti tipa string su tekstualni nizovi (skraćeno nizovi). Niz je niz od nula ili više znakova. Znakovi uključuju slova, brojeve, interpunkciju, specijalni znakovi i prostori.
Niz se može definirati sa četiri na razne načine:
- dvostruki navodnici
- jednostruki navodnici
- heredoc sintaksa
- nowdoc sintaksa
Niz u dvostrukim navodnicima
Niz u dvostrukim navodnicima:
Možete koristiti izlazne sekvence u nizovima u dvostrukim navodnicima. Kontrolna sekvenca— ovo su posebni znakovi dizajnirani za formatiranje izlaznog teksta. Sljedeće escape sekvence su dostupne u PHP-u:
Glavno svojstvo stringova sa dvostrukim navodnicima je sposobnost rukovanja varijablama unutar stringova.
Znak dolara: \$";
Nizovi zatvoreni u dvostrukim navodnicima mogu sadržavati jednostruke navodnike:
Echo "Jednostruki navodnik: "";
Niz u jednostrukim navodnicima (apostrofi)
Niz u jednostrukim navodnicima:
$str = "String"; echo "Jedan veliki red se može razbiti na nekoliko malih redova kako bi se lakše čitao.";
Za razliku od nizova u dvostrukim navodnicima i heredoc sintakse, varijable i kontrolne sekvence (sa jednim izuzetkom) zatvorene u jednostruki navodnici, nisu obrađeni. To znači da će se oni tumačiti kao normalni znakovi niza:
$num = 10; echo "Broj: $num
Znak dolara: \$";
Da biste mogli koristiti pojedinačne navodnike u nizu koji je zatvoren u jednostrukim navodnicima, morate ih izbjeći pomoću obrnute kose crte (\"). Ako trebate napisati samu obrnutu kosu crtu, morate je duplicirati (\\):
Echo "Koristite \"jednostruke\" navodnike unutra"; echo "Backlash: \\";
Nizovi zatvoreni u jednostrukim navodnicima mogu sadržavati dvostruke navodnike:
Echo "Dvostruki navodnik: "";
Heredoc sintaksa
Heredoc sintaksa je alternativni način pisanje nizova.
Niz definiran korištenjem Heredoc sintakse funkcionira isto kao string zatvoren u dvostrukim navodnicima. Razlika između Heredoc-a i stringa sa dvostrukim navodnicima je u tome što kod Heredoc-a nema potrebe za izbjegavanjem dvostrukih navodnika.
Heredoc sintaksa počinje sa tri znaka<<< , после которых должен быть указан произвольный идентификатор (назовём его открывающим). Идентификатор может быть указан как в двойных кавычках, так и без них. Odmah nakon identifikatora ne smije se nalaziti novi red, osim novog reda, inače će doći do greške. Zatim slijedi sam sadržaj stringa. Nakon sadržaja niza, u posebnom redu, mora se navesti završni identifikator (isto kao poslije<<<). Перед ним и после него не должно быть никаких пробелов или других символов, за исключением точки с запятой. Если это правило нарушено, то считается, что закрывающий идентификатор отсутствует и будет вызвана ошибка:
<< Nowdoc sintaksa, kao i Heredoc, je alternativni način za pisanje stringova. Niz definiran korištenjem Nowdoc sintakse funkcionira isto kao string zatvoren u jednostrukim navodnicima. Razlika između Nowdoc-a i stringa sa jednim navodnicima je u tome što sa Nowdoc-om nema potrebe za izbjegavanjem pojedinačnih navodnika. Sintaksa Nowdoc-a je slična Heredoc-u, s jedinom razlikom što se identifikator otvaranja mora staviti u jednostruke navodnike: $num = 10; echo<<<"some_id"
Число: $num
some_id;
Postoje dvije vrste sintakse za rukovanje varijablama u nizovima: jednostavno I teško. Jednostavna sintaksa- ovo je kada je ime varijable naznačeno u redu kao što jeste. Kada interpretator naiđe na znak dolara, počinje uzastopno provjeravati da li su svi sljedeći znakovi važeći znakovi u imenu varijable. Dakle, da bi se formiralo valjano ime varijable, ona hvata što je moguće više znakova: $str = "Svijet!"; echo "Zdravo $str"; Složena sintaksa- ovo je kada je ime varijable zatvoreno u vitičaste zagrade. Budući da, da bi obradio varijablu u liniji, interpreter hvata što je moguće više znakova, postoje situacije kada tumač nije u mogućnosti da samostalno odredi gdje se naziv varijable završava: $sport1 = "hoće"; $sport2 = "noga"; echo "Volim $sport1ball i $sport2ball"; U ovom slučaju, željeni rezultat neće biti postignut jer će tumač smatrati da je $sport1 dio imena varijable $sport1bol, koja ne postoji. Da biste eksplicitno rekli interpretatoru gdje završava ime varijable, morate staviti ime varijable u vitičaste zagrade: $sport1 = "hoće"; $sport2 = "noga"; echo "Sviđa mi se ($sport1)bol i ($sport2)bol."; Znak dolara može se postaviti prije ili iza vitičaste zagrade: $sport1 = "hoće"; $sport2 = "noga"; echo "Sviđaju mi se $(sport1)bol i ($sport2)bol."; Konkatenacija je spajanje dva ili više nizova u jedan veći niz. Povezivanje se događa pomoću operatora konkatenacije - . (tačka). Prilikom spajanja, svaki sljedeći red se dodaje na kraj prethodnog:
Vrijednost bilo kojeg tipa koja je spojena sa nizom bit će implicitno konvertirana u niz, a zatim spojena:
"; echo "Broj: " . 1; ?> Komentar:
U PHP-u 7.0.0 na 64-bitnim platformama ne postoje dostižna ograničenja dužine linije na 32-bitnim sistemima, au ranijim verzijama PHP-a linije ne mogu biti veće od 2 GB (2147483647 bajtova). Niz se može definirati na četiri različita načina: Najjednostavniji način da se definira string je da se stavi u jednostruke navodnike (simbol "
). Da biste koristili jedan navodnik unutar niza, izmaknite ga obrnutom kosom crtom ( \
). Ako trebate napisati samu obrnutu kosu crtu, duplirajte je ( \\
). Sve druge upotrebe obrnute kose crte će se tumačiti kao normalni znakovi: to znači da ako pokušate koristiti druge izlazne sekvence kao što je \r ili \n, oni će biti ispisani takvi kakvi jesu umjesto bilo kakvog posebnog ponašanja. echo "ovo je jednostavan niz"; echo „Možete i umetnuti u redove // Izlazi: Arnold je jednom rekao: "Vratit ću se" Echo "Jeste li izbrisali C:\\*.*?"; // Izlazi: Jeste li izbrisali C:\*.*? // Izlazi: Ovo neće biti prošireno: \n novi red // Izlazi: $expand i $either varijable nisu proširene Ako je niz stavljen u dvostruke navodnike ("), PHP prepoznaje sljedeće escape sekvence posebnih znakova: Kao i kod stringa zatvorenog u jednostruke navodnike, izbjegavanje bilo kojeg znaka će također dovesti do samog izlaznog znaka. Prije PHP 5.1.1, obrnuta kosa crta \($var) nije objavljeno. Treći način za definiranje stringova je korištenje heredoc sintakse: <<<
. Nakon ovog operatora, morate navesti identifikator, a zatim prijelaz na red. Nakon toga dolazi sama linija, a zatim isti identifikator, koji zatvara umetanje. Linija trebalo bi početi sa završnim identifikatorom, tj. mora se pojaviti u prvoj koloni reda. Dodatno, identifikator mora slijediti ista pravila imenovanja kao i sve druge oznake u PHP-u: sadržavati samo alfanumeričke znakove i donju crtu i ne smije početi brojem (donje crte su dozvoljene). Pažnja
Vrlo je važno napomenuti da završni red identifikatora ne smije sadržavati nikakve druge znakove osim točke i zareze ( ;
). To znači da je id ne treba biti uvučen i da ne može biti nikakvih razmaka ili tabulatora prije ili poslije tačke i zareza. Također je važno razumjeti da prvi znak prije završnog identifikatora mora biti znak za novi red kako je definirao vaš operativni sistem. Na primjer, na UNIX sistemima, uključujući macOS, ovo je \n. Novi red također mora početi odmah nakon završnog identifikatora. Ako je ovo pravilo prekršeno i identifikator zatvaranja nije "čist", pretpostavlja se da nedostaje identifikator zatvaranja i PHP će nastaviti da ga traži dalje. Ako se u ovom slučaju nikada ne pronađe ispravan identifikator zatvaranja, to će uzrokovati grešku raščlanjivanja s brojem reda na kraju skripte. Primjer #1 Primjer netačne sintakse klasa foo ( Primjer #2 Primjer ispravne sintakse klasa foo ( Heredoc se ne može koristiti za inicijalizaciju polja klase. Počevši od PHP 5.3, ovo ograničenje se odnosi samo na heredocs koji sadrže varijable u sebi. Heredoc tekst se ponaša na isti način kao string u dvostrukim navodnicima, a da ih nema. To znači da ne morate izbjegavati navodnike u heredoc, ali i dalje možete koristiti gornje izlazne sekvence.<< prostiru se na nekoliko redova, Class foo Function__construct() $this -><< Sad zaključujem ( $foo -> bar [ 1 ]) Ovo bi trebalo dati veliko slovo "A": \x41 Moje ime je "Ime". Ukucam Foo. Sada, ispisujem Bar2. Ovo bi trebalo proizvesti veliko slovo "A": A Također je moguće koristiti heredoc sintaksu za prosljeđivanje podataka kroz argumente funkcije: statički $bar = const BAR =<< FOOBAR; Primjer korištenja polja Od PHP 5.3.0, Heredoc identifikator možete okružiti i dvostrukim navodnicima: Nowdoc
deklarisanjem bloka teksta koji nije namijenjen za obradu. Nowdoc je označen istim nizom <<<
, koji se koristi u heredoc, ali je sljedeći identifikator zatvoren u jednostrukim navodnicima, na primjer, <<<"EOT"
. Svi uvjeti koji se primjenjuju na heredoc identifikatore također se primjenjuju na nowdoc, posebno oni koji se odnose na završni identifikator. $this -><<<"EOD" EOD; Rezultat pokretanja ovog primjera: Primjer teksta koji se proteže u više redova koristeći sintaksu nowdoc. Obrnute kose crte se uvijek tretiraju doslovno, kao što su \\ i \". Primjer #8 Nowdoc primjer navođenja stringova sa varijablama Class foo Function__construct() $this -><<<"EOT" EOD; Ovo ne bi trebalo da daje veliko "A": \x41 Moje ime je "$name". Štampam $foo->foo. Sada štampam ($foo->bar). Ovo ne bi trebalo da daje veliko "A": \x41 klasa foo ( Komentar: Primjer #9 Primjer korištenja statičkih podataka Rukovanje varijablama Ako je niz naveden u dvostrukim navodnicima ili koristeći heredoc, varijable unutar njega se obrađuju. Postoje dvije vrste sintakse: jednostavna i složena. Jednostavna sintaksa je lakša i praktičnija. Omogućava obradu varijable, vrijednosti niza ( niz) ili svojstva objekta ( objekt Složena sintaksa se može prepoznati po vitičastim zagradama koje okružuju izraz. $
Jednostavna sintaksa Ako prevodilac naiđe na znak dolara ( ), hvata što je više moguće znakova kako bi formirao valjano ime varijable. Ako želite da navedete kraj imena, stavite ime varijable u vitičaste zagrade. $juice = "jabuka" ; // Netočno. "s" je važeći znak za ime varijable, ali varijabla se zove $juice. EOD; // Ispravno. Kraj naziva varijable je striktno označen pomoću zagrada: echo "Popio je sok napravljen od $( soka) s." ; Postoje dvije vrste sintakse: jednostavna i složena. Popio je sok od jabuke. Popio je sok od . Popio je sok od jabuke. niz Element niza ( ]
) označava kraj definicije indeksa. Ista pravila se primjenjuju na svojstva objekta kao i na jednostavne varijable. Primjer #10 Jednostavan primjer sintakse define ("KOOLAID" , "koolaid1" ); echo "Popio je malo $juices [ 0 ] soka." . PHP_EOL ; klasni ljudi ( Public $smith = "Smith" ; $ljudi = novi ljudi(); echo "$people -> John je popio malo $juices [ 0 ] soka." . PHP_EOL ; EOD; Popio je sok od jabuke. Popio je sok od narandže. Popio je ljubičasti sok. John Smith je popio sok od jabuke. John Smith je zatim pozdravio Jane Smith. Roberta Paulsena pozdravila je supruga Johna Smitha. PHP 7.1.0 je dodao podršku negativan numerički indeksi. Primjer #11 Negativni numerički indeksi $string = "string" ; EOD; Znak sa indeksom -2 je jednak n. Promjena karaktera na poziciji -3 u "o" daje sljedeći red: jak Za sve složenije, koristite složenu sintaksu. Naziva se složenim ne zato što ga je teško razumjeti, već zato što dozvoljava upotrebu složenih izraza. Bilo koja skalarna varijabla, element niza ili svojstvo objekta mapirano u string može biti predstavljeno u nizu koristeći ovu sintaksu. Samo napišite izraz na isti način na koji biste to učinili izvan reda, a zatim ga umotajte {
I }
. Pošto {
ne može se izbjeći, ova sintaksa će biti prepoznata samo kada $
sledi direktno
{
. Koristi {\$
štampati {$
. Nekoliko ilustrativnih primjera: error_reporting(E_ALL); $great = "odlično" ; echo "Ovo je ($odlično)" ; echo "Ovo je ($odlično)" ; ( $square -> width ) 00 centimetara." ; echo "Ovo je ($odlično)" ; // Ovo je nevažeće iz istog razloga kao i $foo izvana // Works. Kada se interno koriste višedimenzionalni nizovi // Works. echo "I ovo radi:( $obj -> vrijednosti [ 3 ]-> ime ) " ; echo „Ovo je vrijednost imenovane varijable$name : ($( $name)) " ; echo "Ovo je vrijednost imena varijable koju getName() vraća:($( getName ())) " ; echo "Ovo je vrijednost varijable po imenu koju \$object->getName() vraća:($( $object -> getName ())) " ; // Ne radi, izlazi: Ovo je ono što getName() vraća: (getName()) Također je moguće pristupiti svojstvima objekta unutar stringova koristeći ovu sintaksu. klasa foo ( Function__construct() EOD; Ja sam bar. Ja sam bar. Komentar: Funkcije, pozivi metoda, statičke varijable klase i konstante klase rade interno {$}
, počevši od PHP 5. Međutim, dostavljena vrijednost će se tretirati kao ime varijable u istom kontekstu kao i red u kojem je definirana. Korištenje pojedinačnih vitičastih zagrada ( {}
) neće raditi za pristup vrijednostima funkcija, metoda, konstanti klase ili statičkih varijabli klase. Nekoliko ilustrativnih primjera: klasa piva ( $rootbeer = "A & W" ; // Ovo radi, izlazi: Želio bih A & W // I ovo radi, izlazi: Volio bih Alexander Keitha Znakovi u nizovima se mogu koristiti i modificirati specificiranjem njihovog pomaka od početka stringa, počevši od nule, u uglastim zagradama nakon niza, na primjer, $str. Zamislite string za ovu svrhu kao niz znakova. I Ako trebate dobiti ili zamijeniti više od 1 znaka, možete koristiti funkcije. Komentar:
Od PHP 7.1.0, podržane su negativne vrijednosti pomaka. Oni određuju pomak od kraja reda. Prethodno negativni pomaci uzrokovali su grešku nivoa E_NOTICE na čitanje (vraćanje praznog niza) ili E_UPOZORENJE Komentar:
prilikom pisanja (ostavljajući red nepromijenjen). Pažnja
Znaku u nizu se također može pristupiti pomoću vitičastih zagrada, na primjer $str(42) . na čitanje (vraćanje praznog niza) ili Pokušaj pisanja u pomak izvan granica linije će dopuniti niz razmacima do tog pomaka. Necjelobrojni tipovi će se pretvoriti u cjelobrojne tipove. Pažnja
Pogrešan tip pomaka će uzrokovati grešku nivoa Komentar:
. Koristi se samo prvi znak dodijeljenog niza. Od PHP 7.1.0, dodeljivanje praznog niza će izazvati fatalnu grešku. Ranije je u ovom slučaju dodijeljen nulti bajt (NULL). Primjer #12 Neki primjeri nizova $str = "Ovo je test." ; $third = $str [2];
?>
$last = $str [strlen ($str) - 1]; // Promjena posljednjeg znaka reda$str = "Pogledajte more" ; 0
. $str [ strlen ($str )- 1 ] = "e" ; Od PHP 5.4, pomak u nizu mora biti specificiran ili kao cijeli broj ili kao niz koji sadrži cifre, inače će biti izdato upozorenje. Prethodno pomak dat nizom poput "foo" Primjer #13 Razlike između PHP 5.3 i PHP 5.4 Var_dump($str["1"]); Var_dump($str["1.0"]); Var_dump($str["x"]); var_dump (isset($str [ "x" ])); Var_dump($str["1x"]); var_dump (isset($str [ "1x" ])); Komentar: Pokušaj pristupa varijablama drugih tipova (isključujući nizove ili objekte koji implementiraju određena sučelja) koristeći
ili {}
ćutke će se vratiti NULL. Komentar: PHP 5.5 je dodao podršku za pristup znakovima u literalima niza pomoću sintakse
ili {}
. Postoje mnoge korisne funkcije za modificiranje nizova. Osnovne funkcije su opisane u odjeljku o funkcijama stringova, a za napredno pretraživanje i zamjenu, funkcije regularnog izraza kompatibilne s Perl-om. Vrijednost se može pretvoriti u string pomoću cast (niz), ili funkcije strval(). echo ili U izrazima u kojima je potreban niz, konverzija se događa automatski. Ovo se dešava kada koristite funkcije print. , ili kada se vrijednost varijable uporedi sa nizom. Čitanje odjeljaka Tipovi i Tipovi u priručniku učinit će sljedeće jasnije. Vidi također settype() Nizovi se uvijek pretvaraju u string Postoje dvije vrste sintakse: jednostavna i složena."niz" echo ili U izrazima u kojima je potreban niz, konverzija se događa automatski., tako da ne možete prikazati sadržaj niza ( ), koristeći da vidite šta sadrži. Da vidite jedan element, koristite nešto poput echo $arr["foo"] . U nastavku pogledajte savjete o tome kako prikazati/pogledati sav sadržaj. Za pretvaranje varijable tipa "Objekat" u tipu string NULL Koristi se magična metoda __toString. Značenje se uvijek pretvara u prazan niz. I Kao što vidite gore, direktno pretvaranje nizova, objekata ili resursa u niz ne daje nikakve korisne informacije o samim vrijednostima osim njihovih tipova.. Bolji način za izlaz vrijednosti za otklanjanje grešaka je korištenje funkcija print_r(). Većina vrijednosti u PHP-u može se pretvoriti u string za trajno skladištenje. Ova metoda se naziva serijalizacija i može se izvršiti pomoću funkcije serialize() Pretvaranje nizova u brojeve Ako je niz prepoznat kao numerička vrijednost, rezultirajuća vrijednost i tip se određuju na sljedeći način. Ako niz ne sadrži nijedan od znakova ".", "e" ili "E", a vrijednost broja spada u raspon cijelih brojeva (definiranih PHP_INT_MAX ), niz će biti prepoznat kao cijeli broj (). Vrijednost je određena početkom niza. Ako linija počinje važećom numeričkom vrijednošću, ta vrijednost će se koristiti. Inače će vrijednost biti 0 (nula). Važeća brojčana vrijednost je jedna ili više cifara (koje mogu sadržavati decimalni zarez), opcionalno prethodi znak nakon kojeg slijedi opcijski eksponent. Eksponent je "e" ili "E" iza kojeg slijedi jedna ili više cifara. $foo = 1 + "10.5" ; // $foo je float (11.5) Za više informacija o ovoj konverziji, pogledajte odjeljak strtod(3) u Unix dokumentaciji. Ako želite da testirate bilo koji od primjera u ovom odjeljku, kopirajte ga i zalijepite i sljedeći red da vidite šta se događa: echo "\$foo== $foo ; upišite: " . gettype ($foo) . " Ne očekujte da ćete dobiti kod znaka pretvarajući ga u cijeli broj (kao što se radi, na primjer, u C). Za pretvaranje znakova u njihove ASCII kodove i natrag, koristite funkcije ord() I chr(). prije 7 godina U dokumentaciji se ne spominje, ali završna tačka-zarez na kraju heredoc-a se zapravo tumači kao prava tačka-zarez, i kao takva ponekad dovodi do sintaksičkih grešaka. $foo =<< foo (<< foo (<< prije 3 godine Možete koristiti niz znakova poput stringa (kao C) $a = "Test niza nizova"; var_dump($a); var_dump($a); // -- Sa ubacivanjem niza -- var_dump((niz) $a); Norihiori prije 15 godina Možete koristiti složenu sintaksu da stavite vrijednost i svojstava objekta I metoda objekta unutar stringa. Na primjer... Međutim, to ne možete učiniti za sve vrijednosti u vašem imenskom prostoru. Konstante klase i statička svojstva/metode neće raditi jer složena sintaksa traži "$". prije 3 godine Pazite da je u skladu s "pretvorbom nizova u brojeve": Ako ("123abc" == 123 ) eho "(intstr == int) neispravno testira kao istinit."; // Budući da je jedna strana broj, niz je pogrešno konvertovan iz intstr u int, koji se onda poklapa sa testnim brojem. // Tačno za sve uslovne izraze kao što su if i switch izjave (vjerovatno i while petlje)! // Ovo bi mogao biti veliki sigurnosni rizik kada se testira/koristi/čuva korisnički unos, dok se očekuje i testira samo cijeli broj. // Čini se da je jedino rješenje da 123 bude niz kao "123" tako da se konverzija ne dogodi.
?>
prije 6 godina Vodeće nule u nizovima se (najmanje iznenađenje) ne tretiraju kao oktalne. prije 10 godina Evo jednostavnog haka koji omogućava da stringovi sa dvostrukim navodnicima i heredocs sadrže proizvoljne izraze u sintaksi vitičastih zagrada, uključujući konstante i druge pozive funkcija: // Hack deklaracija // Naše igralište
$a=
3
; funkcija c($a,
$b) (povratak$a+
$b; }
//Upotreba // Opća sintaksa je ($_expr(...)) prije 2 godine Mislio sam da bi bilo korisno dodati ovaj komentar kako bi se informacije barem pojavile na pravoj stranici PHP stranice. Imajte na umu da ako namjeravate koristiti niz s dvostrukim navodnicima s asocijativnim ključem, možete naići na grešku T_ENCAPSED_AND_WHITESPACE. Neki ovo smatraju jednom od manje očiglednih poruka o grešci. Izraz kao što je: $fruit=niz( Print „Ovo je a$fruit[
"a"]";
// T_ENCAPSED_AND_WHITESPACE Možete ga riješiti na sljedeći način: U izrazima u kojima je potreban niz, konverzija se događa automatski.„Ovo je a$fruit[
a]
"
;
// poništiti citat ključa Nije jasno (bar meni) zašto PHP pogrešno tumači pojedinačni navodnik unutar izraza, ali pretpostavljam da to ima neke veze sa činjenicom da navodnici nisu dio niza vrijednosti - kada se string već raščlani, samo navodnici stati na putu... ? prije 2 godine I jedno i drugo bi trebalo da radi :(
klasaTestiranje{ Javna funkcija sayHelloStatic() { Javna funkcija sayHelloConst() {
$obj= novoTestiranje(); prije 3 godine Nešto što sam doživio što će bez sumnje nekome pomoći. . . $html =<<<"EOD" Koristeći ovo prikazuje sve iste boje: $html =<< čini rad sa njim mnogo lakšim prije 11 godina Da ne budete pameti nemojte čitati prethodne komentare o datumima ;) Kada se oba niza mogu pretvoriti u numeričke (u ("$a" > "$b") testu) tada se koriste rezultirajući brojevi, u suprotnom se PUNI nizovi uspoređuju char-by-char: var_dump("1.22"
>
"01.23"
);
//bool(false) (PHP 4, PHP 5, PHP 7) str_replace — Zamjenjuje sva pojavljivanja niza za pretraživanje zamjenskim nizom Ova funkcija vraća string ili niz sa svim pojavljivanjima pretraživanja u predmetu zamijenjenim zamjenom. Ako složena pravila pretraživanja/zamjene (kao što su regularni izrazi) nisu potrebna, korištenje ove funkcije je poželjnije preg_replace(). Ako su pretraga i zamjena nizovi, onda str_replace() koristi svaku vrijednost iz odgovarajućeg niza za pretraživanje i zamjenu u predmetu. Ako polje zamjene ima manje elemenata od search, prazan niz će se koristiti kao zamjenski niz za preostale vrijednosti. Ako je pretraga niz, a zamijeni niz, onda će se ovaj zamjenski niz koristiti za svaki element niza pretraživanja. Obrnuti slučaj nema smisla. Ako su pretraga ili zamjena nizovi, njihovi elementi će se obraditi od prvog do posljednjeg. Vrijednost pretraživanja, također poznata kao igla (igla). Možete koristiti niz za više vrijednosti pretraživanja. Zamijenite Zamjenska vrijednost će se koristiti za zamjenu vrijednosti pretraživanja. Možete koristiti niz za više vrijednosti. Predmet Niz ili niz na kojem se vrši pretraga i zamjena, također poznat kao plast sijena (plast sijena). Ako je predmet niz, tada će se izvršiti pretraga i zamjena na svakom elementu subjekta, a rezultat funkcije će također biti niz. Ova funkcija vraća string ili niz sa zamijenjenim vrijednostima. Primjer #1 Primjeri upotrebe str_replace()
// dodjeljuje // dodjeljuje: Hll Wrld f PHP // zadaje: Svaki dan treba jesti picu, pivo i sladoled $newphrase = str_replace($healthy, $yummy, $phrase); // dodjeljuje: 2 Primjer #2 Primjeri potencijalnih trikova sa str_replace()
// Zamjenski nalog // Prvo obrađuje \r\n kako bi se izbjegla njihova ponovna zamjena. // Ispisuje F jer A se zamjenjuje sa B, zatim B sa C, i tako dalje... // Izlazi: applerootrootnut (iz gore navedenog razloga) Komentar: Ova funkcija je sigurna za obradu podataka u binarnom obliku. Upozorenje
Jer str_replace() vrši zamjenu s lijeva na desno, a onda kada koristi više zamjena može zamijeniti prethodno umetnutu vrijednost drugom. Komentar: Pogledajte i primjere na ovoj stranici. Ova funkcija je osjetljiva na velika i mala slova. Koristi str_replace() stolovi: 3 | OJSC Pyschpyshch | Soldatodachestroyskoe 404 3 | Velika renovacija 3 | 3 | 2 | | %text% Zapravo, problem je u tome što bi treća tabela trebala biti prikazana u web obrascu „odabir narudžbe“ i umjesto ID-a potrebno je zamijeniti odgovarajuća polja iz drugih kolona. kod: INSERT U "table_name" ("list") VRIJEDNOSTI ("bla-bla") Nowdoc sintaksa
Rukovanje varijablama u nizovima
Konkatenacija
Sintaksa
Jednostruki navodnici
karakter za novi red ovako,
ovo je u redu";
echo "Jednog dana Arnold je rekao: 'Vratiću se.';
echo "Jeste li izbrisali C:\*.*?" ;
echo "Ovo neće biti prošireno: \n novi red";
echo "$expand i $either varijable nisu proširene";
?>
Dvostruki navodnici
Escape Sequences
Subsequence
Značenje
\n
novi red (LF ili 0x0A (10) u ASCII)
\r
povratak na nosivu (CR ili 0x0D (13) u ASCII)
\t
horizontalna kartica (HT ili 0x09 (9) u ASCII)
\v
vertikalna kartica (VT ili 0x0B (11) u ASCII) (od PHP 5.2.5)
\e
escape znak (ESC ili 0x1B (27) u ASCII) (od PHP 5.4.4)
\f
feed stranice (FF ili 0x0C(12) u ASCII) (od PHP 5.2.5)
\\
obrnuta kosa crta
\$
znak dolara
\"
dvostruki citat
\{1,3}
niz znakova koji odgovara regularnom izrazu oktalnog znaka koji se tiho prelijeva da bi stao u bajt (tj. "\400" === "\000")
\x(1,2)
niz znakova koji odgovara regularnom izrazu znaka u heksadecimalnom zapisu
\u(+)
niz znakova koji odgovara regularnom izrazu Unicode karaktera koji se preslikava na niz u UTF-8 reprezentaciji (dodato u PHP 7.0.0)
Heredoc
javni $bar =<<
EOT;
// uvlačenje ispred identifikatora zatvaranja nije dozvoljeno
}
?>
javni $bar =<<
EOT;
}
?>
Primjer #3 Heredoc primjer definicije stringa
$str =
Primjer linije,
{
koristeći heredoc sintaksu.
EOD;
{
var $foo ;
var $bar ;
}
}
$this -> foo = "Foo" ;
$name = "Ime" ; echo .
Moje ime je "$name". Ukucam $foo -> foo
EOT;
?>
Od verzije 5.3.0, postalo je moguće inicijalizirati statičke varijable i svojstva/konstante klase koristeći heredoc sintaksu:
{
Primjer #5 Korišćenje heredoc za inicijalizaciju statičkih varijabli<<
Ovde nema ničega...
{
LABEL;<<
class foo
class foo
}
?>
Javni $baz =
Primjer #7 Primjer korištenja nowdoc
Primjer teksta,
obuhvata nekoliko linija
koristeći sintaksu nowdoc. Obrnute kose crte se uvijek tretiraju doslovno,
na primjer, \\ i \".
Ovde nema ničega...
{
/* Složeniji primjer sa varijablama. */
public $foo ;
{
var $foo ;
javni $bar ;
}
}
$this -> foo = "Foo" ;
$this -> bar = array("Bar1" , "Bar2" , "Bar3" );
Moje ime je "$name". Štampam $foo->foo.
Sada štampam ($foo->bar).
EOT;
?>
javni $bar =<<<"EOT"
bar
EOT;
}
?>
Nowdoc podrška je dodana u PHP 5.3.0.
) uz minimum napora.
echo "Popio je sok od $juice." . PHP_EOL ;
echo "Popio je sok od $sokova." ;
?>
$juices = array("apple" , "orange" , "koolaid1" => "purple");
echo "Popio je malo $juices [ 1 ] soka." . PHP_EOL ;
echo "Popio je malo $juices [ koolaid1 ] sok." . PHP_EOL ;
public $john = "John Smith" ;
public $jane = "Jane Smith" ;
public $robert = "Robert Paulsen" ;
}
echo " $people -> john zatim pozdravio $people -> jane ." . PHP_EOL ;
echo "$people -> John "s žena je pozdravila $people -> Robert." . PHP_EOL;
echo " $people -> Robert je pozdravio dva $people -> smiths ." ; // Neće raditi
?>
echo "Znak na indeksu -2 je jednak$string [- 2 ] ." , PHP_EOL ;
$string [- 3 ] = "o" ;
echo "Promjena znaka na poziciji -3 u 'o' proizvodi sljedeći red:$string." , PHP_EOL;
?>
Složena (kovrdžava) sintaksa
// Prikaži sve greške
// Ne radi, izlazi: Ovo je (odlično)
// Radi, izlazi: Ovo je sjajno
echo // Works„Ovaj trg je širok
echo "Ovo radi: ( $arr [ "ključ" ]) " ;
echo "Ovo radi: ( $arr [ 4 ][ 3 ]) " ;
// linije. Drugim riječima, i dalje će raditi,
// ali pošto PHP prvo traži konstantu foo, to će uzrokovati
// greška nivoa E_NOTICE (nedefinisana konstanta).
echo "Ovo je pogrešno:( $arr [ foo ][ 3 ]) " ;
// linije uvijek koriste vitičaste zagrade
echo "Ovo radi: ( $arr [ "foo" ][ 3 ]) " ;
echo "Ovo radi: " . $arr [ "foo" ][ 3 ];
echo "Ovo je ono što getName() vraća: (getName())";
?>
var $bar = "Ja sam bar." ;
}
$bar = "bar" ;
$baz = array("foo" , "bar" , "baz" , "quux");
echo " ( $foo -> $bar ) \n" ;
echo " ( $foo ->( $baz [ 1 ])) \n" ;
?>
// Prikaži sve greške
const softdrink = "rootbeer" ;
public static $ale = "ipa" ;
}
$ipa = "Alexander Keith\"s" ;
echo "Želim ($( pivo :: bezalkoholno piće)) \n" ;
echo "Želio bih ($( pivo :: $ale )) \n" ;
?>
Pristup i promjena karaktera u nizu
Stringovi u PHP-u su interni nizovi bajtova. Kao rezultat toga, pristupanje nizu ili izmjena niza na pomaku nije sigurno za višebajtno kodiranje, i treba ga raditi samo sa nizovima u jednobajtnim kodovima, kao što je ISO-8859-1.
Budući da PHP 7.1.0, korištenje praznog indeksa ranije uzrokuje fatalnu grešku, u ovom slučaju, string je konvertovan u niz bez upozorenja.
// Dobivamo prvi znak niza
$prvi = $str [0];
// Dobivamo treći znak niza
// Dobivamo posljednji znak niza
$str = "Ovo je još uvijek test." ;
, bez upozorenja je pretvoren u
$str = "abc" ;
var_dump (isset($str [ "1" ]));
var_dump (isset($str [ "1.0" ]));
?>
Pretvori u niz
var_dump()
$foo = 1 + "-1.3e3" ; // $foo je float (-1299)
$foo = 1 + "bob-1.3e3" ; // $foo je cijeli broj (1)
$foo = 1 + "bob3" ; // $foo je cijeli broj (1)
$foo = 1 + "10 malih svinja" ; // $foo je cijeli broj (11)
$foo = 4 + "10.2 Mala praseta" ; // $foo je float (14.2)
$foo = "10.0 svinja " + 1 ; // $foo je float (11)
$foo = "10.0 svinja " + 1.0 ; // $foo je float (11)
?>
\n" ;
?>
Detalji implementacije tipa niza
END;
?>
ovo ne znači:
END;
);
// sintaksička greška, neočekivano ";"
?>
Bez tačke i zarez, radi dobro:
KRAJ
);
?>
// Povratak string(17) "Test niza nizova"
// Povratak string(1) "S"
var_dump((niz) $a);
// Povratak niz(1) ( => string(17) "Test niza nizova")
// Povratak string(17) "S"
razredni test (
javno $one = 1;
javna funkcija dva() (
return 2 ;
}
}
$test = novi test();
echo "foo ( $test -> jedan ) bar ( $test -> dva ()) " ;
?>
Izdat će "foo 1 bar 2".
razredni test (
const ONE = 1;
}
echo "foo (Test::ONE) bar" ;
?>
Ovo će dati "foo (Test::one) bar". Konstante i statička svojstva zahtijevaju da razbijete niz.
Uzmite u obzir:
$x = "0123" + 0;
$y = 0123 + 0;
echo "x je $x, y je $y"; //ispisuje "x je 123, y je 83"
drugim riječima:
* vodeće nule u numeričkim literalima u izvornom kodu se tumače kao "oktalne", c.f. strtol().
* vodeće nule u stringovima (npr. podaci koje je dostavio korisnik), kada su prebačeni (implicitno ili eksplicitno) na cijeli broj se zanemaruju i smatraju decimalnim, c.f. strtod().
funkcija _expr ($v) (vrat $v;)
$_expr = "_expr" ;
define("qwe" ,
"asd");
definisati("zxc",
5
);
$b=
4
;
echo"pre{
$_expr(1
+
2
)}
objava\n";
// izlazi "pre 3 post"
echo"pre{
$_expr(qwe)}
objava\n";
// izlazi "pre asd post"
echo"pre{
$_expr(c($a,
$b)+
zxc*
2
)}
objava\n";
// izlazi "pre 17 post"
?>
"a"=>
"jabuka",
"b"=>
"banana",
//etc
);
?>
sigurno će se raspasti.
U izrazima u kojima je potreban niz, konverzija se događa automatski.„Ovo je a${
voće[
"a"]}
"
;
// Složena sintaksa
U izrazima u kojima je potreban niz, konverzija se događa automatski.„Ovo je a{
$fruit[
"a"]}
"
;
// Varijacija složene sintakse
?>
Lično preferiram posljednju varijaciju jer je prirodnija i bliža onome kakav bi izraz bio izvan stringa.
javna statičnost$VAR=
"statičan";
public const VAR ="konst";
echo"zdravo:{
$ovo::
$VAR}
"
;
}
echo"zdravo:{
$ovo::VAR)"
;
//Greška raščlanjivanja: sintaksička greška, neočekivano ")", očekuje se "["
}
}
$obj->
sayHelloStatic();
$obj->
sayHelloConst();
U mom uređivaču, ovo će sintaksom istaknuti HTML i $comment:
$comment
Primjer linije,
Primjer linije,
var_dump("1.22.00"
>
"01.23.00"
);
//bool(true)
var_dump("1-22-00"
>
"01-23-00"
);
//bool(true)
var_dump((plutati)"1.22.00"
> (plutati)"01.23.00"
);
//bool(false)
?>
Opis
Lista parametara
Povratne vrijednosti
Primjeri
$bodytag = str_replace ("%body%" , "crno" , "
$vowels = array("a" , "e" , "i" , "o" , "u" , "A" , "E" , "I" , "O" , "U" );
$onlyconsonants = str_replace ($vowels, "" , "Hello World of PHP" );
$phrase = "Trebali biste jesti voće, povrće i vlakna svaki dan.";
$healthy = array("voće" , "povrće" , "vlakna");
$yummy = array("pica" , "pivo" , "sladoled");
$str = str_replace ("ll" , "" , "dobro gospođice Moli!", $count );
echo $count ;
?>
$str = "Linija 1\nLinija 2\rLinija 3\r\nLinija 4\n";
$order = array("\r\n" , "\n" , "\r" );
$replace = "
"
;
echo $newstr = str_replace ($red, $replace, $str);
// Kao rezultat toga, E će biti zamijenjeno sa F, jer se zamjena događa s lijeva na desno.
$search = array("A" , "B" , "C" , "D" , "E" );
$replace = array("B" , "C" , "D" , "E" , "F" );
$subject = "A" ;
echo str_replace ($search, $replace, $subject);
$letters = array("I" , "o");
$fruit = array("apple" , "nut");
$text = "U vezi sam" ;
$output = str_replace ($slova, $voće, $tekst);
echo $output ;
?>
Bilješke
Napomena o postupku zamjene
za zamjenu bez obzira na velika i mala slova.
C_id | Kompanija | Lokacija
1 | LLC Pretraga | Kudykino polje 15/3
2 | JSC Elita | Slunysvalinsk 133/7
Vrsta popravka (vrste_popravka)
r_id | Vrste_popravka |
1 | Čekić + ekseri
2 | Smjernice za ljepotu
Spisak narudžbi (list)
l_id | Tko | Šta treba | Vrijeme | Komentar operatera
1 | 1 | 2 | %timestamp% | %operator_text%
2 | 2 | 1 | | %text%
Tabela br. 1 sadrži listu klijenata.
Tabela br. 3 sadrži spisak aktuelnih naloga za operativne timove. Ova tabela se redovno ažurira i za popunjavanje se koristi web obrazac. S obzirom da stiže dosta narudžbi, u tabelu se unose zapisi u obliku ID-a korisnika i usluge.
$query = "IZABIR * IZ liste";
$result = mysql_query($query);
while($row=mysql_fetch_array($result. // uzeti rezultate iz svakog reda
( echo "";// izlazni podaci
}
CREATE TABLE "table_name" ("id" int(255) NOT NULL AUTO_INCREMENT, "list" text (80) NOT NULL, PRIMARY KEY("id".
najbolji odgovor $query =
"
odaberite kompanije.Kompanija, vrste_popravka.Vrste_popravka, lista.komentar_l
sa liste
kompanije za unutrašnje spajanje
na listi.Ko = kompanije.c_id
unutrašnji spoj repair_types
na listi."Šta treba" = repair_types.r_id
";