Zamka u foreach ($items kao &$item). Opis strukture predloška com_content Primjer uređivanja predloška

Bez obzira koliko koristimo PHP, i dalje se pojavljuju neke funkcije za koje nikada nismo ni čuli. Neki od njih bi nam bili veoma korisni. Napravio sam malu listu korisnih funkcija koje bi trebale biti u arsenalu svakog PHP programera.

1. Kreiranje funkcija s promjenjivim brojem argumenata

Najvjerovatnije već znate da nam PHP omogućava kreiranje funkcija s opcionim argumentima. Sada ću pokazati funkciju u kojoj broj argumenata može varirati od slučaja do slučaja.

Ali prvo, sjetimo se kako kreiramo funkcije na uobičajeni način:

// funkcija sa dva opciona parametra function foo($arg1 = "", $arg2 = "") ( echo "arg1: $arg1\n"; echo "arg2: $arg2\n"; ) foo("zdravo", "svijet"); /* će ispisati: arg1: zdravo arg2: world */ foo(); /* će ispisati: arg1: arg2: */

Pogledajmo sada kako možete napisati funkciju s neograničenim brojem argumenata. Za ovo će se koristiti metoda func_get_args():

// ne specificiraj argumente funkciju foo() ( // vraća niz proslijeđenih argumenata $args = func_get_args(); foreach ($args kao $k => $v) ( echo "arg".($k+1) ." : $v\n"; ) ) foo(); /* neće dati ništa */ foo("hello"); /* će ispisati arg1: hello */ foo("zdravo", "svet", "ponovo"); /* će ispisati arg1: zdravo arg2: svijet arg3: ponovo */

2. Koristite Glob() za traženje datoteka

Često nazivi funkcija govore sami za sebe. Isto se ne može reći za funkciju glob().

Ne ulazeći previše u detalje, njegova funkcionalnost je slična metodi scandir(). Omogućava vam da pronađete potrebnu datoteku pomoću šablona:

// pronađi sve php datoteke $files = glob("*.php"); print_r($files); /* će ispisati: Niz ( => phptest.php => pi.php => post_output.php => test.php) */

Da biste pronašli fajlove nekoliko tipova potrebno je da napišete ovako:

// pronaći sve php i txt datoteke $files = glob("*.(php,txt)", GLOB_BRACE); print_r($files); /* izlaz: Niz ( => phptest.php => pi.php => post_output.php => test.php => log.txt => test.txt) */

Također možete odrediti putanju u predlošku:

$files = glob("../images/a*.jpg"); print_r($files); /* izlaz: Niz ( => ../images/apple.jpg => ../images/art.jpg) */

Da biste dobili punu putanju do dokumenta, koristite metodu realpath():

$files = glob("../images/a*.jpg"); // Primijeni funkciju "realpath" na svaki element niza $files = array_map("realpath",$files); print_r($files); /* će ispisati: Niz ( => C:\wamp\www\images\apple.jpg => C:\wamp\www\images\art.jpg) */

3. Informacije o korištenoj memoriji

Ako pratite količinu memorije koju troše vaše skripte, vjerovatno ćete ih češće optimizirati.

PHP ima moćan alat za praćenje memorije. Opterećenja mogu biti različita u različitim dijelovima skripte. Da bismo dobili vrijednost memorije koja se trenutno koristi, trebamo koristiti metodu memory_get_usage(). Da popravite maksimalnu količinu korištene memorije, koristite memory_get_peak_usage()

Echo "Inicijalno: ".memory_get_usage()." bajtova \n"; /* Početno: 361400 bajtova */ // daje malo opterećenje za ($i = 0; $i< 100000; $i++) { $array = md5($i); } // и ещё for ($i = 0; $i < 100000; $i++) { unset($array[$i]); } echo "Final: ".memory_get_usage()." bytes \n"; /* Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes \n"; /* Peak: 13687072 bytes */

