Pull to refresh

PHP 5.3: обзор

PHP *
Дни идут чередой, погода улучшается, а между тем 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() под ободком вашего унитаза?
$lambda = function() {echo 'Hello World!';};
$lambda();


* This source code was highlighted with Source Code Highlighter.

Также Вы можете сделать:
class myLambda
{
  public function __invoke() {echo 'Hello World!';}
}
$lambda = new myLambda;
$lambda();


* This source code was highlighted with Source Code Highlighter.
Более, того, можно задействовать переменные из области видимости контекста внутрь функции:
$var = 'Hello World!';
$func = function() use ($var) {echo $var;};
$func();


* This source code was highlighted with Source Code Highlighter.
Так очень удобно делать при использовании preg_replace_callback, и при задании событий.

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

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

3. namespaces. Пространства имён.
namespace hello;
class msg
{
 public static function write() {echo 'Hello';}
}
msg::write();
namespace World;
class msg
{
 public static function write() {echo ' World!';}
}
msg::write();


* This source code was highlighted with Source Code Highlighter.
Пример специально приведен несуразный. namespace'ы удобно использовать для логического объединения классов, для того чтобы константы не пересекались, и во многих других случаях. Рекомендую к использованию.
Разделитель namespace'ов в пути — обратный слеш (\).

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

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


* This source code was highlighted with Source Code Highlighter.
Однако, в этом я вижу очень мало практического применения.

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


* This source code was highlighted with Source Code Highlighter.
Полезная вещь при создании нетривиальных алгоритмов.
Эх, чешутся пальцы написать обфускатор кода :)

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

Спасибо crocodile2u.
Спасибо Sherman81 за наводку.

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

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

Наверняка я не учел что-то важное, прошу вежливо ткнуть меня в это носом, допишу.
Предлагаю всем принять участие в тестировании!
Tags:
Hubs:
Total votes 99: ↑90 and ↓9 +81
Views 8.1K
Comments Comments 329