Какво е новото в PHP 5.4?

На 1 март времето най-накрая дойде: Повече от две години и половина след пускането на версия 5.3.0, мениджърите на новата версия, Стас Малишев и Дейвид Сория Пара, обявиха наличието на PHP версия 5.4.0. С помощта на осем кандидати за освобождаване тази версия е прецизирана от средата на октомври миналата година. Версия 5.4.0 съдържа много големи нови функции и по-малки подобрения, по-бърза и по-лека, но също така носи списък с нови функции, които могат да доведат до промени в собствения ви код. Дори списъкът с иновации да не е много дълъг, няколко неща са се променили. След излизането на версия 5.3 всъщност се работи по PHP 6, както разкриват различни предварително обявени, но никога не публикувани заглавия на книги. Но след месеци на работа по фундаментално преминаване към UTF-16, този маршрут беше отхвърлен по различни причини. Много други функции са останали и са запазени за 5.4 и допълнителни 5.x.

също така

Пролетно почистване

PHP 5.4 вече не поддържа или изисква autoconf версия 2.13, издадена през 1999 г., която се предоставя само от дистрибуциите поради няколко пакета. Вече се поддържат версии от 2.59, докато се препоръчват 2.60 или по-нови. Последното трябва да е достъпно във всяка съвременна дистрибуция на Linux, но ефектите не са критични и трябва да засягат само изхода за помощ на извикването ./configure. Разбира се, това засяга само процеса на изграждане на PHP и е от малко значение за потребителя.

Трябва да се отбележат пропуснатите функции и опции, най-широко разпространените от които вероятно са директивите INI safe_mode (и всички свързани с него), magic_quotes_gpc, allow_call_time_pass_reference и register_globals/register_long_arrays, които обаче всички бяха маркирани като оттеглени в 5.3.0 . safe_mode отдавна е критикуван за повишаване на сигурността само незначително, но в същото време предава грешен образ на сигурността и най-вече причинява много проблеми с конфигурацията. magic_quotes_gpc, register_globals и register_long_arrays, от друга страна, са били постоянно изключвани в повечето колекции за дълго време по смисъла на най-добрите практики и тяхното използване е недоволно.

Списъкът на премахнатите функции е ограничен до следното: define_syslog_variables (), import_request_variables (), session_register (), session_unregister () и session_is_registered () са приблизително свързани с глобалното предоставяне на променливи на заявки чрез register_globals и други подобни и следователно са остарели. Различни функции на mysqli _ * също са премахнати, но не всички. Освен това разширенията MySQL mysql, mysqli и PDO_mysql вече използват текущата библиотека на mysqlnd по подразбиране. Остарелият libmysql все още може да се използва, но също трябва да се компилира.

Заслужава си да се спомене и работата с часовите зони. Без да се посочва date.timezone в php.ini или да се използва функцията date_default_timezone_set (), часовата зона вече не се отгатва, но UTC се използва като стойност по подразбиране. Освен това няма поддръжка за putenv ("TZ = ...").

По-старото разширение sqlite2 ext/sqlite беше премахнато от инсталацията по подразбиране, но много по-често използваните разширения ext/sqlite3 и ext/pdo_sqlite остават незасегнати. Те все още могат да бъдат намерени в папката/pecl/в изходния код (да не се бърка с хранилището PECL, в което първоначално са били разположени).

За да бъдат премахнати в близко бъдеще, функциите mcrypt_generic_end () и mysql_list_dbs () са маркирани като остарели. Също така, 5.4 ще бъде последната версия на PHP, която има пакети за Windows за Windows XP и Windows 2003.

Кодовият фрагмент в Листинг 1 ще изведе точно обратното с PHP 5.3, т.е. true/false за isset ()/empty (). Засегнати са обаче не само низове като отмествания, двойните, булевите и нулевите стойности също причиняват E_NOTICE съобщения. Изместванията на низовете, от друга страна, които могат да бъдат прехвърлени към целочислени стойности чрез автоматичното излъчване на PHP (напр. '12 .3 'или' 5 foo '), генерират E_NOTICE, но все пак се преобразуват в 12 или 5 и по този начин „работят“. Използването на суперглобали като имена на параметри, като например в следващия пример, сега води до фатална грешка при преобразуване на масиви в низ (което е довело до низ с масива от съдържание), вероятно незабелязано досега:

Ако преобразуването сега също генерира E_NOTICE, поведението се запазва поради причини за обратна съвместимост.

Използването на array_combine (array (), array ()) сега води до празен масив вместо FALSE, както би се очаквало, и задаването на свойство на променлива, която е NULL, false или празен низ, води до E_WARNING, вместо E_STRICT.

