Що нового в 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 все ще можна використовувати, але його також потрібно скомпілювати.
Варто також згадати обробку часових поясів. Без зазначення дати.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 hostname: port. Тут ім’я хосту: порт, як правило, має бути щось на зразок 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. Зараз існує тип callable, який дозволяє параметри, які відповідають тим самим критеріям, що перевіряє функція is_callable (). В основному це закриття та рядки, що містять імена функцій, але також підтримується позначення масиву у вигляді масиву ('клас', 'метод') або масиву ($ object, 'method'). Все це служить для спрощення обробки закриттів без додаткових викликів is_callable () (Лістинг 5). Як і слід було очікувати, “Привіт, Світе!” - результат. Звичайно, це "розмежування масиву" також працює, якщо повертається асоціативний або змішаний масив.
Двійкові числа тепер можна писати у формі 0b101010, подібно до того, як шістнадцяткові числа можна писати у формі 0x2a. Коротка форма