4. Informacije o procesoru

Da biste to učinili, trebate koristiti metodu getrusage(). Ali imajte na umu da ova funkcija neće raditi na Windowsima.

Print_r(getrusage()); /* ispisuje niz ( => 0 => 0 => 2 => 3 => 12692 => 764 => 3864 => 94 => 0 => 1 => 67 => 4 => 0 => 0 => 0 => 6269 => 0) */

Gore navedena slika bit će jasna onima koji imaju iskustva u administraciji sistema. Za sve ostale nudimo transkript:

  • ru_oublock: broj operacija pisanja bloka
  • ru_inblock: broj operacija čitanja bloka
  • ru_msgsnd: broj poslanih poruka
  • ru_msgrcv: broj primljenih poruka
  • ru_maxrss: maksimalna veličina skupa bez stranica
  • ru_ixrss: ukupna količina dijeljene memorije
  • ru_idrss: ukupna količina nedijeljenih podataka
  • ru_minflt: broj korištenih memorijskih stranica
  • ru_majflt: broj stranica koje nedostaju
  • ru_nsignals: broj primljenih signala
  • ru_nvcsw: broj promjena konteksta od strane procesa
  • ru_nivcsw: broj prisilnih prebacivanja konteksta
  • ru_nswap: broj pristupa disku prilikom stranica
  • ru_utime.tv_usec: vrijeme rada u korisničkom modu (mikrosekunde)
  • ru_utime.tv_sec: vrijeme rada u korisničkom modu (sekunde)
  • ru_stime.tv_usec: vrijeme rada u privilegovanom modu (mikrosekunde)
  • ru_stime.tv_sec: vrijeme rada u privilegovanom modu (sekunde)

Da biste saznali koje resurse vašeg procesora koristi skripta, potrebna vam je vrijednost 'user time' (korisničko vrijeme) i 'system time' (vrijeme u privilegovanom režimu). Rezultat možete dobiti u sekundama i mikrosekundama. Da biste ukupan broj sekundi pretvorili u decimalni broj, trebate podijeliti vrijednost mikrosekundi sa 1 milion i vrijednosti dodati vrijednost u sekundama.

Malo je zbunjujuće. Evo primjera:

// odmor od 3 sekunde sleep(3); $data = getrusage(); echo "Vrijeme korisnika: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "Sistemsko vrijeme: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* ispisuje Korisničko vrijeme: 0.011552 Sistemsko vrijeme: 0 */

Iako je skripti trebalo oko 3 sekunde da se izvrši, procesor nije bio jako opterećen. Činjenica je da kada se pozove (sleep), skripta praktično ne troši resurse procesora. Općenito, postoji mnogo zadataka koji oduzimaju značajno vrijeme, ali ne koriste procesor. Na primjer, čekanje na operacije vezane za disk. Dakle, ne koristite uvijek CPU vrijeme u svojim skriptama.

Evo još jednog primjera:

// hodaj 10 miliona puta for($i=0;$i zdravo => 42 => Niz ( => 1 => dva) => jabuka) */

Ovako funkcioniraju ove funkcije. Međutim, zbog brzog rasta popularnosti JSON-a, 2 metode json_encode() i json_decode() dodane su u PHP 5.2. Njihov rad je sličan serialize():

// složeni niz $myvar = array("hello", 42, array(1,"two"), "apple"); // pretvoriti u string $string = json_encode($myvar); echo $string; /* će ispisati ["hello",42,,"apple"] */ // vratiti originalnu vrijednost $newvar = json_decode($string); print_r($newvar); /* ispisuje niz ( => zdravo => 42 => niz ( => 1 => dva) => jabuka) */

Ova opcija je kompaktnija i kompatibilnija s drugim jezicima kao što je JavaScript. Međutim, kada radite s vrlo složenim objektima, može doći do gubitka podataka.

8. String compression

