PHP 5.4 - краткий обзор

 
php.gif

В марте прошлого года в свет вышла стабильная версия языка PHP — 5.4.
В этой версии есть ряд приятных нововведений, которые хотелось вкратце осветить.
Хостинг-провайдеры, возможно, ещё не скоро начнут обновлять свои сервера, но уже сейчас можно пробовать писать ориентируясь на новую версию. На текущим момент это уже 5.4.10

Список интересных и важных изменений

Оригинальный список изменений можно почитать на официальном сайте, но там есть пара неточностей. Ниже приведены наиболее интересные, на мой взгляд, моменты.

Безопасный режим больше не поддерживается

Едва ли это значит, что php перестал быть безопасным или стал менее безопасным. В конечном итоге узким местом всегда будет человек, но если ваше приложение как-то опералось на безопасный режим, то похоже вам потребуется пересмотреть свой код.

«Волшебные» кавычки не работают

Забавная функция, которая давала возможность расслабиться тем, кто не желает вникнуть в основные принципы безопасности веб (да и не только) приложений теперь не доступна. Теперь придётся всё же почитать.

Функции get_magic_quotes_gpc() и get_magic_quotes_runtime() теперь всегда возвращают FALSE. Функция set_magic_quotes_runtime() вызывает ошибку уровня E_CORE_ERROR.

Директивы Register globals удалены

Директивы php.ini register_globals и register_long_arrays были удалены.

Возможность передачи по ссылке во время вызова функции была убрана

То есть такой код работать по прежнему будет.

$a = 1;
$b = 2;

/**
 * Example function
 */

function example_func(&$c, $d) {
  $c += $d;
}

example_func($a, $b);

echo "$a". PHP_EOL;

И вернёт результат 3

А вот такой

$a = 1;
$b = 2;

/**
 * Example function
 */

function example_func($c, $d) {
  $c += $d;
}

example_func(&$a, $b);

echo "$a". PHP_EOL;

уже нет (неужели мог?)

Имена параметров, которые «затеняют» имена суперглобальных переменных, теперь расцениваются как фатальная ошибка.

Это правило запрещает код, подобный этому:

/**
 * FIXME
 */

function foo($_GET, $_POST) {
  //Do something...
}

Неужели кто-то так писал? Но в любом случае хорошо.

Следующие функции были удалены из PHP

Алиасы

Добавлены новые зарезервированные слова

Эти ключевые слова теперь зарезервированы и не могут использоваться в качестве названий функций, классов и прочих имен:

  • trait
  • callable
  • insteadof

Добавлена поддержка трейтов

Подробнее читаем на официальном сайте на русском языке и с примерами.
Коротко лишь замечу, что если вам когда-то хотелось пересадить пяток методов из одного класса в другой без наследования (по горизонтали), то эта фича как раз для вас.

Короткий синтаксис объявления массивов

Прямо как в Ruby! И не может не радовать.
Работает так:

$a = [1, 2, 9, 16];
$b = ['foo' => 'bar', 'baz' => 'quux'];

Добавлена возможность разыменования массивов, возвращаемых функциями

А с этим примером мы знакомы как минимум из JavaScript и негодовали на php, что он так не умел.

/**
 * Example function
 */

function example_func() {
  $output = [1, 2, 9, 16];

  return $output;
}

echo example_func()[2] . PHP_EOL;

Выведет на экран 9.

Короткий открывающийся тэг теперь доступен всегда

Несмотря на значение php.ini опции short_open_tag названная фича (<?=)всегда работает.
Если вы до сих пор в своих шаблонах пишите так <?php print $var; ?>, то завязывайте с этим делом. Теперь всегда можно так <?= $var; ?>.

Добавлена возможность получения доступа к члену класса при создании экземпляра.

Иногда не хватало. Пожалуй хорошее нововведение.
Синтаксис такой:

(new Foo)->bar()

При вызове статического метода класса имя функции может быть выражением

Синтаксис такой:

Class::{expr}()

Добавлен бинарный формат задания чисел

Синтаксис такой:

$a = 0b001001101;

Добавлена возможность отслеживать процесс загрузки файлов

Подробнее читайте на официальном сайте документации.

Встроенный веб-сервер для разработчиков

Да. Почти как в рельсах =)
В php встроили небольшой веб-сервер специально для разработчиков.

Запускается он просто. Нужно перейти в корневой каталог вашего проекта и выполнить команду:

php -S localhost:8000

В связи с этим появилась новая опция конфигурации cli_server.color - включает ANSI-раскраску в консольном выводе встроенного веб-сервера.