Popis struktury šablony com_content. Pitfall in foreach($items as &$item) Informace o použité paměti


Bez ohledu na to, jak moc PHP používáme, stále se objevují některé funkce, o kterých jsme nikdy ani neslyšeli. Některé z nich by nám byly velmi užitečné. Vytvořil jsem malý seznam užitečných funkcí, které by měl mít ve svém arzenálu každý PHP programátor.

1. Vytváření funkcí s proměnným počtem argumentů

S největší pravděpodobností již víte, že PHP nám umožňuje vytvářet funkce s volitelnými argumenty. Nyní ukážu funkci, ve které se počet argumentů může případ od případu lišit.

Nejprve si však připomeňme, jak vytváříme funkce obvyklým způsobem:

// funkce se dvěma volitelnými parametry function foo($arg1 = "", $arg2 = "") ( echo "arg1: $arg1\n"; echo "arg2: $arg2\n"; ) foo("ahoj", "svět"); /* vypíše: arg1: ahoj arg2: svět */ foo(); /* vypíše: arg1: arg2: */

Nyní se podíváme na to, jak můžete napsat funkci s neomezeným počtem argumentů. K tomu se použije metoda func_get_args():

// neuvádějte argumenty function foo() ( // vrací pole předávaných argumentů $args = func_get_args(); foreach ($args jako $k => $v) ( echo "arg".($k+1) ." : $v\n"; ) ) foo(); /* nic nevypíše */ foo("ahoj"); /* vypíše arg1: ahoj */ foo("ahoj", "svět", "znovu"); /* vytiskne arg1: ahoj arg2: svět arg3: znovu */

2. Pomocí Glob() vyhledejte soubory

Názvy funkcí často mluví samy za sebe. Totéž nelze říci o funkci glob().

Aniž bychom zacházeli do přílišných podrobností, její funkčnost je podobná metodě scandir(). Umožňuje vám najít požadovaný soubor pomocí šablony:

// najít všechny php soubory $files = glob("*.php"); print_r($soubory); /* vypíše: Array ( => phptest.php => pi.php => post_output.php => test.php) */

Chcete-li najít soubory několika typů, musíte psát takto:

// najít všechny soubory php a txt $files = glob("*.(php,txt)", GLOB_BRACE); print_r($soubory); /* výstup: Array ( => phptest.php => pi.php => post_output.php => test.php => log.txt => test.txt) */

Můžete také zadat cestu v šabloně:

$files = glob("../images/a*.jpg"); print_r($soubory); /* výstup: Array ( => ../images/apple.jpg => ../images/art.jpg) */

Chcete-li získat úplnou cestu k dokumentu, použijte metodu realpath():

$files = glob("../images/a*.jpg"); // Aplikujte funkci "realpath" na každý prvek pole $files = array_map("realpath",$files); print_r($soubory); /* vypíše: Array ( => C:\wamp\www\images\apple.jpg => C:\wamp\www\images\art.jpg) */

3. Informace o použité paměti

Pokud budete sledovat množství paměti spotřebované vašimi skripty, budete je pravděpodobně častěji optimalizovat.

PHP má výkonný nástroj pro sledování paměti. Zatížení se může v různých částech skriptu lišit. K získání aktuálně používané hodnoty paměti bychom měli použít metodu memory_get_usage(). Chcete-li opravit maximální množství použité paměti, použijte memory_get_peak_usage()

Echo "Initial: ".memory_get_usage()." bajtů \n"; /* Počáteční: 361400 bajtů */ // poskytuje malé zatížení pro ($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. Informace o procesoru

Chcete-li to provést, musíte použít metodu getrusage(). Mějte však na paměti, že tato funkce nebude fungovat ve Windows.

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

