Обзор PHP 5.4

9th Март 2012 | Категории: PHP | Метки:

Примечание переводчика

Я не ставил перед собой цели перевести всю статью один в один. Скажу больше, в мой статье представлена информация, собранная из множества источников. Эдакая выжимка всего, что успели написать за первую неделю после выхода 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

Subscribe without commenting


  1. nemorg
    7th Июнь 2012 в 01:25

    Ну, что ж… Дело за малым. Только испытать 🙂