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 становится более последовательным.