Opsežan ispis php. print() funkcija - Ispisuje niz

Ovo je jednostavna funkcija za ispis komentara o otklanjanju pogrešaka koje se dugo nisam sjetio. Možda će i vama dobro poslužiti.

Funkcija printd ($str) (
if ($debug) (echo $str;)
}

// ...

Ako( $valueCalculatedEarlierInTheScript== 3 ) {
učini nešto bez izlaza();
printd( "doSomethingWithNoOutput() je izvršen.");
}

?>

To je uglavnom samo da bismo bili sigurni da sve radi bez potrebe da prolazimo kroz sve i stavljamo u echo "Step #whatever has executed" kad god nešto misteriozno ne radi.

Imam mali uslužni program pokrenut iz naredbenog retka koji obrađuje potencijalno ogroman popis datoteka. Kako to može potrajati satima, zaglavio sam a

Izjava u tijelu glavne petlje koja dokazuje da se nešto događa.

Iz meni nepoznatih razloga, uslužni program iznenada je počeo spremati izlaz tako da nije ispisao ništa do završetka, poništavajući svrhu pokrenutog monitora. Dodavanje naredbi flush() nije učinilo ništa. Problem je riješen korištenjem

Fputs(STDOUT, ".");

Ali nemam pojma zašto.

Napisao sam skriptu za usporedbu nekoliko metoda ispisa podataka u PHP-u: putem jednostrukih navodnika, dvostrukih navodnika, heredoc i printf. Skripta konstruira odlomak teksta sa svakom metodom. Ovu konstrukciju izvodi 10.000 puta, a zatim bilježi koliko je vremena trebalo. Ukupno se ispisuje 160.000 puta i bilježi 16 vremena. Evo sirovih rezultata.

Ispisano izravno u preglednik--

Pojedinačni navodnici: 2813 ms
...s ulančavanjem: 1,179 ms
Dvostruki navodnici: 5.180 ms
...s ulančavanjem: 3,937 ms
heredoc: 7300 ms
...s ulančavanjem: 6,288 ms
printf: 9,527 ms
...s ulančavanjem: 8,564 ms

Izlaz u izlazni međuspremnik--

Jednostruki navodnici: 8 ms
...s ulančavanjem: 38 ms
Dvostruki navodnici: 8 ms
...s ulančavanjem: 47 ms
heredoc: 17 ms
...s ulančavanjem: 49 ms
printf: 54 ms
...s ulančavanjem: 52 ms

Ovdje se može pronaći lijep grafikon izlaza skripte:
http://i3x171um.com/output_benchmarks/ob.gif

Dakle, što biste trebali odabrati za ispis svog teksta? Otkrio sam nekoliko stvari pišući ovo.

Prvo, treba napomenuti da su ključne riječi print i echo međusobno zamjenjive, što se tiče izvedbe. Vrijeme pokazuje da je jedno vjerojatno alias za drugo. Stoga koristite ono što vam se najviše sviđa.

Drugo, ako ste se ikada zapitali što je bolje, konačan odgovor su jednostruki navodnici. Jednostruki navodnici su najmanje četiri puta brži u bilo kojoj situaciji. Dvostruki navodnici, iako su praktičniji, predstavljaju sporno značajan problem performansi kada ispisuju ogromne količine podaci.

Treće, klonite se heredoc-a i apsolutno se klonite [s]printf-a. Oni su spori, a alternative postoje.

Izvor moje skripte možete pronaći ovdje:
http://i3x171um.com/output_benchmarks/ob.txt

NE POKRETAJTE SKRIPTU NA INTERNETU! Umjesto toga pokrenite ga s lokalnog hosta. Skripta prema zadanim postavkama ispisuje ~45 megabajta teksta u html komentaru na vrhu stranice. Očekujte da će mjerilo trajati ~45 sekundi. Ako je ovo predugo, možete promijeniti broj ponavljanja na niži broj (rezultati se točno smanjuju na oko 1000 ponavljanja).

Napisao sam println funkciju koja određuje je li \n ili a
treba dodati retku ovisno o tome izvršava li se u ljusci ili prozoru preglednika. Ljudi su vjerojatno već razmišljali o ovome, ali mislio sam da ću to ipak objaviti - moglo bi pomoći nekolicini ljudi.

funkcija println ($string_message) (
$_SERVER [ "SERVER_PROTOCOL" ] ? ispis "$string_message
" : print "$string_message\n" ;
}
?>

Primjeri:

Pokretanje u pregledniku:


Izlaz: Zdravo, svijete!

Trčanje u ljusci:


Izlaz: Zdravo, svijete!\n

