Описание на структурата на шаблона com_content. Клопка в foreach($items as &$item) Директории и шаблонни файлове

Много хора обичат да пишат такива конструкции под една или друга форма, всеки е срещал:
foreach ($items като &$item) ($item += 2;)
Но не много хора подозират опасността, която дебне тук.
Нека разгледаме един пример.

Вася Пупкин взе масива, премина през него, увеличавайки всички елементи с две:
$items = array("a" => 10, "b" => 20, "c" => 30,); foreach ($items като &$item) ( $item += 2; ) print_r($items);
Погледнах дъмпа, видях, че проблемът е решен и си тръгнах доволен:
Масив ([a] => 12 [b] => 22 [c] => 32)
След известно време Петрович реши да допълни този раздел от код с друго търсене, като добави по-долу:
$newitems = масив ("a" => 10, "b" => 20, "c" => 30,); foreach ($newitems като $key=>$item) ( $newitems[$key] += 5; ) print_r($newitems);
Той видя, че и неговата задача е решена и с чувство за постижение затвори файла:
Масив ([a] => 15 [b] => 25 [c] => 35)
След известно време започнаха да се появяват необясними грешки. Защо?
Нека направим var_dump($items) в края на кода:
array(3) ( ["a"]=> int(12) ["b"]=> int(22) ["c"]=> &int(30) )
тридесет! Вася Пупкин се кълне, че е проверил. Защо беше 32, а след кода на Петрович 30?

Причината се крие в амперсанда. Той съобщава, че някой друг препраща към маркираните данни. Когато си тръгваше, Вася не изтри зад себе си временната променлива, която използваше за груба сила ($item). Променливата беше използвана с разрешение за промяна на източника ("&"), наричано още "присвояване чрез препратка". Той беше сигурен, че променливата ще се използва само вътре в цикъла. Петрович, използвайки променлива със същото име, по време на търсенето си променя стойността й и всеки път мястото, където се съхранява тази променлива, се променя. И беше съхранен на същото място като последния елемент от масива Pupkin.

Разбира се, случаят в статията е преувеличен. На практика подобни връзки могат да бъдат много сложни, особено ако проектът е евтин и включва недостатъчно опитни и разпръснати уеб разработчици.

Как можете да се справите с това?

  • Унищожете временните променливи след употреба, особено ако имат някаква връзка с използваните данни:
    foreach ($items като &$item) $item += 2; изключване ($ елемент);
  • Бъдете внимателни с променливи, които вече са били използвани от някого.
  • Капсулирайте вашите действия в отделни функции, методи или пространства от имена.
  • Използвайте var_dump вместо print_r и обърнете внимание на амперсанда. За изхвърляне към файл, а не към браузъра, алтернатива на print_r($var,true) би била тази конструкция:
    функция dump() ( ob_start(); foreach(func_get_args() като $var) var_dump($var); return ob_get_clean(); )
В заключение ще кажа, че грешки, свързани с връзки, могат да възникнат не само във foreach. И всички те бяха обсъждани в даден момент. Въпреки това, съдейки по моя опит, този случай е толкова често срещан в практиката, че заслужава специално внимание.

Създавате и популяризирате уебсайт, работещ с CMS Joomla, и изведнъж имате нужда да преработите дизайна на материала по ваш вкус и по ваш собствен начин, като редактирате стандартните шаблони на компонента com_content? Компонентът отговаря за генерирането на съдържание. Нека разберем структурата на самия компонент.

Стандартно местоположение на шаблона за материали

Оригиналните файлове на компонента com_content се намират в папката components\com_content\views\View\tmpl. Ако компонентните файлове са копирани в директорията \templates\template, която използвате\html\com_content\, тогава шаблонът на материалите ще бъде взет от файловете в тази папка.

Директории и шаблонни файлове

Директорията за местоположение на шаблона съдържа пет папки за създаване на изгледи.

