Всем привет! Судя по слухам, 19 января, в свет должен был выйти очередной RC PHP 5.4. Возможно даже, что он будет финальным. А это значит, что нужно скорее заняться изучением новых возможностей.
Я несколько лет профессионально занимаюсь веб-разработкой и в качестве основного серверного языка использую PHP. Так что узнав о выходе столь крупного обновления, я отправился собирать информацию. Под катом shortlist самых значимых нововведений.
Ключевая новинка 5.4 — примеси. Они послужат в PHP заменой мультинаследования. Каждая примесь задается отдельным «классом» через ключевое слово trait. Внутри примеси могут быть определены методы, которые станут доступны в классе, к которому будут подключены примеси. Подключение примесей происходит с помощью языковой конструкции use. Имена примесей задаются через запятую и все их методы становятся доступны внутри класса.
Если имена методов класса и примесей совпадают, то приоритетным методом станет метод класса. К сожалению, в этом случае мы не получим даже Notice.
Примесь всегда имеет доступ к классу, к которому она подключена, через конструкцию parent.
Да-да. Больше не придется использовать расширения, вроде multibyte и ему подобных. Все строковые функции отлично понимают юникод.
Данная возможность — краеугольный камень для многих PHP разработчиков. Как часто нам нужно дернуть нулевой индекс у метода, который возвращает массив? Насколько сильно бесит то, что эту вроде бы простую операцию приходится записывать в две строки, да еще и переменную создавать? Теперь страдать больше не придется:
В PHP 5.4 теперь доступна короткая запись массива, без ключевого слова array.
Отныне, вместе с дистрибутивом PHP будет поставляться встроенный веб-сервер, предназначенный исключительно для разработки. Его можно будет запустить из консоли и повесить на какой-нибудь порт:
Несмотря на то, что в HTML 5 File API реализован механизм отслеживания процесса загрузки файла на сервер (размер загруженной части отдает сам браузер), в PHP 5.4 появится дополнительный источник мониторинга состояния загрузки. Он будет храниться в сессии пользователя в ключе, например, upload_progress_myform и мы в любой момент сможем дернуть его Ajax'ом длязахвата мира отрисовки прогресс-бара.
Еще одно приятное нововведение, которое поможет нам сэкономить строчку кода. Для того, чтобы вызвать свойство или метод класса, не нужно будет больше запоминать его в отдельную переменную.
PHP явно идет в сторону строгой типизации. Раньше для автоматической проверки типа в аргументах метода можно было указывать только массивы и имена классов. Теперь такая возможность распространяется на некоторые другие типы: int, float и boolean.
Оператор @ служит в PHP для отключения вывода ошибок на текущей строке кода. Раньше в высоко нагруженных приложениях использовать @ было невозможно из-за довольно ощутимых тормозов. Поэтому лично я ее больше не использую нигде.
В конце-концов приглушать ошибки — это странно. Ошибки нужно исправлять или ловить Exceptions.
Кроме того из PHP наконец-то выпилены register_globals, long_arrays и прочие директивы, заждавшиеся удаления.
Update: Исправил trail на trait, приношу свои извинения, спасибо DoctorChaos за наводку.
Update 2: Scalar type hints в PHP 5.4 не будет. Не смотря на это заявление, в SVN тэге 5.4 scalar type hints нет :( Спасибо Irker и sectus.
Я несколько лет профессионально занимаюсь веб-разработкой и в качестве основного серверного языка использую PHP. Так что узнав о выходе столь крупного обновления, я отправился собирать информацию. Под катом shortlist самых значимых нововведений.
Примеси
Ключевая новинка 5.4 — примеси. Они послужат в PHP заменой мультинаследования. Каждая примесь задается отдельным «классом» через ключевое слово trait. Внутри примеси могут быть определены методы, которые станут доступны в классе, к которому будут подключены примеси. Подключение примесей происходит с помощью языковой конструкции use. Имена примесей задаются через запятую и все их методы становятся доступны внутри класса.
Если имена методов класса и примесей совпадают, то приоритетным методом станет метод класса. К сожалению, в этом случае мы не получим даже Notice.
Примесь всегда имеет доступ к классу, к которому она подключена, через конструкцию parent.
class A {
public function foo() {
return 'foo';
}
}
trait B {
public function bar() {
return parent::foo() . ' bar';
}
}
class C extends A {
use B;
}
$c = new C();
echo $c->foo(); // foo
echo $c->bar(); // foo bar
Нативная поддержка Юникода
Да-да. Больше не придется использовать расширения, вроде multibyte и ему подобных. Все строковые функции отлично понимают юникод.
Array dereferencing support
Данная возможность — краеугольный камень для многих PHP разработчиков. Как часто нам нужно дернуть нулевой индекс у метода, который возвращает массив? Насколько сильно бесит то, что эту вроде бы простую операцию приходится записывать в две строки, да еще и переменную создавать? Теперь страдать больше не придется:
function foo() {
return array(1, 2, 3);
}
echo foo()[0]; // 1
Short syntax for arrays
В PHP 5.4 теперь доступна короткая запись массива, без ключевого слова array.
// Раньше приходилось писать так:
$array = array(1, 2, 3);
// Теперь можно так:
$array = [1, 2, 3];
// И даже так:
$array = ['first' => 1, 'second' => 2];
Встроенный веб-сервер
Отныне, вместе с дистрибутивом PHP будет поставляться встроенный веб-сервер, предназначенный исключительно для разработки. Его можно будет запустить из консоли и повесить на какой-нибудь порт:
php -S localhost:8000
Upload progress
Несмотря на то, что в HTML 5 File API реализован механизм отслеживания процесса загрузки файла на сервер (размер загруженной части отдает сам браузер), в PHP 5.4 появится дополнительный источник мониторинга состояния загрузки. Он будет храниться в сессии пользователя в ключе, например, upload_progress_myform и мы в любой момент сможем дернуть его Ajax'ом для
Вызов метода или свойства класса выражением
Еще одно приятное нововведение, которое поможет нам сэкономить строчку кода. Для того, чтобы вызвать свойство или метод класса, не нужно будет больше запоминать его в отдельную переменную.
class A {
public static function foo_bar() {
return '123';
}
}
$foo = 'foo';
$bar = 'bar';
echo A::{$foo . '_' . $bar}(); // 123
Scalar type hints
PHP явно идет в сторону строгой типизации. Раньше для автоматической проверки типа в аргументах метода можно было указывать только массивы и имена классов. Теперь такая возможность распространяется на некоторые другие типы: int, float и boolean.
function foo(int $a, bool $b) {
return true;
}
Улучшена производительность @
Оператор @ служит в PHP для отключения вывода ошибок на текущей строке кода. Раньше в высоко нагруженных приложениях использовать @ было невозможно из-за довольно ощутимых тормозов. Поэтому лично я ее больше не использую нигде.
В конце-концов приглушать ошибки — это странно. Ошибки нужно исправлять или ловить Exceptions.
Deleted
Кроме того из PHP наконец-то выпилены register_globals, long_arrays и прочие директивы, заждавшиеся удаления.
Использованная литература
Update: Исправил trail на trait, приношу свои извинения, спасибо DoctorChaos за наводку.
Update 2: Scalar type hints в PHP 5.4 не будет. Не смотря на это заявление, в SVN тэге 5.4 scalar type hints нет :( Спасибо Irker и sectus.