Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

PHP для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 59, средняя оценка - 4.66
Azdeman
Фрилансер
Эксперт HTML/CSSЭксперт PHP
1708 / 1252 / 334
Регистрация: 12.01.2011
Сообщений: 4,957
#1

PHP7 Что нового? - PHP

05.12.2015, 15:46. Просмотров 12241. Ответов 15
Метки нет (Все метки)

Здравствуйте уважаемые форумчане, как вы все знаете вышла новая версия языка программирование PHP. Многие его ждали и вот свершилось чудо. Так что теперь есть возможность почитать в этой теме что нового предоставили нам разработчики. Так же вы можете уже Скачать новую версию PHP7.. Всех Благ!
  • Улучшение быстродействия. PHP 7 работает до двух раз быстрее чем PHP 5.6.
  • Добавлена поддержка сокращенной конструкции use:
    PHP
    1
    2
    3
    4
    5
    
    use Symfony\Component\Console\{
      Helper\Table,
      Question\ChoiceQuestion as Choice,
      Question\ConfirmationQuestion,
    };
  • Добавлен оператор "??" (Null coalescing operator), позволяющий проверить переменную на существование и вернуть ее значение либо значение по умолчанию.
    Например следующая конструкция:
    PHP
    1
    
    $action = isset($_POST['action']) ? $_POST['action'] : 'index';
    Теперь может быть коротко записана так:
    PHP
    1
    
    $action = $_POST['action'] ?? 'index';
  • Добавлена поддержка строк длиной больше 2^31 байт в 64-битных билдах.
  • Добавлен метод Closure::call(object $to[, mixed $parameters]), позволяющий вызвать анонимную функцию с произвольным $this.
  • Добавлен синтаксис \u{xxxxxx} для строк, позволяющий указывать произвольные Unicode символы в строках.
  • В качестве значения констант, объявляемых через define() теперь можно указывать массивы.
  • Добавлен новый оператор сравнения <=>, так же известный как «spaceship operator». Конструкция $a <=> $b возвращает -1, 0 или +1 если $a соответственно меньше, равно или больше $b. Удобно использовать в колбэках для usort().
  • Зарезервированные ключевые слова теперь можно использовать в качестве имен методов:
    PHP
    1
    
    $object::new('foo', 'bar')->forEach(function($index, $item) {});
  • Синтаксис конструкторов в стиле PHP 4 (имя метода конструктора совпадает с именем класса) теперь считается устаревшим.
  • Статичные вызовы (: нестатичных методов теперь считаются устаревшими.
  • Добавлена константа PHP_INT_MIN.
  • Удалена INI директива «asp_tags». Попытка включить ее приведет к фатальной ошибке. Так же удалена поддержка тэгов в стиле ASP (<%).
  • Удалена INI директива «always_populate_raw_post_data». Переменная $HTTP_RAW_POST_DATA соответственно больше не доступна. Вместо нее используйте дескриптор входного потока php://input.
  • Итерация по массиву при помощи foreach() больше не сдвигает внутренний указатель массива, который можно получать и изменять при помощи функций current()/next()/reset() и им подобных. Так же foreach по значению теперь всегда работает с копией массива.
  • Оператор левого побитового сдвига (<<) на количество бит, превышающее количество бит в integer теперь всегда возвращает 0. До этого результат зависел от архитектуры процессора. Аналогичный правый сдвиг всегда дает 0 или -1 в зависимости от знака исходного числа (Сдвиг не влияет на старший бит, отвечающий за знак).
  • Строки, содержащие шестнадцатеричные числа теперь всегда обрабатываются как строки и не обрабатываются как числа: is_numeric(«0xFF») теперь false, раньше было true со всеми вытекающими.
  • Целые числа в 64-х битных билдах для Windows теперь представляются в виде 64-х битных, а не как раньше, 32-х, что делало использование х64 сборок на Windows бессмысленным занятием, если нужны манипуляции с большими числами.
  • Удалена поддержка модификатора /e в PCRE. Аналогичная функциональность может быть реализована функцией preg_replace_callback().
  • Добавлена поддержка type-hint'ов для скалярных типов. Ранее контроль типов был возможен только для классов, интерфейсов, массивов и типа callable.
  • Удалены старые и не поддерживаемые SAPI и расширения.

    Изменения в обработке переменных
    1. Косвенные ссылки на переменные, свойства и методы теперь разбираются слева направо. Восстановить прежний порядок можно фигурными скобками.
    PHP
    1
    2
    3
    4
    
    $$foo['bar']['baz']   // разбирается как ($$foo)['bar']['baz']    - ранее как ${$foo['bar']['baz']}
    $foo->$bar['baz']   // разбирается как ($foo->$bar)['baz']    - ранее как $foo->{$bar['baz']}
    $foo->$bar['baz']() // разбирается как ($foo->$bar)['baz']() - ранее как $foo->{$bar['baz']}()
    Foo::$bar['baz']()   // разбирается как (Foo::$bar)['baz']()   - ранее как Foo::{$bar['baz']}()
    2. Ключевое слово global принимает только простые переменные. Вместо global $$foo->bar следует писать global ${$foo->bar}
    3. Скобки вокруг переменных или вызовов функций больше не влияют на поведение. Например, код, где результат функции передается по ссылке:
    PHP
    1
    2
    3
    4
    5
    6
    
    function getArray() { return [1, 2, 3]; }
     
          $last = array_pop(getArray());
          // Strict Standards: Only variables should be passed by reference
          $last = array_pop((getArray()));
          // Strict Standards: Only variables should be passed by reference
    сейчас выбросит ошибку strict standards вне зависимости от скобок (ранее во втором вызове ее не было).

    4. Элементы массива или свойства объекта, которые были автоматически созданы во время присвоений по ссылке сейчас будут иметь другой порядок. Код:
    PHP
    1
    2
    3
    4
    
    $array = [];
          $array["a"] =& $array["b"];
          $array["b"] = 1;
          var_dump($array);
    сейчас сгенерирует массив [«a» => 1, «b» => 1], тогда как ранее был [«b» => 1, «a» => 1].

    Изменения в обработке list()
    1. list() теперь присваивает переменные в прямом порядке (ранее — в обратном), например:
    PHP
    1
    2
    
     list($array[], $array[], $array[]) = [1, 2, 3];
          var_dump($array);
    сейчас выдаст $array == [1, 2, 3] вместо [3, 2, 1]. Изменился только порядок присвоения, т.е. нормальное использование list() не затронуто.

    2. Присвоения с пустым списком list() стали запрещены, следующие выражения ошибочны:
    PHP
    1
    2
    3
    
    list() = $a;
    list(,,) = $a;
    list($x, list(), $y) = $a;
    3. list() больше не поддерживает распаковку строк (ранее поддерживалась в некоторых случаях). Код:
    PHP
    1
    2
    
    $string = "xy";
    list($x, $y) = $string;
    установит $x и $y в значение null (без предупреждений) вместо $x == «x» и $y == «y». Более того, list() теперь гарантированно работает с объектами, реализующими интерфейс ArrayAccess, т.е. вот так заработает:
    PHP
    1
    
    list($a, $b) = (object) new ArrayObject([0, 1]);
    Ранее в обе переменные был бы занесен null.
    Изменения в foreach
    1. Итерации в foreach() больше не влияют на внутренний указатель массива, который доступен через семейство функций current()/next()/…
    PHP
    1
    2
    3
    4
    
    $array = [0, 1, 2];
          foreach ($array as &$val) {
              var_dump(current($array));
          }
    сейчас напечатает int(0) три раза. Ранее — int(1), int(2), bool(false)
    2. Во время итерирования массивов по значению, foreach теперь пользуется копией массива, и его изменения внутри цикла не повлияют на поведение цикла:
    PHP
    1
    2
    3
    4
    5
    6
    
    $array = [0, 1, 2];
          $ref =& $array; // необходимо, чтобы включить старое поведение
          foreach ($array as $val) {
              var_dump($val);
              unset($array[1]);
          }
    Код напечатает все значения (0 1 2), ранее второй элемент выкидывался — (0 2).
    3. Когда итерируются массивы по ссылке, изменения в массиве будут влиять на цикл. Предполагается, что PHP лучше будет отрабатывать ряд случаев, например, добавление в конец массива:
    PHP
    1
    2
    3
    4
    5
    
     $array = [0];
          foreach ($array as &$val) {
              var_dump($val);
              $array[1] = 1;
          }
    проитерирует и добавленный элемент. Вывод будет «int(0) int(1)», ранее было только «int(0)».

    4. Итерирование обычных (не Traversable) объектов по значению или по ссылке будет вести себя как итерирование по ссылке для массивов. Ранее — аналогично, за исключением более точного позиционирования из предыдущего пункта.

    5. Итерирование Traversable объектов не изменилось.

    Изменения в обработке аргументов функций
    1. Больше нельзя использовать одинаковые имена для аргументов (будет ошибка компиляции):
    PHP
    1
    2
    3
    
    public function foo($a, $b, $unused, $unused) {
              // ...
          }
    2. Функции func_get_arg() и func_get_args() теперь вернут текущее значение (а не исходное). Например:
    PHP
    1
    2
    3
    4
    5
    
      function foo($x) {
              $x++;
              var_dump(func_get_arg(0));
          }
          foo(1);
    выведет «2» вместо «1».
    3. Похожим образом трейсы в исключениях не будет выводить оригинальные значения, а уже измененные:
    PHP
    1
    2
    3
    4
    5
    
    function foo($x) {
              $x = 42;
              throw new Exception;
          }
          foo("string");
    теперь выдаст:
    Stack trace: #0 file.php(4): foo(42) #1 {main}

    Ранее было бы так:
    Stack trace: #0 file.php(4): foo('string') #1 {main}

    Хоть это и не влияет на исполнение, но следует иметь это в виду при отладке. То же ограничение теперь и в debug_backtrace() и прочих функциях, исследующих аргументы.

    Изменения в обработке integer
    1. Некорректные восьмеричные числа будут выдавать ошибку компиляции:
    PHP
    1
    
     $i = 0781; // 8 - неверный разряд для восьмеричного числа
    Ранее все после некорректного разряда отбрасывалось, и в $i была бы 7.
    2. Побитовые сдвиги на отрицательные числа теперь бросают ArithmeticError:
    PHP
    1
    2
    
    var_dump(1 >> -1);
          // ArithmeticError: Bit shift by negative number
    3. Сдвиг влево на число, большее разрядности, вернет 0:
    PHP
    1
    
    var_dump(1 << 64); // int(0)
    Ранее поведение зависело от архитектуры, на x86 и x86-64 результат был == 1, т.к. сдвиг был циклическим.
    4. Аналогично сдвиг вправо даст 0 или -1 (зависит от знака):
    PHP
    1
    2
    
    var_dump(1 >> 64);  // int(0)
          var_dump(-1 >> 64); // int(-1)
    Изменения в обработке ошибок
    1. Больше не парсятся в числа строки с шестнадцатиричными числами:
    PHP
    1
    2
    3
    4
    5
    6
    
    var_dump("0x123" == "291");     // bool(false)     (ранее true)
          var_dump(is_numeric("0x123"));  // bool(false)     (ранее true)
          var_dump("0xe" + "0x1");        // int(0)          (ранее 16)
     
          var_dump(substr("foo", "0x1")); // string(3) "foo" (ранее "oo")
          // Notice: A non well formed numeric value encountered
    filter_var() может использоваться для проверки строки на содержание шестнадцатиричного числа или конвертации в обычное число:
    PHP
    1
    2
    3
    4
    5
    6
    
    $str = "0xffff";
        $int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX);
        if (false === $int) {
            throw new Exception("Invalid integer!");
        }
        var_dump($int); // int(65535)
    2. Из-за добавления эскейп-синтаксиса для юникода, строки в двойных кавычках и heredoc должны это учитывать:
    PHP
    1
    
    $str = "\u{xyz}"; // Fatal error: Invalid UTF-8 codepoint escape sequence
    Необходимо двойное экранирования слэша:
    PHP
    1
    
    $str = "\\u{xyz}";
    Хотя простое "\u" без последующей { не затронуто, и вот так заработает без изменений:
    PHP
    1
    
    $str = "\u202e";
    Из других изменений документ отмечает теперь отсутствие $this для нестатических методов, вызванных статически (ранее метод использовал $this вызывающего контекста).

    Пополнился, что логично, список недоступных для классов, трейтов и интерфейсов имен — добавлены bool, int, float, string, null, false, true, а также для будущего использования: resource, object, mixed, numeric.

    Конструкт yield не требует больше скобок при использовании в выражениях. Он теперь право-ассоциативный оператор с приоритетом между «print» и "=>". Поэтому поведение может измениться:

    PHP
    1
    2
    3
    4
    5
    
    echo yield -1;
          // ранее интерпретировалось как
          echo (yield) - 1;
          // а сейчас как
          echo yield (-1);
    PHP
    1
    2
    3
    4
    5
    
    yield $foo or die;
          // ранее интерпретировалось как
          yield ($foo or die);
          // а сейчас как
          (yield $foo) or die;
    Эти случаи рекомендуется принудительно уточнять скобками.

    Из заметных изменений в стандартной библиотеке функций отмечу только удаление call_user_method() и call_user_method_array(), остальное не столь значительно (выкинули dl() в php-fpm, переименовали и оптимизировали zend_qsort -> zend_sort, добавили zend_insert_sort, немного поменяли поведение setcookie при пустом имени cookie и убрали фатальную ошибку ob_start внутри буферизации).

    Производительность
    Самой большой причиной для перехода на PHP7 является его производительность, которая своими характеристиками в первую очередь обязана phpng. Увеличение производительности может стать решающим фактором для быстрого перехода на 7ю версию маленькими хостерами, ведь им удастся разместить больше клиентов на том же оборудовании.

    На текущий момент дела обстоят следующим образом: PHP7 находится на одном уровне с HHVM, написанным фейсбуком, который работает в качестве Just In Time (JIT) компилятора, переводящего PHP-код в машинные инструкции.

    PHP7 не имеет JIT-компилятора, хотя было много дискуссий о нем. Непонятно какой прирост производительности даст этот шаг, но уверен, будет интересно посмотреть, если кто-то все же решится его сделать!

    В дополнение к производительности, приятным побочным эффектом оптимизации внутренней структуры данных будет и значительная экономия памяти.


    Более подробный список изменений на английском языке можно найти в указанных источниках:
    http://php.net/
    http://github.com/php/php-src/blob/p...pha1/UPGRADING
    https://secure.php.net/manual/en/migration70.php
    Ссылка на скачивания PHP7
    http://php.net/downloads.php#v7.0.0
    __________
    PHP-Дайджест № 75 – интересные новости, материалы и инструменты (22 ноября – 6 декабря 2015)
19
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2015, 15:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос PHP7 Что нового? (PHP):

Mysql_real_escape_string в PHP7 - PHP
Всем доброго ) У меня вот такая проблема. Особо что у PHP7 нового не интересовался, но вот оказываться что функция...