Výše nastíněný obrázek bude jasný těm, kteří mají zkušenosti se správou systému. Pro všechny ostatní nabízíme přepis:

  • ru_oublock: počet operací zápisu do bloku
  • ru_inblock: počet operací čtení bloku
  • ru_msgsnd: počet odeslaných zpráv
  • ru_msgrcv: počet přijatých zpráv
  • ru_maxrss: maximální velikost nestránkované sady
  • ru_ixrss: celkové množství sdílené paměti
  • ru_idrss: celkový objem nesdílených dat
  • ru_minflt: počet použitých stránek paměti
  • ru_majflt: počet chyb chybějících na stránce
  • ru_nsignals: počet přijatých signálů
  • ru_nvcsw: počet přepnutí kontextu procesem
  • ru_nivcsw: počet vynucených přepnutí kontextu
  • ru_nswap: počet přístupů na disk při stránkování
  • ru_utime.tv_usec: provozní doba v uživatelském režimu (mikrosekundy)
  • ru_utime.tv_sec: doba provozu v uživatelském režimu (sekundy)
  • ru_stime.tv_usec: provozní doba v privilegovaném režimu (mikrosekundy)
  • ru_stime.tv_sec: provozní doba v privilegovaném režimu (sekundy)

Abyste zjistili, jaké zdroje vašeho procesoru skript využívá, potřebujete hodnotu 'čas uživatele' (čas uživatele) a 'systémový čas' (čas privilegovaného režimu). Výsledek můžete získat v sekundách i mikrosekundách. Chcete-li převést celkový počet sekund na desetinné číslo, musíte vydělit hodnotu mikrosekund 1 milionem a přidat hodnotu sekund k hodnotě.

Je to trochu matoucí. Zde je příklad:

// odpočinek na 3 sekundy spánek(3); $data = getrusage(); echo "Čas uživatele: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "Systémový čas: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* vytiskne Čas uživatele: 0,011552 Systémový čas: 0 */

Přestože spuštění skriptu trvalo asi 3 sekundy, procesor nebyl příliš zatížen. Faktem je, že při volání (spánku) skript nespotřebovává prakticky žádné zdroje procesoru. Obecně existuje mnoho úloh, které zaberou značné množství času, ale nevyužívají procesor. Například čekání na operace související s diskem. Ne vždy tedy ve skriptech využíváte čas CPU.

Zde je další příklad:

// chůze 10 milionůkrát pro ($i=0;$i ahoj => 42 => Array ( => 1 => dvě) => jablko) */

Takto fungují tyto funkce. Kvůli rychlému růstu popularity JSON však byly do PHP 5.2 přidány 2 metody json_encode() a json_decode(). Jejich práce je podobná serialize():

// komplexní pole $myvar = array("ahoj", 42, array(1,"dva"), "jablko"); // převod na řetězec $string = json_encode($myvar); echo $string; /* vypíše ["hello",42,,"apple"] */ // obnoví původní hodnotu $newvar = json_decode($string); print_r($newvar); /* vytiskne pole ( => ahoj => 42 => pole ( => 1 => dva) => jablko) */

Tato možnost je kompaktnější a kompatibilní s jinými jazyky, jako je JavaScript. Při práci s velmi složitými objekty však může dojít ke ztrátě dat.

8. Komprese strun

Když mluvíme o kompresi, okamžitě se vybaví archivní soubory ve formátu ZIP. PHP poskytuje možnost komprimovat dlouhé řetězce bez jakýchkoli souborů.

Následující příklad ukazuje, jak fungují funkce gzcompress() a 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 ultricies a situace elite do lacus. , consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. piscing. 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 eu nulduidna bibenduism sodales."; $compressed = gzcompress($string); echo "Původní velikost: ". strlen($string)."\n"; /* vypíše Původní velikost: 800 */ echo "Komprimovaná velikost: ". strlen($compressed)."\n"; /* vypíše komprimovaná velikost: 418 */ // return $original = gzuncompress($compressed);

Můžeme snížit objem textu o 50%. Pro stejné účely můžete použít metody gzencode() a gzdecode(), které používají jiný kompresní algoritmus.

9. Proveďte před ukončením

PHP má funkci register_shutdown_function(), která vám umožní spustit nějaký kód před vypnutím skriptu.

Řekněme, že chcete zjistit nějaké informace... Doba běhu skriptu:

// zjistěte čas začátku $start_time = microtime(true); // některé operace // ... // zobrazí echo doby běhu "provedení trvalo: ". (microtime(true) - $start_time). "sekundy.";