Kada govorimo o kompresiji, odmah vam na pamet padaju arhivske datoteke u ZIP formatu. PHP pruža mogućnost komprimiranja dugih stringova bez ikakvih datoteka.

Sljedeći primjer pokazuje kako funkcioniraju funkcije gzcompress() i gzuncompress():

$string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium orci, non ultriciesquim elit, non ultriciesquim e , consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. Sed non mi metus, at lacinia augue. Sed magna nisi, ornare in mollis in, mollis sed nunc. Etiam at justo in leo congue mollis. Nullam in neque eget metus hendrerit scelerisque eu non enim. Ut malesuada lacus eubendum null sodales ."; $compressed = gzcompress($string); echo "Originalna veličina: ". strlen($string)."\n"; /* će ispisati Originalna veličina: 800 */ echo "Kompresovana veličina: ". strlen($komprimirano)."\n"; /* će ispisati komprimiranu veličinu: 418 */ // vraćanje $original = gzuncompress($compressed);

Možemo smanjiti volumen teksta za 50%. Za iste svrhe možete koristiti metode gzencode() i gzdecode(), koje koriste drugačiji algoritam kompresije.

9. Izvršite prije izlaska

PHP ima funkciju register_shutdown_function() koja će vam omogućiti da izvršite neki kod prije isključivanja skripte.

Recimo da želite saznati neke informacije... Vrijeme izvođenja skripte:

// dobijemo vrijeme početka $start_time = microtime(true); // neke operacije // ... // prikaz vremena rada echo "izvršenje je trajalo: ". (mikrovrijeme(true) - $start_time). "sekunde.";

Na prvi pogled ovo može izgledati kao trivijalan zadatak. U ove svrhe, možete postaviti kod na kraj datoteke. Međutim, ako se funkcija exit() pokrene negdje prije ovoga, ovaj kod nikada neće raditi. Takođe, neće raditi ako postoji greška na stranici ili korisnik prekine učitavanje stranice (klikom na odgovarajuće dugme u svom pretraživaču);

Kada koristite metodu register_shutdown_function(), kod će se u svakom slučaju izvršiti:

$start_time = microtime(true); register_shutdown_function("my_shutdown"); funkcija my_shutdown() ( globalno $start_time; echo "izvršenje je trajalo: ". (microtime(true) - $start_time). " sekundi."; )

Zaključak

PHP je čitava planeta koja ne prestaje da nas oduševljava svojim sadržajem. Šta mislite o ovim funkcijama?

Kreirate i promovirate web stranicu na kojoj se pokreće CMS Joomla i odjednom imate potrebu da prepravite dizajn materijala po svom ukusu i na svoj način uređivanjem standardnih šablona komponente com_content? Komponenta je odgovorna za generiranje sadržaja. Hajde da razumemo strukturu same komponente.

Lokacija standardnog predloška materijala

Originalne datoteke komponente com_content nalaze se u folderu components\com_content\views\View\tmpl. Ako se datoteke komponente kopiraju u direktorij \templates\template koji koristite\html\com_content\, tada će predložak materijala biti preuzet iz datoteka u ovoj mapi.

Direktoriji i datoteke šablona

Direktorij lokacije šablona sadrži pet foldera za kreiranje pogleda.

arhivski folder

  • Arhivirajte izlaznu mapu šablona. O ovom članku se ne raspravlja, rijetko tko ga koristi. Struktura je slična fasciklama opisanim u nastavku;

fascikla sa artiklima - Materijal

fascikla naslovne strane - Početna stranica

  • default.php Isti princip kao kategorija\blog.php;
  • default_item.php Isti princip kao kategorija\blog_item.php;
  • default_links.php Isti princip kao kategorija\blog_links.php;