архивна папка

  • Папка с шаблон за изходен архив. Тази статия не се обсъжда; рядко някой я използва. Структурата е подобна на папките, описани по-долу;

папка със статии – Материал

папка frontpage - Начална страница

  • default.phpСъщият принцип като category\blog.php;
  • default_item.phpСъщият принцип като category\blog_item.php;
  • default_links.phpСъщият принцип като category\blog_links.php;

папка раздел - Раздел

  • blog.phpШаблон за блог на секция. Същият принцип като category\blog.php;
  • blog_item.phpШаблон за отделен материал от рубриката блог. Същият принцип като category\blog_item.php;
  • blog_links.phpШаблон за представяне на връзки под секцията блог. Същият принцип като category\blog_links.php;
  • default.phpСтандартен шаблон за раздел. Показва заглавието на категорията, нейното описание и броя на елементите. След като щракнете върху заглавието на категорията, страницата се обработва от category\default.php;
Пример за редактиране на шаблон. Показва броя прегледи на материала.

Да кажем, че искаме да покажем броя посещения на отделна статия от блог на категория. За да направите това, редактирайте шаблона category\blog_item.php. Кодът за вмъкване на информация за посещенията ще бъде така:

Сега трябва да намерите място във файла с шаблона category\blog_item.php, където да вмъкнете този код. Например, преди да се покаже датата, на която материалът е бил последно редактиран. Търсим линията:

И преди него вмъкваме ред с кода.

Пример показване на списък с категории в няколко колони .

Много фатални и възстановими фатални грешки са преобразувани в изключения в PHP 7. Тези изключения за грешки наследяват от класа Error, който сам имплементира интерфейса Throwable (новият базов интерфейс наследява всички изключения).

Това означава, че персонализираните манипулатори на грешки може вече да не се задействат, защото вместо това може да бъдат хвърлени изключения (причиняващи нови фатални грешки за неуловени изключения за грешка).

По-пълно описание на това как работят грешките в PHP 7 може да се намери на страницата с грешки в PHP 7. Това ръководство за мигриране само ще изброи промените, които засягат обратната съвместимост.

Вътрешните конструктори винаги хвърлят изключения при повреда

Преди това някои вътрешни класове връщаха NULL или неизползваем обект, когато конструкторът се провали. Всички вътрешни класове сега ще хвърлят изключение в този случай по същия начин, по който потребителските класове вече трябваше.

E_STRICT забелязва промени в сериозността

Всички известия E_STRICT са прекласифицирани на други нива. Константата E_STRICT се запазва, така че извикванията като докладване_на_грешка(E_ALL|E_STRICT)няма да причини грешка.

E_STRICT забелязва промени в сериозността Ситуация Ново ниво/поведение
Индексиране по ресурс E_NOTICE
Абстрактни статични методи
"Предефиниране" на конструктор Забележката е премахната, не задейства грешка
Несъответствие на подписа по време на наследяването E_ПРЕДУПРЕЖДЕНИЕ
Едно и също (съвместимо) свойство в два използвани признака Забележката е премахната, не задейства грешка
Достъп до статично свойство нестатично E_NOTICE
Само променливите трябва да се присвояват чрез препратка E_NOTICE
Само променливите трябва да се предават по референция E_NOTICE
Извикване на нестатични методи статично E_ОТТЕГЛЕНО
Промени в обработката на променливи

PHP 7 вече използва абстрактно синтактично дърво, когато анализира изходните файлове. Това позволи много подобрения на езика, които преди това бяха невъзможни поради ограничения в синтактичния анализатор, използван в по-ранните версии на PHP, но доведе до премахването на няколко специални случая от съображения за последователност, което доведе до прекъсвания на обратната съвместимост. Тези случаи са описани подробно в този раздел.

Промени в обработката на индиректни променливи, свойства и методи

Индиректният достъп до променливи, свойства и методи вече ще се оценява стриктно в ред отляво надясно, за разлика от предишната комбинация от специални случаи. Таблицата по-долу показва как се е променил редът на оценяване.