Na první pohled se to může zdát jako triviální úkol. Pro tyto účely můžete kód umístit na konec souboru. Pokud se však funkce exit() spustí někde před tímto, tento kód nebude nikdy fungovat. Rovněž nebude fungovat, pokud je na stránce chyba nebo uživatel přeruší načítání stránky (kliknutím na odpovídající tlačítko ve svém prohlížeči);

Při použití metody register_shutdown_function() bude kód v každém případě proveden:

$start_time = microtime(true); register_shutdown_function("my_shutdown"); funkce my_shutdown() ( global $start_time; echo "provedení trvalo: ". (microtime(true) - $start_time). "seconds."; )

Závěr

PHP je celá planeta, která nás nepřestává udivovat svým obsahem. Co si myslíte o těchto funkcích?

Mnoho fatálních a obnovitelných fatálních chyb bylo v PHP 7 převedeno na výjimky. Tyto výjimky z chyb dědí z třídy Error, která sama implementuje rozhraní Throwable (nové základní rozhraní dědí všechny výjimky).

To znamená, že vlastní obslužné rutiny chyb již nemusí být spouštěny, protože místo nich mohou být vyvolány výjimky (způsobující nové závažné chyby pro nezachycené výjimky Error).

Úplný popis fungování chyb v PHP 7 lze nalézt na stránce chyb PHP 7. Tento průvodce migrací pouze vyjmenuje změny, které ovlivňují zpětnou kompatibilitu.

Interní konstruktéři vždy vyvolávají výjimky při selhání

Dříve některé interní třídy vracely NULL nebo nepoužitelný objekt, když konstruktor selhal. Všechny interní třídy nyní v tomto případě vygenerují výjimku stejným způsobem, jako to již musely uživatelské třídy.

E_STRICT zaznamená změny závažnosti

Všechna oznámení E_STRICT byla překlasifikována na jiné úrovně. Konstanta E_STRICT je zachována, takže volání jako error_reporting(E_ALL|E_STRICT) nezpůsobí chybu.

E_STRICT zaznamená změny závažnosti Situace Nová úroveň/chování
Indexování podle zdroje E_NOTICE
Abstraktní statické metody
"Předefinování" konstruktoru Upozornění odstraněno, nespustí žádnou chybu
Neshoda podpisů během dědění E_VAROVÁNÍ
Stejná (kompatibilní) vlastnost ve dvou použitých vlastnostech Upozornění odstraněno, nespustí žádnou chybu
Přístup ke statické vlastnosti nestaticky E_NOTICE
Pouze proměnné by měly být přiřazeny odkazem E_NOTICE
Pouze proměnné by měly být předány odkazem E_NOTICE
Volání nestatických metod staticky E_DEPRECATED
Změny v manipulaci s proměnnými

PHP 7 nyní při analýze zdrojových souborů používá abstraktní strom syntaxe. To umožnilo mnoho vylepšení jazyka, která byla dříve nemožná kvůli omezením v parseru používaném v dřívějších verzích PHP, ale vedlo to k odstranění několika speciálních případů z důvodů konzistence, což vedlo k přerušením zpětné kompatibility. Tyto případy jsou podrobně popsány v této části.

Změny ve zpracování nepřímých proměnných, vlastností a metod

Nepřímý přístup k proměnným, vlastnostem a metodám bude nyní hodnocen přísně v pořadí zleva doprava, na rozdíl od předchozí směsi speciálních případů. Níže uvedená tabulka ukazuje, jak se změnilo pořadí hodnocení.

Staré a nové hodnocení nepřímých výrazů Výraz PHP 5 interpretace PHP 7 interpretace
$$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"]()

Kód, který používal staré pořadí hodnocení zprava doleva, musí být přepsán tak, aby explicitně používal toto pořadí hodnocení se složenými závorkami (viz prostřední sloupec výše). Díky tomu bude kód jak dopředně kompatibilní s PHP 7.x, tak zpětně kompatibilní s PHP 5.x.