Call_user_func_array php7 - PHP
При переходе на php7 возникла ошибка Function name must be a string $result = call_user_func_array(array($oModule, $sMethod),...

PHP5 -> PHP7 - PHP
Здраствуйте. Я только начинающий в PHP. У меня есть один сервер, написан на PHP5. Для этого сервера есть различные дополнения и плагины,...

Php5 -> php7 - PHP
Здравствуйте. решил перевести свой сайт на php7 но проблема в том, что он на myslq и само ядро написано под myslq. Нужно перевести на...

Проблемы с PHP7 - PHP
Здравствуйте. Работаю на Ubuntu и установил LAMP &gt; (тоже самое что и WAMP). Эта зараза установила самую последнюю версию PHP, а сайт,...

Function PHP7 PDO - PHP
Добрый день PHP 7, PDO Подскажи, как разбить по функциям данный код Есть подключение к БД в отдельном файле private $pdo; ...

15
Para bellum
Эксперт PHP
3012 / 2775 / 594
Регистрация: 06.01.2011
Сообщений: 8,090
13.10.2016, 12:28 #16
Цитата Сообщение от Киберсемантика Посмотреть сообщение
Зачем спрашивается делать движок не поддерживающий старые коды - непонятно
Ну, вот так. Всё на свете поддерживать не получится. Скажем, тот же, устраивающий Вас PHP5, не совместим с PHP 3, скажем.
Да и что-то сомневаюсь, что у Вас прямо по всему проекту циклы, в которых меняется состояние исходного массива.
Подогнать под PHP7 за неделю целый портал можно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2016, 12:28
Привет! Вот еще темы с ответами:

Openssl windows php7 - PHP
Добрый день! После установки php7 не получается подключить openssl вроде сделано все, как обычно - в php.ini: extension_dir =...

Передача по ссылке PHP7+ - PHP
Как собственно можно передать в PHP7+ значение по ссылке, для волшебного метода __call в классе ? (Сразу хочу отсечь намёки использовать ) ...

Скрипт долго выполняется в PHP7 - PHP
Дорой ночи всем! У меня возникла такая вот проблема, есть скрипт для проверки например SQLinjection в строке, при подключении к сайту по...

Изучать PHP5 или PHP7 ? - PHP
Вопрос настоящим гуру PHP :) Я знаю только основы пхп. Сейчас хочу основательней его изучить. И есть у меня на выбор сразу 2 книги одного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Yandex
Объявления
13.10.2016, 12:28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru