Новые функции в PHP 5.6

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

Аргументы, вроде этих, среди прочего наталкивают людей на мысль, что некоторые из ведущих разработчиков даже не используют PHP в повседневной практике, и поэтому они часто слывут среди людей, использующих PHP достаточно часто, непрофессионалами.

Хотя на самом деле картина не такая уж мрачная. Довольно непонятная ситуация существовала после выхода PHP 5.4, и с тех пор новые версии выходят все чаще и чаще. Когда вышел хитовый PHP 5.5, который принес неожиданно большие возможности, PHP-сообщество вздохнуло с облегчением.

Вновь появилась надежда на то, что PHP станет более специализированной, структурированной и интеллектуальной основой для развития проектов. Так это или нет, нам на самом деле еще предстоит выяснить, но сейчас будущее действительно выглядит многообещающим. Особенно если посмотреть на изменения в PHP 5.6.

Подробное описание всех предстоящих обновлений заняло бы слишком много времени, чтобы уместиться в одной статье, но я хотел бы обратить ваше внимание на некоторые из них, которые лично я считаю самыми важными.

MIME-типы в веб-сервере CLI

MIME-типы в PHP могут использоваться для вывода типов контента отличных как от PHP, так и от текста / HTML. Когда вы запускаете PHP-страницу, форматом вывода по умолчанию является текст / HTML, но вы можете использовать заголовки, чтобы, к примеру, установить формат PDF, и сгенерировать PDF-файлы.

Когда сервер распознает различные MIME-типы, что могут большинство серверов, таких как HHVM, Apache и Nginx, они знают, как обрабатывать данный по умолчанию файл. Основываясь только на его расширении, без необходимости задавать специальные инструкции в самом PHP.

В командной строке сервера PHP 5.4 до сих пор содержалось только несколько MIME-типов, и новая версия существенно расширяет их перечень. Можно с уверенностью сказать, что все распространенные MIME-типы теперь будут охвачены за счет встроенного в PHP сервера.

Внутренняя перегрузка операторов

Это нововведение мы, как веб-разработчики, использующие PHP, вероятно, не будем использовать, в связи с определением «внутренняя». Внутренняя означает «не для пользователей», не относящаяся к области, которую мы, конечные пользователи, используем.

Она применяется только ко внутренним классам, с целью сделать работу еще более простой, а код более понятным. Подробное объяснение можно найти здесь.

Теперь можно загружать и более 2 Гб

До версии 5.6 добавление двух и более гигабайт в PHP не поддерживалось. Теперь ситуация изменилась и поддерживается как список изменений состояния, так и добавление данных произвольного размера.

Снизилось использование памяти POST-данными

После двух исключений использование памяти POST-данными сократилось в 2-3 раза: из php.ini удалена установка always_populate_raw_post_data, также удалена сверхглобальная переменная $ HTTP_RAW_POST_DATA.

Это означает, что вы больше не сможете получать доступ к строкам POST-данных этим способом, а должны использовать такие на решения, как:

$postdata = file_get_contents("php://input");

Обратите внимание, что получение POST через ://input невозможно, когда форма состоит из нескольких частей (другими словами, когда форма имеет элемент загрузки файла).

Улучшен синтаксис произвольных функций

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

Как показано на примере отсюда, в версии 5.5 и ранее синтаксис был следующим:

class MySQL implements DB {
    protected $pdo;
    public function query($query) {
        $stmt = $this->pdo->prepare($query);
        $stmt->execute(array_slice(func_get_args(), 1));
        return $stmt;
    }
    // ...
}

$userData = $db->query('SELECT * FROM users WHERE id = ?', $userID)->fetch();

теперь он выглядит так:

class MySQL implements DB {
    public function query($query, ...$params) {
        $stmt = $this->pdo->prepare($query);
        $stmt->execute($params);
        return $stmt;
    }
    // ...
}

Как видите, синтаксис ...$params указывает функции принять первый параметр как есть, а все остальные отправить в массив $params. Это освобождает нас от необходимости выполнять объединения и вызывать func_get_params, улучшает сигнатуры функций и делает код более читаемым.

Новый синтаксис также позволяет обработку по ссылке дополнительных аргументов, что делается с помощью префикса ...$params с амперсантом типа: &...$params. Раньше с func_get_args это было невозможно.

Скалярные выражения констант

Это RFC добавило возможность включать выражения в местах, для которых применимы только статические значения. Это означает, что теперь вы можете включать базовые арифметические и логические структуры в объявления констант, аргументов функций, свойств класса и т.д.

Например, ранее такой код выдавал бы ошибку:

const a = 1;
const b = a?2:100;

Теперь нет.

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

Комплект PHPDBG по умолчанию

GDB-отладчик, phpdbg, теперь включен по умолчанию в качестве SAPI. Он используется из командной строки или упрощенно через Java UI, с указанием точек разрыва интерактивно, при сбоях программ во время выполнения и в ряде других случаев.

Он может проверять код операции, и использоваться в коде PHP. Узнать больше о phpdbg вы можете здесь.

Улучшения Zip

В Zip-библиотеках появился ряд улучшений, особенно, что касается новых методов. Отдельно можно выделить метод ZipArchive::setPassword($password), который теперь позволяет легко создавать защищенные паролем Zip-файлы.

Импорт функций областей имен

Согласно этому RFC, новая версия позволит импортировать функции областей имен и константы. В данный момент мы можем импортировать области имен и типы (классы / интерфейсы / признаки) через использование заявлений, например, так:

namespace foobar {
    function baz() {
        return 'foo.bar.baz';
    }
}

namespace {
    use foobar as b;
    var_dump(bbaz());
}

В PHP 5.6 , мы сможем использовать use function и use const заявления для импорта одиночных функций или констант (даже констант классов):

namespace {
    use function foobar as foo_bar;
    use const fooBAZ as FOO_BAZ;
    var_dump(foo_bar());
    var_dump(FOO_BAZ);
}

Заключение

PHP 5.6, дата выхода которого до сих пор не объявлена, безусловно, выглядит многообещающим, и мы надеемся, что этот краткий обзор изменений помог вам понять, насколько важно будет обновить софт, как только он выйдет. Если выйдет вообще.

Чтобы ознакомиться с остальными новыми функциями PHP 5.6 и другими улучшениями и исправлениями, пожалуйста, просмотрите файл NEWS, а также следите за обновлениями.

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

РедакцияПеревод статьи «New Features in PHP 5.6»