Závažná chyba: Nezachyceno ArithmeticError: Bitový posun o záporné číslo v /tmp/test.php:2 Trasování zásobníku: #0 (hlavní) vyvoláno v /tmp/test.php na řádku 2

Bitshifty mimo rozsah

Bitové posuny (v obou směrech) za bitovou šířku celého čísla budou mít vždy za následek 0. Dříve bylo chování takových posunů závislé na architektuře.

Změny dělení nulou

Dříve, když byla 0 použita jako dělitel pro operátory dělení (/) nebo modul (%), bylo vysíláno E_WARNING a vráceno false. Nyní operátor dělení vrací float jako +INF, -INF nebo NAN, jak je uvedeno v IEEE 754. Modulový operátor E_WARNING byl odstraněn a vyvolá výjimku DivisionByZeroError.

Výstup výše uvedeného příkladu v PHP 5:

Upozornění: Dělení nulou v %s na řádku %d bool(false) Upozornění: Dělení nulou v %s na řádku %d bool(false) Upozornění: Dělení nulou v %s na řádku %d bool(false)

Výstup výše uvedeného příkladu v PHP 7:

Varování: Dělení nulou v %s na řádku %d float(INF) Varování: Dělení nulou v %s na řádku %d float(NAN) PHP Závažná chyba: Nezachyceno DivisionByZeroError: Modulo nulou v %s řádku %d