Budite oprezni kada koristite ispis. Budući da je print jezična konstrukcija, a ne funkcija, zagrade oko argumenta nisu potrebne.
Zapravo, korištenje zagrada može uzrokovati zabunu sa sintaksom funkcije i TREBA ih izostaviti.

Većina bi očekivala sljedeće ponašanje:
if (print("foo") && print("bar")) (
}
?>

Ali budući da zagrade oko argumenta nisu potrebne, one se tumače kao dio argumenta.
To znači da je argument prvog ispisa

("foo") && print("bar")

A argument drugog ispisa je pravedan

Za očekivano ponašanje prvog primjera potrebno je napisati:
if ((ispiši "foo" ) && (ispiši "traka" )) (
// "foo" i "bar" su ispisani
}
?>

Ažuriranje funkcije println koje sam napisao u nastavku, ovo je učinkovitije, ispravnije i vraća vrijednost (1, uvijek; (ispis)).

Funkcija println ($string_message = "" ) (
return isset($_SERVER [ "SERVER_PROTOCOL" ])? ispis "$string_message
".PHP_EOL:
ispis $string_message. PHP_EOL ;
}

?>

Mvpetrovich iz 2007. mogao je samo koristiti jednostruke navodnike kao svoje graničnike nizova (pogledajte primjer u trenutnoj dokumentaciji).
Nije UVIJEK prikladno, ali općenito je najbolje (standardi kodiranja Zend Frameworka imaju dobar uvid u to). Daje brojne zanimljive prednosti:
1: Nitko neće biti u iskušenju da napiše funkcije za zamjenu povratnih kvačica ili drugih znakova dvostrukim navodnicima. Takve funkcije mogu uzrokovati (neznatan) gubitak učinkovitosti, a možda i druge neželjene učinke.
2: Moći ćete koristiti dvostruke navodnike bez bježanja. Ovo se preporučuje (iako nije obavezno) za HTML i XML atribute, kao i za citirani tekst.
3: Skripta će doći do preglednika vrlo malo malo brže jer PHP ne mora skenirati kroz niz koji traži varijable, izbjegnute znakove, vitičaste zagrade ili druge stvari.
4: Vaš kod postaje deset puta lakši za čitanje. (kao što je mvpetrovich istaknuo)

Ako, usprkos ove četiri izvrsne prednosti, stvarno još uvijek MORATE koristiti dvostruke navodnike za razdvajanje dosadnih starih string konstanti (i ozbiljno, zašto biste?), možete koristiti malo manje povoljne jednostruke navodnike kao graničnike za većinu označnih jezika.
HTML koji služi kao HTML čak će vam omogućiti da postavite atribute bez navodnika (fuj).

Također treba napomenuti da ako samo ispisujete gole nizove, možete isključiti php parser. Najbrži način da pošaljete niz je da ga napišete kao običan tekst, IZVAN php oznaka. Ovo će također učiniti da vaš kod izgleda izvrsno u mnogim isticačima sintakse.

Postoji nekoliko nedostataka u tome, ako ih ima. Izlazna memorija i dalje radi. Sve vaše klase i objekti i uključuje ostaju na mjestu. Vaša skripta radi brže. Svjetski mir je postignut.

Oni koji sebe smatraju profesionalnim PHP programerom. Korisnički priručnik pažljivo spominje ovu razliku, ali upućuje na članak treće strane; ona pak tvrdi da je eho brži, ali ne daje dokaze; teško je pronaći objektivnu usporedbu, a sve to daje problemu neku mističnu auru, na koju mnogi, mnogi ljudi padaju.

Zato nemojmo stajati po strani i pokušajmo jednom zauvijek riješiti ovu zagonetku!

Razlika u ponašanju između echo i print je ta da se potonji može ponašati kao funkcija (uvijek vraća jedan); kao rezultat toga, print se može koristiti u kontekstu, na primjer, ternarnog operatora, što ponekad može biti vrlo privlačno. Echo se ne može koristiti kao funkcija, ali može uzeti nekoliko argumenata odvojenih zarezima i ne mogu se staviti u zagrade; dok print ima točno jedan argument, a može biti unutar ili bez zagrada.

Međutim, u istom priručniku postoje podaci o tim razlikama, ali naš cilj je usporediti izvedbu i, ne bojim se te riječi, izvedbu ova dva jezična sklopa.

Za provođenje testova napravio sam postolje na kojem se 1000 redaka (svaki dug 32 znaka) prikazuje 1000 puta; koristi se jedna od pet metoda:

  1. ispis "$vrijednost
    ";
  2. echo "$vrijednost
    ";
  3. ispisati $vrijednost. "
    ";
  4. echo $vrijednost. "
    ";
  5. echo $vrijednost, "
    ";