folder odjeljak - odjeljak

  • blog.php Predložak bloga odjeljka. Isti princip kao kategorija\blog.php;
  • blog_item.phpŠablon za poseban materijal iz sekcije blog. Isti princip kao kategorija\blog_item.php;
  • blog_links.phpŠablon za predstavljanje linkova u sekciji blog. Isti princip kao kategorija\blog_links.php;
  • default.php Standardni šablon sekcije. Prikazuje naslov kategorije, njen opis i broj elemenata. Nakon klika na naslov kategorije, stranica se obrađuje od strane category\default.php;
Primjer uređivanja šablona. Prikazuje broj pregleda materijala.

Recimo da želimo prikazati broj pogodaka pojedinačnog članka sa bloga kategorije. Da biste to učinili, uredite predložak category\blog_item.php. Kod za umetanje informacija o pogocima će biti ovakav:

Sada morate pronaći mjesto u datoteci predloška category\blog_item.php gdje ćete umetnuti ovaj kod. Na primjer, prije prikaza datuma kada je materijal posljednji put uređen. Tražimo liniju:

I prije toga ubacujemo red sa kodom.

Primjer prikazivanje liste kategorija u nekoliko kolona .

Mnoge fatalne i nadoknadive fatalne greške su konvertovane u izuzetke u PHP-u 7. Ovi izuzeci greške nasleđuju klasu Error, koja sama implementira Throwable interfejs (novi osnovni interfejs nasleđuju svi izuzeci).

To znači da se prilagođeni rukovaoci greškama više ne mogu pokretati jer se umjesto toga mogu izbacivati ​​izuzeci (izazivajući nove fatalne greške za neuhvaćene izuzetke Error).

Potpuni opis kako greške funkcionišu u PHP 7 može se naći na stranici o greškama PHP 7. Ovaj vodič za migraciju će samo nabrojati promjene koje utiču na kompatibilnost unatrag.

Interni konstruktori uvijek izbacuju izuzetke u slučaju neuspjeha

Ranije su neke interne klase vraćale NULL ili neupotrebljiv objekat kada konstruktor nije uspio. Sve interne klase će u ovom slučaju sada izbaciti izuzetak na isti način na koji su već morale biti korisničke klase.

E_STRICT primjećuje promjene ozbiljnosti

Sva E_STRICT obavještenja su reklasificirana na druge nivoe. E_STRICT konstanta je zadržana, tako da se poziva kao error_reporting(E_ALL|E_STRICT) neće uzrokovati grešku.

E_STRICT primjećuje promjene ozbiljnosti Situacija Novi nivo/ponašanje
Indeksiranje po resursu E_NOTICE
Apstraktne statičke metode
"Redefinisanje" konstruktora Obavijest je uklonjena, nema greške
Nepodudaranje potpisa tokom nasljeđivanja E_UPOZORENJE
Isto (kompatibilno) svojstvo u dvije korištene osobine Obavijest je uklonjena, nema greške
Pristup statičkom svojstvu nestatičan E_NOTICE
Samo varijable treba dodijeliti referencom E_NOTICE
Samo varijable treba proslijediti referencom E_NOTICE
Pozivanje nestatičkih metoda statički E_DEPRECATED
Promjene u rukovanju varijablama

PHP 7 sada koristi stablo apstraktne sintakse kada analizira izvorne datoteke. Ovo je omogućilo mnoga poboljšanja jezika koja su ranije bila nemoguća zbog ograničenja u parseru koji se koristio u ranijim verzijama PHP-a, ali je rezultiralo uklanjanjem nekoliko posebnih slučajeva iz razloga konzistentnosti, što je rezultiralo prekidima kompatibilnosti unatrag. Ovi slučajevi su detaljno opisani u ovom odjeljku.

Promjene u rukovanju indirektnim varijablama, svojstvima i metodama

Indirektni pristup varijablama, svojstvima i metodama će se sada procjenjivati ​​striktno slijeva nadesno, za razliku od prethodne kombinacije posebnih slučajeva. Donja tabela pokazuje kako se promijenio redoslijed evaluacije.