\u( může způsobit chyby

Kvůli přidání nové syntaxe escape codepoint Unicode , řetězce obsahující literál \u( následovaný neplatnou sekvencí způsobí závažnou chybu. Chcete-li se tomu vyhnout, je třeba vynechat úvodní zpětné lomítko.

Odebrané funkce Odebrané direktivy INI xsl.security_prefs

Direktiva xsl.security_prefs byla odstraněna. Místo toho by měla být volána metoda XsltProcessor::setSecurityPrefs() pro řízení předvoleb zabezpečení na základě jednotlivých procesorů.

Jiné zpětně nekompatibilní změny Nové objekty nelze přiřadit odkazem

Výsledek Nový příkaz již nelze přiřadit k proměnné odkazem:

Výstup výše uvedeného příkladu v PHP 5:

Zastaralé: Přiřazení návratové hodnoty new odkazem je v /tmp/test.php na řádku 3 zastaralé

Výstup výše uvedeného příkladu v PHP 7:

Chyba analýzy: chyba syntaxe, neočekávané „nové“ (T_NEW) v /tmp/test.php na řádku 3

Neplatná třída, rozhraní a názvy vlastností

Následující názvy nelze použít k pojmenování tříd, rozhraní nebo vlastností:

  • bool
  • int
  • plovák
  • tětiva
  • NULA
  • SKUTEČNÝ
  • NEPRAVDIVÉ

Dále by se neměly používat následující názvy. Přestože nebudou generovat chybu v PHP 7.0, jsou vyhrazeny pro budoucí použití a měly by být považovány za zastaralé.

  • objekt
  • smíšený
  • číselné
Značky ASP a skript PHP byly odstraněny

Podpora pro použití značek ASP a skriptů k oddělování kódu PHP byla odstraněna. Dotčené značky jsou:

Odstraněny značky ASP a skriptů Opening tag Uzavírací tag
Volání z nekompatibilního kontextu byla odstraněna

Dříve zastaralé v PHP 5.6, statická volání nestatické metody s nekompatibilním kontextem nyní povedou k tomu, že volaná metoda bude mít nedefinovaný $toto proměnnou a vydává se varování o ukončení podpory.

Výstup výše uvedeného příkladu v PHP 5.6:

Zavrženo: Nestatická metoda A::test() by neměla být volána staticky, za předpokladu, že $this z nekompatibilního kontextu v /tmp/test.php na řádku 8 object(B)#1 (0) ( )

Výstup výše uvedeného příkladu v PHP 7:

Zastaráno: Nestatická metoda A::test() by neměla být volána staticky v /tmp/test.php na řádku 8 Upozornění: Nedefinovaná proměnná: toto v /tmp/test.php na řádku 3 NULL

výnos je nyní správný asociativní operátor

Konstrukt výnosu již nevyžaduje závorky a byl změněn na pravý asociativní operátor s prioritou mezi nimi tisk a => . To může vést ke změně chování:

K rozlišení těchto případů lze použít závorky.

Funkce nemohou mít více parametrů se stejným názvem

Již není možné definovat dva nebo více funkčních parametrů se stejným názvem. Například následující funkce spustí E_COMPILE_ERROR :

Funkce kontrolující argumenty hlásí aktuální hodnota parametru

func_get_arg() , func_get_args() , debug_backtrace() a vyjímky backtraces již nebudou hlásit původní hodnotu, která byla předána parametru, ale místo toho budou poskytovat aktuální hodnotu (která mohla být změněna).

Výstup výše uvedeného příkladu v PHP 5:

Výstup výše uvedeného příkladu v PHP 7:

Příkazy Switch nemohou mít více výchozích bloků

V příkazu switch již není možné definovat dva nebo více výchozích bloků. Například následující příkaz switch spustí E_COMPILE_ERROR :

JSON nahradil rozšíření s JSOND

Rozšíření JSON bylo nahrazeno JSOND, což způsobilo tři menší přerušení BC. Za prvé, číslo nesmí končit desetinnou čárkou (tj. 34. musí být změněno na buď 34.0 nebo 34 ). Za druhé, při použití vědecké notace, E exponent nesmí bezprostředně následovat za desetinnou čárkou (tj. 3.e3 musí být změněno na buď 3,0e3 nebo 3e3). Konečně, prázdný řetězec již není považován za platný JSON.

Porucha vnitřní funkce při přetečení

Dříve interní funkce tiše zkracovaly čísla vytvořená z donucení float-to-integer, když byl float příliš velký, aby se dal reprezentovat jako celé číslo. Nyní bude vydáno E_WARNING a bude vráceno NULL.

Opravy návratových hodnot obslužné rutiny vlastní relace

Jakékoli predikátové funkce implementované vlastními obslužnými rutinami relací, které vracejí buď FALSE nebo -1 budou fatální chyby. Pokud je jakákoli hodnota z těchto funkcí jiná než booleovská, -1 nebo 0 vrátí, pak selže a vydá se E_WARNING.

Pořadí řazení stejných prvků

Algoritmus vnitřního třídění byl vylepšen, což může vést k jinému pořadí řazení prvků, které se porovnávají jako stejné, než dříve.

Nespoléhejte na pořadí prvků, které se srovnávají stejně, může se kdykoli změnit.

Chybně umístěné příkazy break a switch

přestávka a pokračovat příkazy mimo smyčku nebo přepínačřídicí struktura jsou nyní detekovány v době kompilace namísto běhu jako dříve a spouštějí E_COMPILE_ERROR .

Viz nedobrovolně... Slovník ruských synonym a výrazů podobných významem. pod. vyd. N. Abramova, M.: Ruské slovníky, 1999. nevědomě instinktivně, aniž by si to uvědomoval, spontánně, panicky, instinktivně, aniž by si to uvědomoval, aniž by si to uvědomoval,... ... Slovník synonym

Nezodpovědně, instinktivně, mechanicky, spontánně, slepě. Viz... Slovník synonym

Bezděčně, nevědomě, nevědomě, instinktivně, mechanicky, mechanicky, slepě, spontánně; náhodně, neúmyslně; chtě nechtě, chtě nechtě (volens nolens), z nouze Musel to udělat kvůli věcem mimo jeho kontrolu... ... Slovník synonym

Slepě, podvědomě, střeva, aniž bych si to uvědomoval, aniž by to věděl, spontánně, nevědomě, aniž by si to uvědomoval, nevědomě, mechanicky, nevědomě, nevědomě, intuitivně, nevědomě, šestý smysl, instinktivně Slovník ruštiny... ... Slovník synonym

Viz nedobrovolně... Slovník ruských synonym a výrazů podobných významem. pod. vyd. N. Abramova, M.: Ruské slovníky, 1999. slepě nevědomě, nedobrovolně; nezřetelně, lehkomyslně, nezodpovědně, spontánně, instinktivně, otrocky, nevědomě, nejasně,... ... Slovník synonym

adv. k nezodpovědnému. [Matka] se chtěla otočit, ale nevědomky šla zase dopředu. M. Gorkij, Matko. [Jidáš] prosil svou dobrou přítelkyni mámu, aby nezodpovědně spravovala jeho majetek. Saltykov Shchedrin, pánové Golovlevs ... Malý akademický slovník

UNACCOUNTABLE, unaccountable, unaccountable; (krátký mužský rod se nepoužívá) nezodpovědný, nezodpovědný. 1. Nepodléhá žádné kontrole, není povinen hlásit. Ten měl nezodpovědně (adv.) na starosti obchod. 2. Nezávisí na rozumných úvahách,... ...Ušakovův vysvětlující slovník

- (Řecký). Osoba, která je pověřena k nezodpovědnému obchodování na účet jiné osoby. Slovník cizích slov obsažených v ruském jazyce. Chudinov A.N., 1910. ANAGALIST Osoba, která je pověřena k obchodování na náklady jiné osoby bez odpovědnosti. Vysvětlení... ... Slovník cizích slov ruského jazyka

Nevysvětlitelně, nevědomě, mechanicky, mimovolně, automaticky, mechanicky, automaticky, mechanicky, autopilot Slovník ruských synonym. automaticky zobrazit automaticky Slovník synonym ruského jazyka. Praktický průvodce. M.: Ruština... Slovník synonym

Viz nedobrovolně... Slovník ruských synonym a výrazů podobných významem. pod. vyd. N. Abramova, M.: Ruské slovníky, 1999. instinktivně, nevědomě, mimovolně; mimovolně, nevědomě, střevo, spontánně, spontánně, nevědomě, slepě,... ... Slovník synonym

knihy
  • Putování po Československu, J. Marko, M. Peterka, Praha, 1959. Artia. S mnoha fotografickými ilustracemi. Nakladatelská vazba. Stav je dobrý. Okouzlený poutník z jakékoli země na světě, který se ponoří do této nádherné knihy, bude moci... Kategorie: Zápisky cestovatelů, paměti, výzkum Vydavatel: Artia,
  • Rada aneb Setkání na Sennaji, Gennadij Grigorjev, Sergej Nosov, V Petrohradu jsou prostě fantasmogenní místa. Patří mezi ně náměstí Sennaya. "Sennaya - kolébka fantasmagorie". Zdá se, že sami autoři jsou překvapeni tím, co se jim na Sennayi stalo. A... Kategorie: Klasická a moderní próza Série: Petrohradské tváře naší doby Vydavatel:

Mnoho lidí rádo píše takové konstrukce v té či oné formě, každý se setkal:
foreach ($items jako &$item) ( $item += 2; )
Málokdo ale tuší, jaké nebezpečí zde číhá.
Podívejme se na příklad.

Vasya Pupkin vzal pole, prošel je a zvýšil všechny prvky o dva:
$items = array("a" => 10, "b" => 20, "c" => 30,); foreach ($items as &$item) ( $item += 2; ) print_r($items);
Podíval jsem se na skládku, viděl jsem, že problém byl vyřešen, a odešel jsem spokojen:
Pole ([a] => 12 [b] => 22 [c] => 32)
Po nějaké době se Petrovič rozhodl doplnit tuto část kódu o další vyhledávání a dodal:
$newitems = array("a" => 10, "b" => 20, "c" => 30,); foreach ($newitems jako $key=>$item) ( $newitems[$key] += 5; ) print_r($newitems);
Viděl, že jeho úkol byl také vyřešen, a s pocitem úspěchu zavřel složku:
Pole ([a] => 15 [b] => 25 [c] => 35)
Po nějaké době se začaly objevovat nevysvětlitelné chyby. Proč?
Udělejme var_dump($items) na konci kódu:
array(3) ( ["a"]=> int(12) ["b"]=> int(22) ["c"]=> &int(30) )
třicet! Vasja Pupkin přísahá, že to zkontroloval. Proč to bylo 32 a po Petrovičově kódu 30?

Důvod spočívá v ampersandu. Hlásí, že na označená data odkazuje někdo jiný. Při odchodu za sebou Vasya nesmazal dočasnou proměnnou, kterou používal k hrubé síle ($item). Proměnná byla použita s oprávněním ke změně zdroje ("&"), také nazývané "přiřazení odkazem". Byl si jistý, že proměnná bude použita pouze uvnitř smyčky. Petrovič pomocí stejnojmenné proměnné během hledání změnil její hodnotu a pokaždé se změnilo místo, kde byla tato proměnná uložena. A byl uložen na stejném místě jako poslední prvek pole Pupkin.

Případ v článku je samozřejmě přehnaný. V praxi mohou být taková spojení velmi složitá, zejména pokud je projekt nízkonákladový a zahrnuje nedostatečně zkušené a rozptýlené webové vývojáře.

Jak se s tím můžete vypořádat?

  • Po použití zničte dočasné proměnné, zejména pokud mají nějaké spojení s používanými daty:
    foreach ($items as &$item) $item += 2; unset($item);
  • Buďte opatrní s proměnnými, které již někdo použil.
  • Zapouzdřte své akce do samostatných funkcí, metod nebo jmenných prostorů.
  • Místo print_r použijte var_dump a věnujte pozornost ampersandu. Chcete-li vypsat do souboru spíše než do prohlížeče, alternativou k print_r($var,true) by byla tato konstrukce:
    funkce dump() ( ob_start(); foreach(func_get_args() jako $var) var_dump($var); return ob_get_clean(); )
Na závěr řeknu, že chyby související s odkazy se mohou vyskytovat nejen ve foreach. A o všech se v určitém okamžiku diskutovalo. Soudě podle mých zkušeností je však tento případ v praxi natolik častý, že si zaslouží zvláštní pozornost.

Tvoříte a propagujete web s CMS Joomla a najednou máte potřebu předělat design materiálu podle svého vkusu a po svém úpravou standardních šablon komponenty com_content? Komponenta je zodpovědná za generování obsahu. Pojďme pochopit strukturu samotné komponenty.

Umístění šablony standardního materiálu

Původní soubory komponenty com_content jsou umístěny ve složce components\com_content\views\View\tmpl. Pokud jsou soubory součástí zkopírovány do adresáře \templates\template, který používáte\html\com_content\, pak bude šablona materiálů převzata ze souborů v této složce.

Adresáře a soubory šablon

Adresář umístění šablony obsahuje pět složek pro vytváření pohledů.

archivní složka

  • Archivujte složku výstupní šablony. O tomto článku se nediskutuje, málokdy ho někdo používá. Struktura je podobná složkám popsaným níže;

složka na články - Materiál

složka frontpage - Domovská stránka

  • default.php Stejný princip jako category\blog.php;
  • default_item.php Stejný princip jako category\blog_item.php;
  • default_links.php Stejný princip jako category\blog_links.php;

oddíl složky - Oddíl

  • blog.phpŠablona blogu sekce. Stejný princip jako category\blog.php;
  • blog_item.phpŠablona pro samostatný materiál z blogu sekce. Stejný princip jako category\blog_item.php;
  • blog_links.phpŠablona pro prezentaci odkazů v sekci blog. Stejný princip jako category\blog_links.php;
  • default.php Standardní šablona řezu. Zobrazuje název kategorie, její popis a počet prvků. Po kliknutí na název kategorie je stránka zpracována category\default.php;
Příklad úpravy šablony. Zobrazuje počet zobrazení materiálu.

Řekněme, že chceme zobrazit počet zobrazení jednotlivého článku z blogu kategorií. Chcete-li to provést, upravte šablonu category\blog_item.php. Kód pro vkládání informací o výsledcích bude vypadat takto:

Nyní musíte v souboru šablony category\blog_item.php najít místo, kam tento kód vložit. Například před zobrazením data poslední úpravy materiálu. Hledáme linku:

A před něj vložíme řádek s kódem.

Příklad zobrazení seznamu kategorií v několika sloupcích .