Статьи

PHP 5.5.0 выпущен!

PHP 5.5 был выпущен! Довольно захватывающая штука, и очень приятно видеть темп новых релизов. Реквизит для команды разработчиков!

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

Основные моменты:

Генераторы

Генераторы предоставляют чрезвычайно простой способ создания итераторов. Они вводят новое yieldключевое слово, которое вроде работает return, но отличается:

<?php

function daysOfTheYear() {

    $year = date('Y');
    $current = new DateTimeImmutable($year . '-01-01');

    do {

        yield $current;
        $current = $current->modify('+1 day');

    } while ($current->format('Y') === $year);

}

foreach(daysOfTheYear() as $dt) {

    // ...

}

?>

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

Больше информации на php.net .

Неизменяемый объект DateTime

В моем предыдущем примере я использовал DateTimeImmutable. В моей работе я имею дело с много с датами и временем. DateTimeпоэтому мой инструмент выбора.

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

<?php

function printUTCTime(DateTime $dt) {

    $dt->setTimeZone(new DateTimeZone('UTC'));
    echo $dt->format(DateTime::ATOM);

}

// Created in a local timezone
$dt = new DateTime('now');
printUTCTime($dt);

// Now $dt is suddenly in UTC.

?>

Поскольку имя моей функции называлось printUTCTime, как потребитель этой функции это противоречило бы моим ожиданиям, что объект также был изменен. Я ожидал бы, что это просто эхом.

Поэтому, как разработчику библиотеки, я должен всегда сначала клонировать все, DateTimeчто получаю, прежде чем что-либо делать с ними.

DateTimeImmutableэто новый объект, похожий на DateTime. Разница в том, что это, ну, неизменным. Это означает, что после того, как объект был создан, он никогда не изменится.

Такие методы , как modify, setTimeZoneи setTimeStampникогда не изменяют объект, но всегда возвращают модифицированную копию.

Теперь, если мы также сможем решить следующую функцию юзабилити API, я был бы полностью счастлив:

<?php

$dt = new DateTime('2013-06-20 16:00:00', new DateTimeZone('Europe/London'));
$dt->setTimeZone(new DateTimeZone('Europe/London'));

?>

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

В любом случае, как только мои библиотеки потребуют PHP 5.5, я буду менять все свои DateTimeобъекты на DateTimeImmutable.

Списки в foreach

Это добавляет синтаксический сахар для некоторых циклов foreach. Мне это очень нравится

<?php

$users = [
    ['Foo', 'Bar'],
    ['Baz', 'Qux'],
];

foreach ($users as list($firstName, $lastName)) {
    echo "First name: $firstName, last name: $lastName. ";
}

?>

Пример был взят прямо из вики .

Наконец ключевое слово

Наконец, finallyключевое слово также реализовано в языке. (извините, пришлось это сделать).

finallyмогут быть добавлены в try..catchблок, и гарантирует , что независимо от того, что произошло в этом блоке, finallyбудет всегда выполняться.

<?php

try {

  echo "1";
  throw new Exception();

} catch (Exception $e) {

  // Handle exception
  echo "2";

} finally {

  echo "3";

}

?>

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

Разрешение имени класса

Я пишу много кода, который отображает структуры данных на классы. Пример этого можно увидеть в моем проекте vobject .

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

Более простой пример:

<?php

$class = 'Sabre\\VObject\\Property\\ICalendar\\CalAddress';
$obj = new $class();

?>

Ну, начиная с PHP 5.5, я могу вместо этого использовать такой синтаксис:

<?php

use Sabre\VObject\Property\ICalendar;

$class = ICalendar\CalAddress::class;
$obj = new $class();

?>

Гораздо чище и красивее! Особенно, если у вас есть сотни из них в одном файле.

Кэш кода операции теперь интегрирован и включен по умолчанию в PHP

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

Теперь это так, и не APC сделал это ядром, а скорее альтернативой Zend.

Дополнительную информацию можно найти в вики .

Постоянная разыменование

Это на самом деле просто модное слово для возможности сделать следующее:

<?php

echo "Hello"[1]; // output 'e'
echo [1,2,3,4][3]; // output '4'

?>

Почему это круто? Не уверен; Я все еще пытаюсь понять, когда я буду использовать это, но замечательно видеть, что движок PHP становится более последовательным.

Заключить