Нивото на грешка E_ALL вече включва E_STRICT по подразбиране; Една от най-силно обсъжданите промени, въпреки че и тук разработчиците от години се съветват да разработват с максимално ниво на грешки, за да не пренебрегват предупрежденията, колкото и безобидни да изглеждат. Тук става проблематично, ако противно на препоръките за противното, опцията display_errors = On е включена в операция на живо и се показват предупрежденията E_STRICT, които сега се съдържат в E_ALL.

Все по-очертаващата се тенденция в дискусиите в пощенския списък за разработчици не е да правите някакво основно поведение на PHP механизма конфигурируемо за потребителя. Това не се използва за ограничаване на функционалността, а само за избягване на изненади, като например факта, че приложенията реагират напълно различно в зависимост от това как изглежда php.ini. Горните директиви magic_quotes_gpc и register_globals бяха най-важната стъпка тук, но y2k_compliance, session.bug_compat_42 и session.bug_compat_warn също бяха премахнати в процеса.

[header = Страница 2: Най-важните характеристики]

Най-важните характеристики

Най-дълго обсъжданата характеристика е това, което е известно като черти. Те бяха предложени от Стефан Мар през 2008 г. под заглавието „Хоризонтално повторно използване“ и дори трябваше да оцелеят два RFC и различни дълги дискусии в пощенския списък на Internals. На Стив Кук се приписва фразата „Множественото наследяване е добро, но няма добър начин да се направи.“ И чертите се основават на идеята за прилагане на множествено наследяване по такъв начин, че предимствата да надвишават недостатъците [1]. Подробности за изпълнението на чертите можете да намерите в [2]. За пример тук могат да служат редица класове, всички от които трябва да могат да регистрират определени действия, но не споделят йерархия на наследяване и следователно дублират или капсулират една и съща функционалност (Листинг 2).

PHP 5.4 най-накрая получи вътрешен уеб сървър, който може да свърши добра работа в разработката. Само от съображения за производителност обаче той не трябва да се използва продуктивно, тъй като уеб сървърът обработва всички заявки една след друга (включително интегрирани таблици със стилове, графики и JavaScript файлове). Може също така да се предположи, че тази нова функция не е била тествана толкова силно в цикъла на издаване, колкото промените, които се използват при работата на собственото приложение в новата версия. Документацията също така изрично не препоръчва продуктивна употреба.

Вътрешният уеб сървър се извиква в командния ред с командата php -S име на хост: порт. Тук име на хост: порт обикновено трябва да бъде нещо като localhost: 81. За да може уеб сървърът да бъде достигнат и отвън, може да се използва и 0.0.0.0:81. След това текущата директория се използва като DocumentRoot, но алтернативно това може да бъде зададено изрично с аргумента -t при стартиране. Също така е възможно да се посочи PHP скрипт като последен аргумент, който представлява минимален преден контролер. Листинг 3 показва пример от документацията.

Файловете, които са картини според разширението им, се доставят директно тук, в противен случай съдържанието просто се връща. Това може да стане чрез директен изход или да включва/изисква. По-сложните настройки, като например в приложения с много mod_rewrite, трябва да бъдат преносими с определено количество усилия. За съжаление все още няма общоизвестно бързо решение. Но тъй като повечето текущи рамки имат всички задачи, извършени от index.php в DocumentRoot, усилията трябва да бъдат ограничени.

Уеб сървърът се счита за отделен SAPI (Server API) с името cli-server, но също така е двоичен файл на CLI по отношение на поведението и следователно не използва същия php.ini като бинарния файл CGI/FastCGI, който обикновено се използва в уеб сървъра. Опцията -c при стартиране ви позволява да използвате желания php.ini и тук. Цветен изход в командния ред също може да бъде активиран тук чрез cli_server.color. PHP също поддържа синтаксис на кратък масив, подобен на този на JavaScript или други езици. Въвеждането на: вместо => е пропуснато, нотацията [] може просто да се разбере като кратка форма на масив () (Листинг 4).

Още функции

Имаше и много по-малки функции, които като цяло биха могли да опростят живота на PHP програмист. Сега има извикваем тип, който позволява параметри, които отговарят на същите критерии, които функцията is_callable () проверява. Това са предимно затваряния и низове, които съдържат имена на функции, но също се поддържа нотация на масив под формата на масив ('клас', 'метод') или масив ($ обект, 'метод'). Цялото нещо служи за опростяване на обработката на затваряния без допълнителни повиквания към is_callable () (Листинг 5). Както се очакваше, „Здравей, Свят!“ Е резултат. Разбира се, това „пренасочване на масив“ работи и ако се върне асоциативен или смесен масив.

Двоични числа вече могат да се записват във формата 0b101010, подобно на това как шестнадесетичните числа могат да се записват във формата 0x2a. Кратката форма