Дни идут чередой, погода улучшается, а между тем 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/