Za svaku metodu testovi su provedeni 20 puta i svaki put je zabilježeno vrijeme. Distribucija rezultata za sve metode pokazala se normalnom, što nam omogućuje da uzmemo prosječnu vrijednost kao pokazatelj uspješnosti.

Dobivene su sljedeće vrijednosti:

  1. 1.727 s
  2. 1.727 s
  3. 1.462 s
  4. 1.428 s
  5. 1.321 s

Doista, vidimo to ispis može biti malo sporiji od odjeka(ili se možda neće pokazati kao što pokazuju rezultati za prve dvije metode). U isto vrijeme, korištenje echo-a s višestrukim parametrima umjesto ulančavanja (i jednostrukih navodnika umjesto dvostrukih navodnika) daje vrlo primjetan dobitak performansi.

Ali čekajte, je li to stvarno toliko vidljivo? Izračunajmo. Razlika između minimalnog i maksimalnog vremena je 406 ms na milijuna operacije. Odnosno, kako je sada moderno reći, 406 nanosekundi po operaciji.

Što nam to daje na ljestvici - pa, recimo, VKontakte? Prema LiveInternetu, dnevno se pogleda 500 milijuna stranica.

Koliko puta se poziva echo ili print za svaku stranicu? Moderne uspješne web stranice nužno pribjegavaju nekima visoka razina apstrahiranje logike iz prezentacije pomoću predložaka, MVC-a i drugih zastrašujućih riječi; Kao rezultat toga, operacija izlaza poziva se jednom po stranici ili, najviše, jednom za svaki semantički blok stranice. Pretpostavimo najgori mogući scenarij i procijenimo broj takvih blokova na 10. na jednoj stranici.

Lako je izračunati da će ušteda vremena poslužitelja biti, u najboljem slučaju, do 200 sekundi dnevno, odnosno 0,23 posto. Je li to puno ili malo? Odlučite sami. Samo prvo razmislite hoće li optimizacija jednog SQL upita ili predmemoriranje jedne datoteke donijeti nekoliko puta veće dobitke u izvedbi.

I reći ću vam koliko mi je trebalo da riješim ovaj problem:

  1. Pregled informacija u priručniku - 2 minute.
  2. Sastavljanje mjerila - 31 minuta.
    Niz probnih eksperimenata - 5 minuta.
    Korekcija tehnike i metodologije testiranja - 20 minuta.
    Izvođenje testova - 9 minuta.
    Obrada rezultata - 5 minuta.

PHP ima vitalne funkcije bez kojih programer jednostavno ne može. Pričat ćemo o print_r i malo o var_dump :)

Zašto su potrebni print_r i var_dump?

print_r najčešće se koristi za nizove, a glavni zadatak je otkriti koji su točno ključevi (ako se radi o asocijativnom nizu ili višedimenzionalnom s velikom razinom ugniježđenja) i vrijednosti u nizu. Napisano je na sljedeći način:

Na našim zaslonima pojavit će se sljedeći rezultat:

Niz ( => 1 => 2 => 3 => 4 => 5 => 6 => 7 => 8 => 9)

Unatoč svojoj jednostavnosti, ovaj niz je teško čitljiv, a kada bi se njegova struktura sastojala od nekoliko razina, bilo bi vrlo teško pronaći potrebne informacije. Srećom, postoji oznaka u HTML-u koja može pomoći u tome, the prije:

Jeka"

"; print_r($arg); echo "
";

Kao što možete vidjeti iz koda, print_r je napisano između pre oznaka, a kao rezultat vidimo sljedeću sliku:

Niz ( => 1 => 2 => 3 => 4 => 5 => 6 => 7 => 8 => 9)

Značajka oznake prije Još jedna stvar je da prikazuje sve razmake, ako navedete mnogo razmaka, oni se pišu kao jedan:
"Prema zadanim postavkama, bilo koji broj uzastopnih razmaka u kodu prikazuje se kao jedan na web stranici."
Odnosno, ovaj unos:

Bok, kako si?

Bok, kako si?

Za nizove, mislim da je print_r alat broj jedan :)

Zašto je potreban var_dump?

Za regularne varijable koje sadrže nizove, brojeve itd. Tamo je jednostavnih načina izlaz - jeka I ispisati. Ali ponekad to nije dovoljno, u PHP-u svaka vrijednost ima svoj tip. Postoji doista neugodna značajka: vrsta se može promijeniti, a unos:

Echo $a = 15 + "19";

Proizvodit će sljedeću vrijednost:

Iako smo prošli jedan broj i jedan niz. var_dump omogućuje vam da saznate kojem tipu podataka pripada vrijednost:

