Выставляю на суд общественности свою заметку про грядущий PHP5.3
Доброго времени суток.
На конференции http://www.php.net/cal.php?id=3028 была показана презентация, рассказывающая о новых возможностях и отличиях PHP5.3. Сейчас я расскажу вам про некоторые изменения, подробнее вы сможете ознакомиться с ними просмотрев http://ilia.ws/files/phpquebec_php53.pdf.
Основные изменения направлены на исправление багов, безпроблемную работу старого кода и развитие существующего функционала. Также были добавлены пространства имён (namespace). Следующий пример из презентации иллюстрирует их использование. Код в старом стиле:
| Код | function MY_wrapper() {} class MY_DB { } define('MY_CONN_STR', '');
MY_wrapper(); new MY_DB(); MY_CONN_STR;
|
А вот с использованием namespace:
| Код | namespace MY; function wrapper() {} class DB { } const CONN_STR = '';
use MY AS MY; wrapper(); new DB(); CONN_STR;
|
Другие изменения:- md5() работает приблезительно на 15% быстрее
- Масса улучшений в движке
- Константы перемещены в read-only область памяти
- Усовершенствована обработка исключений (exceptions)
- Добавлена магическая константа __DIR__, хранящая в себе директорию, в которой расположен выполняющийся скрипт
- Добавлена возможность быстрого присваивания значения по умолчанию при помощи оператора ?: (подробнее об этом ниже)
- Добавлен магический метод __callStatic(), аналогичный __call, но вызываемый как статический (myclass::foo())
- Динамический вызов статических методов: $a = 'helper'; $b = 'foo'; $a::$b() //вызовет helper::foo()
- MySQLInd, ini-magic, openSSL, работа с датой, XSLT, уборка мусора, строки NOWDOC и многое другое
Теперь подроблее про оператор <b>?:</b>. Как вы знаете, существует сокращённый условный оператор "условие ? оператор1 : оператор2". В PHP6 собирались ввести краткий вариант: "условие ?: оператор1", который пригодился бы в случае, когда нам не нужен оператор2 (выполняющийся в случае ложности условия). Теперь же вы видим, что этот оператор появился в PHP5.3, но с несколько иным значением. Пример использования:
| Код | $a = true ?: false; // true $a = false ?: true; // true $a = "" ?: 1; // 1 $a = 0 ?: 2; // 2 $a = array() ?: array(1); // array(1); $a = strlen("") ?: strlen("a"); // 1
|
Изменено поведение статических методов:
| Код | class A { public static function whoami() { echo __CLASS__; }
public static function identity() { self::whoami(); } }
class B extends A { public static function whoami() { echo __CLASS__; } }
B::identity(); // A <-- PHP < 5.3
|
| Код | class A { public static function whoami() { echo __CLASS__; }
public static function identity() { static::whoami(); } }
class B extends A { public static function whoami() { echo __CLASS__; } }
B::identity(); // B <-- >= PHP 5.3
|
crosspost in http://w-name.ru/blog |