Staro i novo vrednovanje indirektnih izraza Izraz PHP 5 interpretacija PHP 7 interpretacija
$$foo["bar"]["baz"] $($foo["bar"]["baz"]) ($$foo)["bar"]["baz"]
$foo->$bar["baz"] $foo->($bar["baz"]) ($foo->$bar)["baz"]
$foo->$bar["baz"]() $foo->($bar["baz"])() ($foo->$bar)["baz"]()
Foo::$bar["baz"]() Foo::($bar["baz"])() (Foo::$bar)["baz"]()

Kod koji je koristio stari redoslijed evaluacije zdesna nalijevo mora biti prepisan da eksplicitno koristi taj redoslijed evaluacije sa vitičastim zagradama (pogledajte gornji srednji stupac). Ovo će učiniti kod i unapred kompatibilnim sa PHP 7.x i unazad kompatibilnim sa PHP 5.x.

Fatalna greška: Uncaught ArithmeticError: Pomak bita za negativan broj u /tmp/test.php:2 Trag steka: #0 (glavni) bačen u /tmp/test.php na liniji 2

Izvan opsega bitshifts

Bitovi pomaci (u bilo kojem smjeru) iznad širine bita cijelog broja uvijek će rezultirati 0. Ranije je ponašanje takvih pomaka ovisilo o arhitekturi.

Promjene u dijeljenju na nulu

Ranije, kada se 0 koristio kao djelitelj za operatore podjele (/) ili modula (%), emitiralo bi se E_WARNING i vraćalo bi se false. Sada, operator dijeljenja vraća float kao +INF, -INF ili NAN, kao što je navedeno u IEEE 754. Operator modula E_WARNING je uklonjen i izbacit će izuzetak DivisionByZeroError.

Izlaz gornjeg primjera u PHP 5:

Upozorenje: Podjela nulom u %s na liniji %d bool(false) Upozorenje: Podjela nulom u %s na liniji %d bool(false) Upozorenje: Podjela nulom u %s na liniji %d bool(false)

Izlaz gornjeg primjera u PHP 7:

Upozorenje: Podjela nulom u %s na liniji %d float(INF) Upozorenje: Podjela nulom u %s na liniji %d float(NAN) PHP Fatalna greška: Neuhvaćena DivisionByZeroError: Modulo sa nulom u %s redu %d