int je skraćenica za integer - cijeli broj. Nije ništa teže napisati od print_r:

Jeka"

"; var_dump($arg); echo "
";

Tip podataka je važna stvar, ali osobno ja print_r Koristim ga mnogo češće.

print_r i var_dump u 1C-Bitrixu

Bitrix ima datoteku koja se izvršava svaki put kada se stranica učita - init.php, a kako ne biste svaki put pisali puno koda, možete napisati 2 jednostavne funkcije:

"; print_r($arg); echo ""; ) funkcija vd($arg) ( echo "

"; var_dump($arg); echo "
"; }

Nakon snimanja, možete proslijediti varijablu, i što je najvažnije, niz. Unos za poziv bit će sljedeći.

Zadnji put smo razgovarali o toj temi s vama nizovi u php-u, a danas ćemo analizirati funkciju tzv print_r(). Ova je funkcija funkcija za otklanjanje pogrešaka i namijenjena nam je za pregled informacija o varijabli na prikladan način. Zašto sam se dotaknuo nizova na početku teme, a to je zato što je najbolje vidjeti nizove pomoću ove funkcije. Sada ćete vidjeti ovo.

$niz = niz( 5, 23, "Denis") ;
print_r($niz) ;
?>

Koristili smo niz iz prošle lekcije i primijenili ga na print_r funkcija. Ne vidim smisao prikazivanja rezultata izvršavanja ove funkcije, samo napišite ovaj kod i pogledajte rezultat u pregledniku. Tamo ćemo vidjeti ključnu riječ Niz, a indeksi i njihove vrijednosti bit će navedeni redom u zagradama. Na taj način možemo jednim retkom pregledati i najveće nizove. To je sve što sam vam htio reći o ovoj funkciji. Ovako je ispao današnji mali, lagani i što je najvažnije koristan članak. Vidimo se uskoro!

Radi udobnosti, napisao sam analognu funkciju print_r. Odmah ću vam pokazati kako se razlikuje:

UPD: dodano označavanje i stil za ispravan prikaz praznih nizova i objekata.

UPD: dodan prikaz broja podređenih elemenata niza ili svojstava objekta (broj desno od naziva ključa niza).

UPD: dodana mogućnost sažimanja podređenih nizova niza (kliknite na broj podređenih).

UPD: dodan prikaz datoteke i linije iz koje je funkcija pozvana.

UPD: Sada se parametri mogu proslijediti funkciji ne kao niz, već pojedinačno i bilo kojim redoslijedom.

Što funkcija može učiniti

  • prikaz skalarnih varijabli, nizova, objekata, resursa;
  • istaknite vrstu podataka bojom;
  • označite područje vidljivosti svojstava bojom;
  • Eksplicitno prikazati vrijednosti Boolean varijabli i NULL;
  • vrsta izvora prikaza;
  • automatski skrati duge linije;
  • prikazati niz u obliku stabla, s mogućnošću kolapsa čvorova (zbog čega je sve ovo pokrenuto);
  • prikazati stablo sažeto ili prošireno na određeni ključ;
  • prikazati datoteku i liniju iz koje je funkcija pozvana;
  • otkriti vrijeme proteklo između dva poziva funkcije;
  • traženje teksta u nizu ključeva i vrijednosti.

I ono najvažnije

Nema vanjskih ovisnosti!

Kako koristiti

Morate uključiti datoteku nf_pp.php

Uključi "nf_pp.php";

i možete koristiti

Pp($val);

Mogućnosti

Niz parametara može se proslijediti kao drugi argument funkciji.

Pp($val, array("trimString" => 0));

Dostupne su sljedeće opcije:

UPD: Umorio sam se od prosljeđivanja parametara funkciji u nizu i napravio sam tako da se mogu prosljeđivati ​​izravno ovako, i bilo kojim redoslijedom. Primjer:

Pp($val, 300, "ćirilica");

Pp($val, "Ćirilica", 0);

Pp($val, "ćirilica");

Parametri su određeni prema vrsti. Ako je proslijeđen broj, onda je to trimString, ako je proslijeđen Booleov parametar, tada je autoCollapsed; ako je niz ili polje, onda je autoOpen.

Primjeri korištenja

Samo ispišite niz

Pp($val);

Ispišite niz u sažetom obliku

Pp($val, array("autoCollapsed" => TRUE));

Ispiši niz proširen na tipke "c" i "podniz"

Pp($val, niz("autoOpen" => niz("c", "podniz")));

Ispiši polje prošireno na tipku “c”

Pp($val, array("autoOpen" => array("c")));

Pp($val, array("autoOpen" => "c"));



Učitavam...Učitavam...