История обновлений PHP

Категория: PHP

Нововведения в PHP 5.5

  1. Генераторы (generators) - простой способ краткого описания итераторов с помощью ф-ции, внутри которой указано ключевое слово yield, автоматически становится генератором (код benchmark'апример генератора). Конструкция yield, возвращает итерируемые элементы. Соль в том, что при использовании итератора, нет необходимости полностью генерировать массив значений - итератор будет возвращать следующее значение по мере необходимости, что позволяет работать с бесконечными потоками данных. Все это также можно сделать с помощью класса имплементирующего интерфейс Iterator.
    Генераторы дают простоту, и вам не нужно вручную имплементировать пять разных методов на каждый итератор - функция-генератор делает это за вас. По сути, ф-ция генератор возвращает объект Generator, который уже реализует интерфейс Iterator. Результат ф-ции генератора также содержит методы rewindcurrentnext - используя поочередно методы next и cerrent - вы также сможете получить все его значения.
  2. Подпрограммы (coroutine) - хорошо описаны здесь;
  3. Type Hinting все еще не работает со скалярами: Catchable fatal error: Argument 1 passed to foo() must be an instance of int, integer given;
  4. Zend OPcache - система кеширования и оптимизации байт-кода;
  5. Новое API хеширования паролей: password_hashpassword_verify:
    $php_hash = password_hash($password, PASSWORD_DEFAULT);
    password_verify($password, $php_hash) ? true : false;
  6. Строковые литералы и массивы (Const array/string dereference) - теперь можно обращаться к элементам массива или символам строк "на лету" по ключам:
    echo ['one', 'two'][mt_rand(0, 1)]; // one OR two
    echo 'sTring'[1]; // T
    echo 'строка'[1]; // � с юникодом, конечно же, все плохо
  7. empty(), isset() умеют проверять результат ф-ции:
    if ( ! empty(getSomeItems() ) {
    // ...
    }
  8. Модификатор e для ф-ции preg_replace получил статус deprecated. При ошибке: Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in file.php on line xxx перепишите ф-цию preg_replace на preg_replace_callback.
  9. Ф-ции mysql_* будут генерировать E_DEPRECATED. Используйте MySQLi или PDO_MySQL. Добавлены функции mysqli_begin_transaction(), mysqli::begin_transaction();
  10. Ф-ция boolval():
  11. var_dump(boolval('')); // bool(false) 
  12. Можно получить полное имя класса с namespace:
    <?php
    namespace App\Library;

    class File
    {
    public function __construct()
    {
    echo "Class name with namespace: " . self::class . ' == ' . get_class($this);
    }
    }

    new File(); // Class name with namespace: App\Library\File == App\Library\File
  13. try/catch/finally (подробнеееще) - блок finally выполняется всегда (даже когда исключение не было брошено) по завершении блока try/catch.
  14. list работает внутри foreach:
    $tags = array(
    array(1, 'php', 'PHP'),
    array(2, 'js', 'JavaScript'),
    );

    foreach ($tags as list($id, $key, $tag)) {
    echo "$id : $key : $tag<br>";
    }
  15. Новая ф-ция array_column для получения столбца с заданным ключем из вложенных массивов:
    $records = array(
    array(
    'id' => 2135,
    'first_name' => 'John',
    'last_name' => 'Doe'
    ),
    array(
    'id' => 3245,
    'first_name' => 'Sally',
    'last_name' => 'Smith'
    )
    );

    $first_names = array_column($records, 'first_name');
    print_r($first_names); // Array ( [0] => John [1] => Sally )
  16. Добавили поддержку атрибута Max-Age в setcookie();

PHP 5.4

  1. Трейты - это новый инструментарий для повторного использования кода;

PHP 5.3

  1. Type Hinting - реализация поддерживает классы, интерфейсы, array, self и parent. Простые типы не поддерживаются. Для интерфейсов здесь имеется в виду проверка не типов, а количества аргументов в методах.
  2. Сокращенная запись тернарного оператора ?: - можно опускать второй оператор, и если его значение булево истинно - оно и возвращается. Удобно использовать при проверке и установке дефолтного значения:
    $var = $var ?: 'default';
  3. Магический метод  __callStatic() - вызывается только при запросе несуществующего статического метода и только вне контекста созданного объекта этого класса! Если не инстанцировать объект этого класса, то метод  __callStatic() будет отрабатывать как надо. Подробнее здесь - http://habrahabr.ru/post/175935/
    <?php
    abstract class A
    {
        public function __call()
        {
            echo __METHOD__;
        }
    }
    
    class B extends A
    {
        public function __construct()
        {
            // Если будет создан экземпляр этого класса, то 
            // все вызовы будут запускать метод A::__call()
            self::someStaticMethod();
            static::someStaticMethod();
            B::someStaticMethod();
        }
    }
    
    $o = new B();
  4. Что я забыл?

категория: PHP