PHP 5.3: что пых грядущий нам готовит?
То о чем так долго говорили большевики…
Кратенько:
- пространства имен
- mysqlnd
- позднее статическое связывание
- динамические вызовы статических методов
- Прочие изменения
А теперь подробно…
Пространства имен
/* Серое и унылое настоящее */
class MyAclSimpleRole {}
$a = new MyAclSimpleRole;
/* или (Zend FW) */
class My_Acl_Simple_Role {}
$a = new My_Acl_Simple_Role;
/* А теперь так */
namespace My::Acl::Simple;
class Role {}
/* По прежнему можем использовать полное имя */
$a = new My::Acl::Simple::Role;
/* А если use добавить... */
use My;
$a = new Acl::Simple::Role;
use My::Acl;
$a = new Simple::Role;
use My::Acl::Simple;
$a = new Role;
/* А если alias добавить, то вообще красота */
use My::Acl::Simple as defaultAcl;
$a = new defaultAcl::Role;
use My as default;
$a = new default::Acl::Role;
Помимо этого введена константа __NAMESPACE__, добавки в рефлексии, глобальное пространство "::".
Людям, использующим в названии классов идеологию, схожую с идеологией Zend Framework, данная фича очень понравится. Возможно она "под него" и вводилась
К сожалению не смог найти информацию о том, можно ли будет повесить обработчик на команду use, а следовательно анализировать и всячески инициализировать пространства.
mysqlnd (MySQL native driver)
Наконец то в РНР появится замена для libmysql, причем "заточенная" под PHP на C-шном уровне. Напомню, что в самом начале 5-ой ветки libmysqli пришлось убрать из ядра по лицензионным соображениям. mysqlnd же выпускается под лицензией PHP. Вы наверное уже обрадовались, что из-за нового API, сможете выбить из начальства время на review всего кода, работающего с БД?
К сожалению я не знаю код символа изображающего фигу, сейчас бы пригодился.
mysqlnd это низкоуровневая С-шная библиотека для работы с базой данных, а не новое расширение для PHP. mysqlnd уже "понимает" API ext/mysqli, поддержка PDO/MySQL сейчас пишеться, а поддержки ext/mysql не будет.
Уже приведены бенчмарки, и их результаты мягко говоря радуют.
Позднее статическое связывание
Проще всего текущее бедственное состояние будет пояснить на примере:
class Foo {
public static function whoIsItDrinkins() {
return __CLASS__;
}
}
class Bar extends Foo {}
echo Bar::whoIsItDrinkins(); //Foo
Проблема в том, что переменная указывающая на текущий класс (__CLASS__ или self) указывает на тот класс, в котором метод объявляется, а не тот, у которого он вызван.
Острее всего эта проблема проявляется при попытке реализовать в РНР паттерн ActiveRecord, и приводит к использованию грязноватых хаков
В версии 5.3 появится метод get_called_class(), который будет указывать на класс, у которого этот метод вызван.
class Foo {
public static function whoIsItDrinkins() {
return get_called_class();
}
}
class Bar extends Foo {}
echo Bar::whoIsItDrinkins(); //та-да!
__callstatic()
class FooFactory {
static function call() {
echo 'Простите все операторы сейчас заняты';
}
static function __callStatic( $methodname, $args ) {
echo '
Добрый день! Вы только вызвали статический метод ' . $methodname . '
';
echo '
С параметрами:
';
echo '
' . print_r( $args, true ) . '
';
echo '
Спасибо. Ваш вызов для нас очень важен.
';
}
}
FooFactory :: call();
FooFactory :: callAnotherTime('А ну отозвались!');
Давно пора. Это же какие красоты открываются. Можно например автоматом маппить поиски в, уже упомянутый, ActiveRecord:
$posted_articles = Articles::findByIsPosted(true);
$new_members = Member::findByRegistrationDateLessWhat($today);
И все это без единой дополнительной строчки в классах Article и Member!
Когда же появиться нативная функция для преобразования camel case в underlines
Динамические вызовы статических методов
$method = 'callAnotherTime';
FooFactory :: $method('Я вас каждый день вызывать буду!');
Практического применения я вот так сходу найти не смог, но но думаю оно как суслик, я его не вижу, а оно есть
Новый уровень ошибок E_DEPRECATED
Новый уровень позволит заранее начать избавляться от функционала, который впоследствии не будет поддерживаться
Конфигурационные файлы
- конфиги теперь можно делать для конкретной директории, а не использовать для этого .htaccess и php_value/php_admin_valie
- в php.ini добавлены секции для конкретных директорий. Их опции не могут переопределяться ни в скриптах, ни в конфигурационных файлах директорий
- сообщения об ошибках в конфигурационных файлах теперь более "говорящие"
- добавлена поддержка ключей для массивов
Прочие изменения
- в расширение openSSL добавленна поддержка алгоритма Диффи-Хеллмана, который необходим для тех, кто работает с OpenID.
- функция get_opt() теперь кроссплатформенная
- в расширение sqlite добавленна поддержка Sqlite3
- сделано несколько улучшений в SPL
- добавлена константа __DIR__, которая заменит dirname(__FILE__)
UPD: добавлена информация о __DIR__

Судя по todo, во 2-3 квартале этого года.
Ух, вкуснотища
Когда же выйдет это чудо?
Спасибо за ссылку
Хорошая статья.
Я более подробно описал про “Позднее статическое связывание” в своей статье на http://pro100pro.com/pozdnee_staticheskoe_svyazivanie
Будет интересно почитай.