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__

Несколько комментариев

  1. Станислав пишет:

    Судя по todo, во 2-3 квартале этого года.

  2. AirWorker пишет:

    Ух, вкуснотища :)

    Когда же выйдет это чудо?

  3. Станислав пишет:

    Спасибо за ссылку

  4. Yaroslav Vorozhko пишет:

    Хорошая статья.
    Я более подробно описал про “Позднее статическое связывание” в своей статье на http://pro100pro.com/pozdnee_staticheskoe_svyazivanie
    Будет интересно почитай.

Оставить комментарий