Слева направо: Rasmus, Build 5.4, Version 5.5, Relise 5.6
Сегодня хочу поделиться своим видением того, как будет выглядеть работа с функциями уже в ближайшем мажорном релизе PHP — 5.6. Для этого я изучил рабочие предложения и нашёл там немало вкусняшек:
- Новый синтаксис для функций с переменным числом аргументов и радостный отход в историю мороки с func_get_args():
function fn($reqParam, $optParam = null, ...$params) { }
- Опускаем указание значений для необязательных аргументов:
function create_query($where, $order_by, $join_type = '', $execute = false, $report_errors = false) { }
create_query('deleted=0', 'name', default, default, /*report_errors*/ true);
- Импорт функций из пространства имён:
use function foobarbaz;
baz();
- Исключения вместо набивших оскомину фатальных ошибок:
<?php
function call_method($obj) {
$obj->method();
}
call_method(null); // oops!
try {
call_method(null); // oops!
} catch (EngineException $e) {
echo "Cool Exception: {$e->getMessage()}n";
}
- Добавление модификатора deprecated:
deprecated function myOldFunction() { }
- Вызов методов и доступ к свойствам создаваемого объекта:
new foo()->xyz;
new baz()->bar();
Большинство из приведенных предложений пока находятся на стадии обсуждения. Но среди них уже есть утверждённые и даже реализованные.
Также искушённого читателя ждёт эксклюзив: изучая чужие умные мысли, я и сам решился написать собственный RFC. Сейчас вы не увидите его в списке предложений, так как на данный момент он находится на самом начальном этапе — на рассылке internals@lists.php.net.
А начну обзор с RFC, который уже реализован и гарантированно попадает в релиз 5.6.
Синтаксис для функций с переменным числом аргументов
Реализовано в PHP 5.6, Принято 36 голосами против 1
И сразу в бой: рассмотрим код, который показывает как переменный аргумент ...$params будет заполняться в зависимости от количества переданных аргументов:
function fn($reqParam, $optParam = null, ...$params) {
var_dump($reqParam, $optParam, $params);
}
fn(1); // 1, null, []
fn(1, 2); // 1, 2, []
fn(1, 2, 3); // 1, 2, [3]
fn(1, 2, 3, 4); // 1, 2, [3, 4]
fn(1, 2, 3, 4, 5); // 1, 2, [3, 4, 5]
$params будет пустым массивом, если число переданных аргументов меньше, чем число объявленных. Все последующие аргументы будут добавлены в массив $params (с сохранением порядка). Индексы в массиве $params заполняются от 0 и по возрастанию.
Читать полностью »