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