\u( može uzrokovati greške

Zbog dodavanja nove Unicode sintakse escape kodne točke, nizovi koji sadrže literal \u( nakon čega slijedi nevažeći niz će uzrokovati fatalnu grešku. Da bi se to izbjeglo, vodeću obrnutu kosu crtu treba izbjeći.

Uklonjene funkcije Uklonjene INI direktive xsl.security_prefs

Direktiva xsl.security_prefs je uklonjena. Umjesto toga, metodu XsltProcessor::setSecurityPrefs() treba pozvati da kontroliše sigurnosne postavke na bazi po procesoru.

Druge unatrag nekompatibilne promjene Novi objekti se ne mogu dodijeliti referencom

Rezultat od novo izraz se više ne može dodijeliti varijabli referencom:

Izlaz gornjeg primjera u PHP 5:

Zastarjelo: Dodjela povratne vrijednosti new referencom je zastarjela u /tmp/test.php na liniji 3

Izlaz gornjeg primjera u PHP 7:

Greška raščlanjivanja: sintaksička greška, neočekivano "novo" (T_NEW) u /tmp/test.php na liniji 3

Nevažeći nazivi klasa, interfejsa i osobina

Sljedeća imena se ne mogu koristiti za imenovanje klasa, interfejsa ili osobina:

  • bool
  • int
  • float
  • string
  • NULL
  • ISTINITO
  • FALSE

Nadalje, sljedeća imena se ne smiju koristiti. Iako neće generisati grešku u PHP 7.0, oni su rezervisani za buduću upotrebu i treba ih smatrati zastarelim.

  • objekt
  • mješovito
  • numeric
ASP i skript PHP oznake su uklonjene

Podrška za korištenje ASP i skript oznaka za razgraničenje PHP koda je uklonjena. Pogođene oznake su:

Uklonjene ASP i skript oznake Oznaka za otvaranje Oznaka za zatvaranje
Uklonjeni su pozivi iz nekompatibilnog konteksta

Prethodno zastareo u PHP 5.6, statički pozivi upućeni nestatičkoj metodi sa nekompatibilnim kontekstom sada će rezultirati da pozvana metoda ima nedefinisan $ovo varijabla i izdaje se upozorenje o zastarjelosti.

Izlaz gornjeg primjera u PHP 5.6:

Zastarelo: Nestatička metoda A::test() ne bi trebalo da se poziva statički, pod pretpostavkom da je $this iz nekompatibilnog konteksta u /tmp/test.php na liniji 8 object(B)#1 (0) ( )

Izlaz gornjeg primjera u PHP 7:

Zastarelo: Nestatička metoda A::test() ne treba da se poziva statički u /tmp/test.php na liniji 8 Napomena: Nedefinisana varijabla: ovo u /tmp/test.php na liniji 3 NULL

yield je sada desni asocijativni operator

Konstrukcija prinosa više ne zahtijeva zagrade i promijenjena je u desni asocijativni operator s prioritetom između print i => . Ovo može rezultirati promijenjenim ponašanjem:

Zagrade se mogu koristiti za razjašnjavanje tih slučajeva.

Funkcije ne mogu imati više parametara s istim imenom

Više nije moguće definirati dva ili više parametara funkcije s istim imenom. Na primjer, sljedeća funkcija će pokrenuti E_COMPILE_ERROR :

Funkcije koje provjeravaju argumente prijavljuju struja vrijednost parametra

func_get_arg() , func_get_args() , debug_backtrace() i povratni tragovi izuzetaka više neće izvještavati o originalnoj vrijednosti koja je proslijeđena parametru, već će umjesto toga pružiti trenutnu vrijednost (koja je možda bila izmijenjena).

Izlaz gornjeg primjera u PHP 5:

Izlaz gornjeg primjera u PHP 7:

Switch izrazi ne mogu imati više zadanih blokova

Više nije moguće definirati dva ili više zadanih blokova u naredbi switch. Na primjer, sljedeća naredba switch će pokrenuti E_COMPILE_ERROR :

JSON je zamijenio ekstenziju sa JSOND

JSON ekstenzija je zamijenjena sa JSOND, uzrokujući tri manja BC prekida. Prvo, broj se ne smije završavati decimalnim zarezom (tj. 34. mora se promijeniti u bilo koje 34.0 ili 34 ). Drugo, kada se koristi naučna notacija, e eksponent ne smije odmah iza decimalnog zareza (tj. 3.e3 mora se promijeniti u bilo koje 3.0e3 ili 3e3). Konačno, prazan string se više ne smatra važećim JSON-om.

Interni kvar funkcije na prelivu

Ranije su interne funkcije tiho skraćivale brojeve proizvedene iz prisiljavanja s plutajućim na cijeli broj kada je float bio prevelik da bi se mogao predstaviti kao cijeli broj. Sada će se emitovati E_WARNING i NULL će biti vraćeno.

Ispravci povratnih vrijednosti prilagođenog rukovatelja sesije

Bilo koje funkcije predikata implementirane od strane prilagođenih rukovatelja sesije koje vraćaju ili FALSE ili -1 biće fatalne greške. Ako bilo koja vrijednost iz ovih funkcija nije boolean, -1 , ili 0 je vraćen, onda neće uspjeti i bit će emitirano E_WARNING.

Poredaj jednake elemente

Unaprijeđen je interni algoritam sortiranja, što može rezultirati drugačijim redoslijedom elemenata koji se porede kao jednaki nego ranije.

Nemojte se oslanjati na redoslijed elemenata koji se upoređuju kao jednaki; on se može promijeniti bilo kada.

Pogrešne izjave break i switch

break i nastaviti izjave izvan petlje ili prekidač kontrolne strukture su sada otkrivene u vrijeme kompajliranja umjesto u vrijeme izvođenja kao prije, i pokreću E_COMPILE_ERROR.

Vidi nehotice... Rečnik ruskih sinonima i izraza sličnih po značenju. ispod. ed. N. Abramova, M.: Ruski rječnici, 1999. nesvjesno instinktivno, nesvjesno, spontano, panično, instinktivno, nesvjesno, nesvjesno,... ... Rječnik sinonima

Neobjašnjivo, instinktivno, mehanički, spontano, slepo. Vidi... Rječnik sinonima

Nehotice, nesvesno, nesvesno, instinktivno, mehanički, mehanički, slepo, spontano; slučajno, nenamjerno; htio-ne htio, sviđalo se to tebi ili ne (volens nolens), iz nužde je morao to učiniti zbog stvari koje su van njegove kontrole... ... Rječnik sinonima

Slepo, podsvesno, crevo, ne shvaćajući, ne znajući, spontano, nesvesno, ne shvatajući, nesvesno, mehanički, nesvesno, nesvesno, intuitivno, nesvesno, šesto čulo, instinktivno Rečnik ruskog... ... Rečnik sinonima

Vidi nehotice... Rečnik ruskih sinonima i izraza sličnih po značenju. ispod. ed. N. Abramova, M.: Ruski rječnici, 1999. slijepo, nesvjesno, nehotice; nerazgovjetno, nepromišljeno, neuračunljivo, spontano, instinktivno, ropski, nesvjesno, nejasno,... ... Rječnik sinonima

adv. do neuračunljivog. [Majka] je htela da se vrati, ali je nesvesno ponovo krenula napred. M. Gorki, majka. [Juda] je molio svoju dobru prijateljicu mamu da upravlja njegovim imanjem na neodgovoran način. Saltykov Shchedrin, gospoda Golovlevs ... Mali akademski rječnik

NEODGOVORNO, neuračunljivo, neuračunljivo; (kratko muški rod se ne koristi) neuračunljiv, neuračunljiv. 1. Ne podliježe nikakvoj kontroli, nije obavezan izvještavati. Neodgovorno (adv.) je bio zadužen za radnju. 2. Ne zavisi od razumnih razmatranja,... ... Ušakovljev objašnjavajući rečnik

- (grčki). Lice kome je povereno da neuračunljivo trguje za račun drugog lica. Rječnik stranih riječi uključenih u ruski jezik. Čudinov A.N., 1910. ANAGALISTA Osoba kojoj je povjerena trgovina na račun druge osobe bez odgovornosti. Objašnjenje... ... Rječnik stranih riječi ruskog jezika

Neuračunljivo, nesvesno, mehanički, nehotice, automatski, mehanički, automatski, mehanički, autopilot Rečnik ruskih sinonima. automatski vidi Rečnik sinonima ruskog jezika. Praktični vodič. M.: Ruski... Rječnik sinonima

Vidi nehotice... Rečnik ruskih sinonima i izraza sličnih po značenju. ispod. ed. N. Abramova, M.: Ruski rječnici, 1999. instinktivno, nesvjesno, nehotice; nehotice, nesvjesno, crijevo, spontano, spontano, nesvjesno, slijepo,... ... Rječnik sinonima

Knjige
  • Putovanje po Čehoslovačkoj, J. Marko, M. Peterka, Prag, 1959. Artia. Sa mnogo foto ilustracija. Izdavački uvez. Stanje je dobro. Začarani lutalica iz bilo koje zemlje svijeta, zadubivši se u ovu divnu knjigu, moći će... Kategorija: Bilješke putnika, memoari, istraživanja Izdavač: Artia,
  • Odbor, ili Sastanci na Senoj, Genadij Grigorijev, Sergej Nosov, U Sankt Peterburgu postoje jednostavno fantazmogenična mesta. To uključuje trg Sennaya. "Sennaya - kolevka fantazmagorije". Čini se da su i sami autori iznenađeni onim što im se dogodilo na Sennaya. I... Kategorija: Klasična i moderna proza ​​Serija: Lica Sankt Peterburga našeg vremena Izdavač:

Mnogi ljudi vole pisati takve konstrukcije u ovom ili onom obliku, svi su naišli:
foreach ($items kao &$item) ($item += 2; )
Ali malo ljudi sumnja u opasnost koja ovdje vreba.
Pogledajmo primjer.

Vasya Pupkin je uzeo niz, prošao kroz njega, povećavajući sve elemente za dva:
$items = array("a" => 10, "b" => 20, "c" => 30,); foreach ($items kao &$item) ($item += 2; ) print_r($items);
Pogledao sam deponiju, video da je problem rešen i otišao zadovoljan:
Niz ([a] => 12 [b] => 22 [c] => 32)
Nakon nekog vremena, Petrovich je odlučio da ovaj dio koda dopuni još jednom pretragom, dodajući ispod:
$newitems = array("a" => 10, "b" => 20, "c" => 30,); foreach ($newitems kao $key=>$item) ( $newitems[$key] += 5; ) print_r($newitems);
Vidio je da je i njegov zadatak riješen i s osjećajem izvršenja zatvorio je dosije:
Niz ([a] => 15 [b] => 25 [c] => 35)
Nakon nekog vremena počele su se pojavljivati ​​neobjašnjive greške. Zašto?
Uradimo var_dump($items) na kraju koda:
niz(3) ( ["a"]=> int(12) ["b"]=> int(22) ["c"]=> &int(30) )
trideset! Vasja Pupkin se kune da je provjerio. Zašto je bilo 32, a nakon Petrovičevog koda 30?

Razlog leži u ampersandu. Izvještava da se neko drugi poziva na označene podatke. Prilikom odlaska Vasya nije obrisao za sobom privremenu varijablu koju je koristio za brutalnu silu ($item). Varijabla je korištena s dozvolom za promjenu izvora ("&"), koja se naziva i "dodjela po referenci". Bio je siguran da će se varijabla koristiti samo unutar petlje. Petrović je, koristeći promenljivu sa istim imenom, tokom svoje pretrage menjao njenu vrednost i svaki put se menjalo mesto gde je ova varijabla pohranjena. I bio je pohranjen na istom mjestu kao i posljednji element Pupkin niza.

Naravno, slučaj u članku je preuveličan. U praksi, takve veze mogu biti vrlo složene, posebno ako je projekat jeftin i uključuje nedovoljno iskusne i disperzirane web programere.

Kako se možete nositi sa ovim?

  • Uništiti privremene varijable nakon upotrebe, posebno ako imaju neku vezu s podacima koji se koriste:
    foreach ($items kao &$item) $item += 2; unset($item);
  • Budite oprezni s varijablama koje je neko već koristio.
  • Inkapsulirajte svoje akcije u zasebne funkcije, metode ili prostore imena.
  • Koristite var_dump umjesto print_r i obratite pažnju na ampersand. Za dump u datoteku, a ne u pretraživač, alternativa print_r($var,true) bi bila ova konstrukcija:
    funkcija dump() ( ob_start(); foreach(func_get_args() kao $var) var_dump($var); return ob_get_clean(); )
U zaključku, reći ću da se greške u vezi sa linkovima mogu pojaviti ne samo u foreach-u. I o svima se raspravljalo u nekom trenutku. Međutim, sudeći po mom iskustvu, ovaj slučaj je toliko čest u praksi da zaslužuje posebnu pažnju.
mob_info