Обзор PHP 5.4
Примечание переводчика
Я не ставил перед собой цели перевести всю статью один в один. Скажу больше, в мой статье представлена информация, собранная из множества источников. Эдакая выжимка всего, что успели написать за первую неделю после выхода PHP 5.4. Последние изменения значительно улучшили производительность и уменьшили потребление памяти. Полный список полезных материалов размещен в конце статьи.
Новые возможности и улучшения
Добавлены: трейты (trait), короткий синтаксис для массивов, встроенный веб-сервер, использование $this
в замыканиях, короткая запись <?=
, доступная всегда, и многое другое.
PHP 5.4 значительно быстрее своих предшественников и потребляет меньше памяти. Было исправлено более сотни ошибок. Часть функционала была исключена, в том числе register_globals
, magic_quotes
и safe_mode
.
Стоит отметить, что кодировкой по умолчанию стала UTF-8. Теперь для отдачи UTF-8 в браузер нет необходимости прописывать соответствующий метатэг. По умолчанию отдается заголовок Content-Type: text/html; charset=utf-8
.
Traits
Traits — это набор методов, которые по своей структуре похожи на класс (самостоятельно не могут быть инициализированы). Разработчики могут включать трейты в свои классы без необходимости наследования этих классов от одного общего родителя.
Рассмотрим пример использования трейтов. Представим, что мы пишем веб-сайт, в котором потребуется использование API от Facebook и Twitter. Мы создаем два класса, в которых есть метод-обертка для работы с cURL. Вместо использования классического метода «копи-паст» и дублирования кода, мы можем использовать трейты. Использование трейтов позволяет создавать более чистый код, следуя принципу DRY (Don’t Repeat Yourself — не повторяй себя).
примечание переводчика: для решения проблемы можно использовать и другие методы, такие как: общий класс-родитель, фабричный класс и так далее.
Код примера:
/** cURL wrapper trait */ trait cURL { public function curl($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); return $output; } } /** Twitter API Class */ class Twitter_API { use cURL; // подключаем трейт public function get($url) { return json_decode($this->curl('<a title="http://api.twitter.com/" href="http://api.twitter.com/">http://api.twitter.com/</a>'.$url)); } } /** Facebook API Class */ class Facebook_API { use cURL; // подключаем трейт public function get($url) { return json_decode($this->curl('<a title="http://graph.facebook.com/" href="http://graph.facebook.com/">http://graph.facebook.com/</a>'.$url)); } } $facebook = new Facebook_API(); echo $facebook->get('500058753')->name; // Rasmus Lerdorf /** Демонстрация синтаксиса PHP 5.4 */ echo (new Facebook_API)->get('500058753')->name; // Rasmus Lerdorf $foo = 'get'; echo (new Facebook_API)->$foo('500058753')->name; // и опять, Rasmus Lerdorf echo (new Twitter_API)->get('1/users/show.json?screen_name=rasmus')->name; // и еще раз, Rasmus Lerdorf |
Встроенный веб-сервер
Лучший друг PHP-разработчика — сервер Apache. Но иногда настройка httpd.conf
для разработческой среды сложна и избыточна. Особенно, когда вам нужен небольшой веб-сервер, который может быть запущен из командной строки. PHP 5.4 имеет свой встроенный веб-сервер.
примечание: Веб-сервер PHP 5.4 не стоит использовать на боевом сервере. Он создан только для разработки и тестирования.
Короткий синтаксис массивов
PHP 5.4 предлагает новый короткий синтаксис для массивов:
$fruits = array('apples', 'oranges', 'bananas'); // старый синтаксис $fruits = ['apples', 'oranges', 'bananas']; // новый синтаксис // ассоциативный массив $array = [ 'foo' => 'bar', 'bar' => 'foo' ]; |
Разыменование массивов
Больше не нужно использовать временные переменные для работы с массивами!
Давайте представим, что вам нужно получить Фамилию из строки Alan Mathison Turing
:
Раньше вы бы использовали такой код:
$tmp = explode(' ', 'Alan Mathison Turing'); echo $tmp[1]; // Mathison |
В PHP 5.4:
echo explode(' ', 'Alan Mathison Turing')[1]; // Mathison |
Рассмотрим более сложный пример:
function foobar() { return ['foo' => ['bar' => 'Hello']]; } echo foobar()['foo']['bar']; // Hello |
Использование $this в анонимных функциях
Теперь вы можете ссылаться на instance
объекта из анонимных функций (известных также как замыкания), используя $this
.
class Foo { function hello() { echo 'Hello Nettuts!'; } function anonymous() { // до PHP 5.4 не работает return function() { $this->hello(); }; } } class Bar { function __construct(Foo $o) // object of class Foo typehint { $x = $o->anonymous(); // get Foo::hello() $x(); // execute Foo::hello() } } new Bar(new Foo); // Hello Nettuts! |
<?= всегда включен
Независимо от настройки short_open_tag
, в php.ini
доступна короткая запись. Это означает, что вы можете всегда использовать:
<?=$title?> |
вместо
<?php echo $title ?> |
примечание: раньше, при построении универсальных систем (CMS), желательно было избегать использования короткой записи, ведь проект должен был работать на любой конфигурации.
Двоичное представление числа
Теперь целые числа могут быть представлены в десятичной, шестнадцатиричной, восьмиричной и двоичной системах счисления.
Пример записи 31:
echo 0b11111; // двоичное, начинается с 0b echo 0x1f; // шестнадцетиричное, начинается с 0x echo 037; // восьмиричное, начинается с 0 |
Добавлен таймер повышенной точности
Добавлен параметр $_SERVER['REQUEST_TIME_FLOAT']
, содержащий время начала выполнения скрипта с точностью до микросекунды (тип float). Использование этого значения может быть полезно, когда необходимо вычислить время выполнения скрипта:
echo 'Executed in ', round(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'], 2), 's'; |
PS.
Лично мне понравилось:
— стандартизация <?=
— теперь не будет холливаров на тему использовать или не использовать короткую запись;
— traits — очень полезная штука. Поможет разгрузить мега-классы-прародители всего и вся. Многие системы грешат, используя антипаттерн GOD Object;
— улучшение производительности — обязательно протестируем и сравним выполнение кода на разных версиях PHP.
Полезные ссылки
Основная статья (eng): http://net.tutsplus.com/tutorials/php/php-5-4-is-here-what-you-must-know
Полный список изменений (eng): http://www.php.net/ChangeLog-5.php#5.4.0
Документация по трейтам (rus): http://php.net/manual/ru/language.oop5.traits.php
Изменения в ООП (rus): http://www.php.net/manual/ru/language.oop5.changelog.php
Миграция с PHP 5.3 -> PHP 5.4 (eng): http://www.php.net/manual/en/migration54.php
Встроенный web-сервер (rus): http://php.net/manual/ru/features.commandline.webserver.php
Обзор новшеств PHP 5.4 (rus): http://www.opennet.ru/opennews/art.shtml?num=33241
Yii без вебсервера (rus): http://rmcreative.ru/blog/post/php-5.4—rabotaem-s-yii-bez-vebservera
Ну, что ж… Дело за малым. Только испытать 🙂