Стара и нова оценка на непреки изрази Expression PHP 5 интерпретация PHP 7 интерпретация
$$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"]()

Кодът, който използва стария ред на оценка отдясно наляво, трябва да бъде пренаписан, за да използва изрично този ред на оценка с фигурни скоби (вижте горната средна колона). Това ще направи кода едновременно съвместим с PHP 7.x и обратно съвместим с PHP 5.x.

Фатална грешка: Uncaught ArithmeticError: Преместване на битове с отрицателно число в /tmp/test.php:2 Проследяване на стека: #0 (основен) хвърлен в /tmp/test.php на ред 2

Изместване на битове извън диапазона

Побитовите смени (в която и да е посока) извън битовата ширина на цяло число винаги ще водят до 0. Преди това поведението на такива смени беше зависимо от архитектурата.

Промени в Деление на нула

Преди това, когато 0 се използваше като делител за операторите за деление (/) или модул (%), се излъчваше E_WARNING и се връщаше false. Сега операторът за разделяне връща стойност с плаваща единица като +INF, -INF или NAN, както е посочено от IEEE 754. Модулният оператор E_WARNING е премахнат и ще хвърли изключение DivisionByZeroError.

Резултат от горния пример в PHP 5:

Предупреждение: Деление с нула в %s на ред %d bool(false) Предупреждение: Деление на нула в %s на ред %d bool(false) Предупреждение: Деление на нула в %s на ред %d bool(false)

Резултат от горния пример в PHP 7:

Предупреждение: Деление с нула в %s на ред %d float(INF) Предупреждение: Деление на нула в %s на ред %d float(NAN) PHP Фатална грешка: Uncaught DivisionByZeroError: Modulo с нула в %s ред %d

