PHP 5.3: обзор

Discussion in 'PHP' started by Trieg, 12 Jun 2009.

  1. Trieg

    Trieg Elder - Старейшина

    Joined:
    26 Oct 2007
    Messages:
    82
    Likes Received:
    9
    Reputations:
    0
    Дни идут чередой, погода улучшается, а между тем PHP 5.3 всё ближе и ближе — надо быть во всеоружии.
    Недавно вышел RC2, затем будет RC3, а затем Stable (примерно через месяц).

    Первое, о чем хочется сказать: 5.2 медленнее 5.1, но 5.3 быстрее 5.1. В 5.3 введено много оптимизаций (в том числе таблиц связей), и это не может не радовать.

    Особенных проблем обратной совместимости нет, за исключением введения новых зарезервированных слов и других малозначительных моментов.
    Подробно они описаны тут — wiki.php.net/doc/scratchpad/upgrade/53

    Помимо этого есть много новшеств:


    1. mysqlnd.
    Как известно, PHP общается с MySQL-сервером посредством C-wrapper'а над libmysql, однако реализация имеет огромный оверхед (к примеру, когда Вы делаете mysql_fetch_assoc, результат имеет аж три копии в памяти).
    MySQL Native Driver представляет собой эффективную замену libmysql на C-уровне. Однако, интерфейсы (mysql, mysqli, PDO) не должны никак от этого пострадать.


    2. Closures.
    Вам надоело видеть create_function() под ободком вашего унитаза?
    PHP:
    $lambda = function() {echo 'Hello World!';};
    $lambda();
    Также Вы можете сделать:
    PHP:
    class myLambda
    {
      public function 
    __invoke() {echo 'Hello World!';}
    }
    $lambda = new myLambda;
    $lambda();
    Более, того, можно задействовать переменные из области видимости контекста внутрь функции:
    PHP:
    $var 'Hello World!';
    $func = function() use ($var) {echo $var;};
    $func();
    Так очень удобно делать при использовании preg_replace_callback, и при задании событий.

    Использовать $this в коде замыкания недопустимо. Это планировалось изначально, но у разработчиков возникли технические проблемы.
    Однако, можно передать ссылку на объект, используя use, это позволит получит доступ к публичным интерфейсам.

    Мануал по адресу http://wiki.php.net/rfc/closures


    3. namespaces. Пространства имён.
    PHP:
    namespace hello;
    class 
    msg
    {
     public static function 
    write() {echo 'Hello';}
    }
    msg::write();
    namespace 
    World;
    class 
    msg
    {
     public static function 
    write() {echo ' World!';}
    }
    msg::write();
    Пример специально приведен несуразный. namespace'ы удобно использовать для логического объединения классов, для того чтобы константы не пересекались, и во многих других случаях. Рекомендую к использованию.
    Разделитель namespace'ов в пути — обратный слеш (\).

    Мануал по адресу http://ru.php.net/namespaces


    4. Тернарный оператор.
    Можно использовать без указания true-альтернативы, тогда ей становится само значение.
    PHP:
    $var 'Hello World!';
    echo 
    $var?:'false';
    // Hello World!
    Однако, в этом я вижу очень мало практического применения.


    5. Label'ы. Аналог GOTO.
    Label'ы это именованные позиции в коде к которым можно осуществить переход, разумеется между уровнями переходить нельзя, и для каждого своя область видимости Label'ов.
    PHP:
    $i 1;
    start:
    echo (
    $i 1?'-':'').$i;
    if (
    $i++ < 5) {goto start;}
    echo 
    ' вышел зайчик погулять';
    // 1-2-3-4-5 вышел зайчик погулять
    Полезная вещь при создании нетривиальных алгоритмов.
    Эх, чешутся пальцы написать обфускатор кода :)


    6. Garbage Collector.
    Наконец-то в PHP появился нормальный сборщик мусора, то есть можно будет писать долгоиграющие скрипты без утечек памяти.


    7. SPL.
    Во-первых: http://www.php.net/~helly/php/ext/spl/

    И кроме того, о значимых нововведениях: SplFixedArray, SplStack, SplDoublyLinkedList, SplQueue, SplPriorityQueue. Некоторые новые структуры данных при определенных условиях дают прирост производительности.

    Посмотреть информацию о классах, интерфейсах и функциях Spl можно в phpinfo() или из командной строки:
    $ php -i|less
    $ php -r 'var_export(spl_classes());'
    $ php --re spl|less


    8. Late Static Binding
    Появился магический метод __callStatic и функция get_called_class().
    Это очень полезное нововведение.

    Помимо этого обновили PCRE до 7.9 (заявлено исправление многих багов), sqlite улучшили, и еще много чего вкусного.

    Автор:TravisBickle
    Оригинал статьи: http://habrahabr.ru/blogs/php/59876/