\u(може да причини грешки

Поради добавянето на новия синтаксис за избягване на кодовата точка на Unicode, низове, съдържащи литерал \u(последвано от невалидна последователност, ще доведе до фатална грешка. За да избегнете това, водещата обратна наклонена черта трябва да бъде екранирана.

Премахнати функции Премахнати INI директиви xsl.security_prefs

Директивата xsl.security_prefs е премахната. Вместо това, методът XsltProcessor::setSecurityPrefs() трябва да бъде извикан, за да контролира предпочитанията за сигурност за всеки процесор.

Други обратно несъвместими промени Новите обекти не могат да бъдат присвоени чрез препратка

Резултатът от новоператорът вече не може да бъде присвоен на променлива чрез препратка:

Резултат от горния пример в PHP 5:

Отхвърлено: Присвояването на върнатата стойност на new чрез препратка е отхвърлено в /tmp/test.php на ред 3

Резултат от горния пример в PHP 7:

Грешка при анализиране: синтактична грешка, неочаквано „ново“ (T_NEW) в /tmp/test.php на ред 3

Невалидни имена на класове, интерфейси и характеристики

Следните имена не могат да се използват за именуване на класове, интерфейси или характеристики:

  • bool
  • вътр
  • плавам
  • низ
  • НУЛА
  • ВЯРНО
  • НЕВЯРНО

Освен това не трябва да се използват следните имена. Въпреки че няма да генерират грешка в PHP 7.0, те са запазени за бъдеща употреба и трябва да се считат за остарели.

  • обект
  • смесен
  • числови
PHP таговете за ASP и скрипт са премахнати

Поддръжката за използване на ASP и скриптови тагове за ограничаване на PHP кода е премахната. Засегнатите тагове са:

Премахнати ASP и скриптови тагове Отварящ етикет Затварящ етикет
Обажданията от несъвместим контекст са премахнати

Отхвърлени по-рано в PHP 5.6, статични извиквания, направени към нестатичен метод с несъвместим контекст, сега ще доведат до извикан метод с недефиниран $товапроменлива и се издава предупреждение за отмяна.

Резултат от горния пример в PHP 5.6:

Отхвърлено: Нестатичният метод A::test() не трябва да се извиква статично, като се приема $this от несъвместим контекст в /tmp/test.php на ред 8 object(B)#1 (0) ( )

Резултат от горния пример в PHP 7:

Отхвърлено: Нестатичният метод A::test() не трябва да се извиква статично в /tmp/test.php на ред 8 Забележка: Недефинирана променлива: това в /tmp/test.php на ред 3 NULL

yield вече е десен асоциативен оператор

Конструкцията yield вече не изисква скоби и е променена на десен асоциативен оператор с приоритет между печати => . Това може да доведе до промяна в поведението:

Скобите могат да се използват за разграничаване на тези случаи.

Функциите не могат да имат няколко параметъра с едно и също име

Вече не е възможно да се дефинират два или повече функционални параметъра с едно и също име. Например следната функция ще задейства E_COMPILE_ERROR:

Функциите, проверяващи аргументите, отчитат текущстойност на параметъра

func_get_arg(), func_get_args(), debug_backtrace() и обратните проследявания на изключения вече няма да отчитат оригиналната стойност, която е била предадена на параметър, но вместо това ще предоставят текущата стойност (която може да е била променена).

Резултат от горния пример в PHP 5:

Резултат от горния пример в PHP 7:

Операторите Switch не могат да имат множество блокове по подразбиране

Вече не е възможно да се дефинират два или повече блока по подразбиране в команда за превключване. Например следният оператор за превключване ще задейства E_COMPILE_ERROR:

JSON замени разширението с JSOND

Разширението JSON е заменено с JSOND, причинявайки три незначителни прекъсвания на BC. Първо, числото не трябва да завършва с десетична запетая (т.е. 34. трябва да се промени на едно от двете 34.0 или 34 ). Второ, когато използвате научна нотация, декспонентата не трябва да следва непосредствено десетичната запетая (т.е. 3.e3трябва да се промени на едно от двете 3.0e3или 3e3). И накрая, празен низ вече не се счита за валиден JSON.

Неизправност на вътрешната функция при препълване

Преди това вътрешните функции безшумно отрязваха числата, произведени от принудителни действия на плаващо към цяло число, когато плаващото число беше твърде голямо, за да бъде представено като цяло число. Сега ще бъде излъчено E_WARNING и ще бъде върнато NULL.

Корекции на връщаните стойности на манипулатора на персонализирани сесии

Всички предикатни функции, реализирани от персонализирани манипулатори на сесии, които връщат FALSE или -1 ще бъдат фатални грешки. Ако има стойност от тези функции, различна от булева, -1 , или 0 се връща, тогава ще се провали и ще бъде излъчено E_WARNING.

Ред на сортиране на равни елементи

Вътрешният алгоритъм за сортиране е подобрен, което може да доведе до различен ред на сортиране на елементи, които се сравняват като равни, отколкото преди.

Не разчитайте на реда на елементите, които се сравняват като равни; той може да се промени по всяко време.

Неправилно поставени изрази за прекъсване и превключване

прекъсвами продължиизрази извън цикъл или превключвателконтролната структура вече се откриват по време на компилиране, вместо по време на изпълнение, както преди, и задействат E_COMPILE_ERROR.

Вижте неволно... Речник на руските синоними и изрази, подобни по значение. под. изд. Н. Абрамова, М.: Руски речници, 1999. несъзнателно инстинктивно, без да осъзнавате, спонтанно, паника, инстинктивно, без да осъзнавате, без да осъзнавате,... ... Речник на синонимите

Неотчетно, инстинктивно, механично, спонтанно, сляпо. Вижте... Речник на синонимите

Неволно, несъзнателно, несъзнателно, инстинктивно, механично, машинално, сляпо, спонтанно; случайно, неволно; волю или неволю, искаш или не (volens nolens), по необходимост Той трябваше да направи това поради неща извън неговия контрол... ... Речник на синонимите

Сляпо, подсъзнателно, червата, без да осъзнавате, без да го знаете, спонтанно, несъзнателно, без да осъзнавате, несъзнателно, механично, несъзнателно, несъзнателно, интуитивно, несъзнателно, шесто чувство, инстинктивно Речник на руски... ... Речник на синонимите

Вижте неволно... Речник на руските синоними и изрази, подобни по значение. под. изд. Н. Абрамова, М.: Руски речници, 1999. сляпо несъзнателно, неволно; неясно, безразсъдно, безотчетно, спонтанно, инстинктивно, робски, несъзнателно, неясно,... ... Речник на синонимите

адв. до безотчетен. [Майка] искаше да се върне назад, но несъзнателно тръгна отново напред. М. Горки, Майка. [Юда] молеше своя добър приятел Мама да управлява безотчетно имуществото му. Салтиков Шчедрин, господа Головлевс ... Малък академичен речник

НЕОТЧЕТЕН, безотчетен, безотчетен; (не се използва кратък мъжки род) безотчетен, безотчетен. 1. Не подлежи на никакъв контрол, не е задължен да се отчита. Той е бил безотчетно (адв.) отговорник на магазина. 2. Не зависи от разумни съображения,... ... Обяснителен речник на Ушаков

- (Гръцки). Лице, на което е поверено да търгува безотчетно за сметка на друго лице. Речник на чуждите думи, включени в руския език. Chudinov A.N., 1910. ANAGALIST Лице, на което е поверено да търгува за сметка на друго лице без отговорност. Обяснение... ... Речник на чуждите думи на руския език

Неотчетно, несъзнателно, механично, неволно, автоматично, механично, автоматично, механично, автопилот Речник на руските синоними. автоматично вижте автоматично Речник на синонимите на руския език. Практическо ръководство. М.: Руски... Речник на синонимите

Вижте неволно... Речник на руските синоними и изрази, подобни по значение. под. изд. Н. Абрамова, М.: Русские речники, 1999. инстинктивно, несъзнателно, неволно; неволно, несъзнателно, червата, спонтанно, спонтанно, несъзнателно, сляпо,... ... Речник на синонимите

Книги
  • Пътуване из Чехословакия, Й. Марко, М. Петерка, Прага, 1959 г. Артия. С много фотоилюстрации. Обвързване на издателя. Състоянието е добро. Един омагьосан скитник от която и да е страна по света, ровейки се в тази прекрасна книга, ще може... Категория: Бележки на пътешественици, мемоари, изследвания Издател: Artia,
  • Табло, или Срещи на Сеная, Генадий Григориев, Сергей Носов, В Санкт Петербург има просто фантасмогенни места. Те включват площад Sennaya. "Сенная - люлката на фантасмагорията". Самите автори изглежда са изненадани от случилото се с тях на Сеная. И... Категория: Класическа и съвременна проза Поредица: Санкт Петербург лица на нашето време Издател:

Колкото и да използваме PHP, все още изскачат някои функции, за които дори не сме чували. Някои от тях биха ни били много полезни. Създадох малък списък с полезни функции, които трябва да бъдат в арсенала на всеки PHP програмист.

1. Създаване на функции с променлив брой аргументи

Най-вероятно вече знаете, че PHP ни позволява да създаваме функции с незадължителни аргументи. Сега ще покажа функция, в която броят на аргументите може да варира от случай на случай.

Но първо, нека си припомним как създаваме функции по обичайния начин:

// функция с два незадължителни параметъра function foo($arg1 = "", $arg2 = "") ( echo "arg1: $arg1\n"; echo "arg2: $arg2\n"; ) foo("здравей", "свят"); /* ще изведе: arg1: здравей arg2: свят */ foo(); /* ще изведе: arg1: arg2: */

Сега нека да разгледаме как можете да напишете функция с неограничен брой аргументи. За да направите това, ще се използва методът func_get_args():

// не указвайте аргументи функция foo() ( // връща масив от предадени аргументи $args = func_get_args(); foreach ($args as $k => $v) ( echo "arg".($k+1) ." : $v\n"; ) ) foo(); /* няма да извежда нищо */ foo("hello"); /* ще отпечата arg1: здравей */ foo("здравей", "свят", "отново"); /* ще отпечата arg1: здравей arg2: свят arg3: отново */

2. Използвайте Glob() за търсене на файлове

Често имената на функциите говорят сами за себе си. Същото не може да се каже за функцията glob().

Без да навлизаме в много подробности, неговата функционалност е подобна на метода scandir(). Тя ви позволява да намерите необходимия файл с помощта на шаблон:

// намиране на всички php файлове $files = glob("*.php"); print_r($файлове); /* ще изведе: Array ( => phptest.php => pi.php => post_output.php => test.php) */

За да намерите файлове от няколко типа, трябва да напишете така:

// намиране на всички php и txt файлове $files = glob("*.(php,txt)", GLOB_BRACE); print_r($файлове); /* изход: масив ( => phptest.php => pi.php => post_output.php => test.php => log.txt => test.txt) */

Можете също да посочите пътя в шаблона:

$files = glob("../images/a*.jpg"); print_r($файлове); /* изход: масив ( => ../images/apple.jpg => ../images/art.jpg) */

За да получите пълния път до документ, използвайте метода realpath():

$files = glob("../images/a*.jpg"); // Прилагане на функцията "realpath" към всеки елемент от масив $files = array_map("realpath",$files); print_r($файлове); /* ще изведе: Array ( => C:\wamp\www\images\apple.jpg => C:\wamp\www\images\art.jpg) */

3. Информация за използваната памет

Ако следите количеството памет, консумирано от вашите скриптове, вероятно ще ги оптимизирате по-често.

PHP има мощен инструмент за проследяване на паметта. Натоварванията може да са различни в различните части на скрипта. За да получим текущо използваната стойност на паметта, трябва да използваме метода memory_get_usage(). За да коригирате максималното количество използвана памет, използвайте memory_get_peak_usage()

Ехо "Първоначално: ".memory_get_usage()." байтове \n"; /* Първоначално: 361400 байта */ // дава малко натоварване за ($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. Информация за процесора

За да направите това, трябва да използвате метода getrusage(). Но имайте предвид, че тази функция няма да работи на Windows.

Print_r(getrusage()); /* отпечатва масив ( => 0 => 0 => 2 => 3 => 12692 => 764 => 3864 => 94 => 0 => 1 => 67 => 4 => 0 => 0 => 0 => 6269 => 0) */

Очертаната по-горе картина ще бъде ясна за тези, които имат опит в системната администрация. За всички останали предлагаме препис:

  • ru_oublock: брой операции за запис на блок
  • ru_inblock: брой операции за четене на блок
  • ru_msgsnd: брой изпратени съобщения
  • ru_msgrcv: брой получени съобщения
  • ru_maxrss: максимален размер на нестраниран набор
  • ru_ixrss: общо количество споделена памет
  • ru_idrss: общ обем несподелени данни
  • ru_minflt: брой използвани страници с памет
  • ru_majflt: брой грешки при липсваща страница
  • ru_nsignals: брой получени сигнали
  • ru_nvcsw: брой превключвания на контекста от процеса
  • ru_nivcsw: брой принудителни превключвания на контекста
  • ru_nswap: брой достъпи до диска при страниране
  • ru_utime.tv_usec: време на работа в потребителски режим (микросекунди)
  • ru_utime.tv_sec: време на работа в потребителски режим (секунди)
  • ru_stime.tv_usec: време на работа в привилегирован режим (микросекунди)
  • ru_stime.tv_sec: време на работа в привилегирован режим (секунди)

За да разберете какви ресурси на вашия процесор се използват от скрипта, трябва да имате стойността на „потребителско време“ (потребителско време) и „системно време“ (време в привилегирован режим). Можете да получите резултата както за секунди, така и за микросекунди. За да преобразувате общия брой секунди в десетично число, трябва да разделите стойността на микросекундите на 1 милион и да добавите стойността на секундите към стойността.

Това е някак объркващо. Ето един пример:

// почивка за 3 секунди sleep(3); $ данни = getrusage (); echo "Потребителско време: ". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "Системно време: ". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* отпечатва потребителско време: 0.011552 системно време: 0 */

Въпреки че изпълнението на скрипта отне около 3 секунди, процесорът не беше силно натоварен. Факт е, че когато се извиква (заспиване), скриптът практически не консумира ресурси на процесора. Като цяло има много задачи, които отнемат значително време, но не използват процесора. Например изчакване на операции, свързани с диска. Така че не винаги използвате процесорно време във вашите скриптове.

Ето още един пример:

// вървете 10 милиона пъти за ($i=0;$i здравей => 42 => масив ( => 1 => две) => ябълка) */

Ето как работят тези функции. Въпреки това, поради бързото нарастване на популярността на JSON, 2 метода json_encode() и json_decode() бяха добавени към PHP 5.2. Тяхната работа е подобна на serialize():

// сложен масив $myvar = array("hello", 42, array(1,"two"), "apple"); // конвертиране в низ $string = json_encode($myvar); ехо $низ; /* ще отпечата ["hello",42,,"apple"] */ // възстановяване на оригиналната стойност $newvar = json_decode($string); print_r($newvar); /* отпечатва масив ( => здравей => 42 => масив ( => 1 => две) => ябълка) */

Тази опция е по-компактна и съвместима с други езици като JavaScript. Въпреки това, когато работите с много сложни обекти, може да възникне загуба на данни.

8. Компресиране на низове

Когато говорим за компресиране, веднага се сещаме за архивни файлове в ZIP формат. PHP предоставя възможност за компресиране на дълги низове без никакви файлове.

Следният пример демонстрира как работят функциите gzcompress() и 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 elit lacus quis ante. Lorem ipsum dolor sit amet , consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. Praesent ipsum diam, consectetur vitae ornare a, aliquam a nunc. In id magna pellentesque tellus posuere ad ipiscing. 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 nulla bibendum id euismod urna содалес.“; $компресиран = gzcompress($низ); echo "Оригинален размер: ". strlen($string)."\n"; /* ще изведе Оригинален размер: 800 */ echo "Компресиран размер: ". strlen($compressed)."\n"; /* ще изведе Compressed size: 418 */ // върне $original = gzuncompress($compressed);

Можем да намалим обема на текста с 50%. За същите цели можете да използвате методите gzencode() и gzdecode(), които използват различен алгоритъм за компресиране.

9. Изпълнете преди излизане

PHP има функция register_shutdown_function(), която ще ви позволи да изпълните някакъв код, преди да изключите скрипта.

Да приемем, че искате да разберете някаква информация... Време на изпълнение на скрипта:

// получаваме началния час $start_time = microtime(true); // някои операции // ... // показват времето на изпълнение echo "изпълнението отне: ". (microtime(true) - $start_time). "секунди.";

На пръв поглед това може да изглежда като тривиална задача. За тези цели можете да поставите кода в края на файла. Въпреки това, ако функцията exit() се задейства някъде преди това, този код никога няма да работи. Също така няма да работи, ако има грешка на страницата или потребителят прекъсне зареждането на страницата (като щракне върху съответния бутон в своя браузър);

Когато използвате метода register_shutdown_function(), кодът ще бъде изпълнен във всеки случай:

$start_time = микровреме(вярно); register_shutdown_function("my_shutdown"); функция my_shutdown() ( глобално $start_time; echo "изпълнението отне: ". (microtime(true) - $start_time). " секунди."; )

Заключение

PHP е цяла планета, която не спира да ни учудва със съдържанието си. Какво мислите за тези функции?



Свързани публикации