Suggest a feature
×

Welcome to TagMyCode

Please login or create account to add a snippet.
0
0
 
0
Language: Text
Posted by: Сергей Шевченко
Added: Oct 11, 2019 7:22 PM
Modified: Nov 14, 2019 8:29 AM
Views: 7
Tags: no tags
  1. Отличия версий PHP
  2. ==================
  3.  
  4. ### *7.0 ==> 7.1*
  5.  
  6. ---
  7.  
  8. #### 1. Обнуляемые типы
  9. Типы для параметров и возвращаемых значений могут быть помечены как обнуляемые путем добавления префикса в виде знака вопроса.
  10. Это означает, что указанные параметры и возвращаемые значения, могут быть как указанного типа, так и `NULL`.
  11. ```php
  12. function testReturn(): ?string
  13. {
  14.     return null;
  15. }
  16.  
  17. function test(?string $name) // Можно передать null: test(null), если ничего не передать, то будет ошибка
  18. {
  19.     var_dump($name);
  20. }
  21. ```
  22.  
  23.  
  24.  
  25. #### 2. Ничего не возвращающие функции
  26. Был добавлен тип возвращаемого значения `void`.
  27. NULL не является корректным значением для возврата
  28. ```php
  29. function test(): void
  30. {
  31.     return;
  32. }
  33. ```
  34.  
  35. ---
  36.  
  37. #### 3. Симметричная деструктуризация массива
  38. Можно использовать короткий синтаксис `[]` для деструктуризации массивов с целью присвоения (в том числе в foreach),
  39. как альтернатива функции `list()`
  40. ```php
  41. // используя list()
  42. list($id1, $name1) = $data[0];
  43. foreach ($data as list($id, $name));
  44.  
  45. // используя []
  46. [$id1, $name1] = $data[0];
  47. foreach ($data as [$id, $name]);
  48. ```
  49.  
  50. ---
  51.  
  52. #### 4. Видимость констант класса
  53. Добавлена поддержка определения области видимости для констант класса
  54. ```php
  55. class ConstDemo
  56. {
  57.     const PUBLIC_CONST_A = 1;
  58.     public const PUBLIC_CONST_B = 2;
  59.     protected const PROTECTED_CONST = 3;
  60.     private const PRIVATE_CONST = 4;
  61. }
  62. ```
  63.  
  64. ---
  65.  
  66. #### 5. Псевдотип iterable
  67. Был добавлен новый псевдотип (похожий на `callable`), названный `iterable`.
  68. Он может использоваться как параметр, так и в качестве возвращаемого значения там,
  69. где используется массив или объект, реализующий интерфейс `Traversable`.
  70. Что касается подтипов, типы параметров из дочерних классов могут расширить декларацию родителей типа `array` или `Traversable` до `iterable`.
  71. Для типов возврата, дочерние классы могут сужать тип возвращаемого значения с `iterable` до `array` или объекта реализующего `Traversable`.
  72. ```php
  73. function iterator(iterable $iter)
  74. {
  75.     foreach ($iter as $val);
  76. }
  77. ```
  78.  
  79. ---
  80.  
  81. #### 6. Обработка нескольких исключений в одном блоке catch
  82. В блоке catch теперь можно обрабатывать несколько исключений,
  83. перечисляя их через символ вертикальной черты `|`.
  84. Это может быть полезно, если различные исключения обрабатываются одинаково.
  85. ```php
  86. try {
  87.     // Какой то код
  88. } catch (FirstException | SecondException $e) {
  89.     // Обрабатываем оба исключения
  90. }
  91. ```
  92.  
  93. ---
  94.  
  95. #### 7. Поддержка ключей в `list()`
  96. Теперь вы можете указывать ключи в операторе `list()` или в его новом коротком синтаксисе `[]`.
  97. Это позволяет деструктурировать массивы с нечисловыми или непоследовательными ключами.
  98. ```php
  99. $data = [
  100.     ['id' => 1, 'name' => 'Tom'],
  101.     ['id' => 2, 'name' => 'Fred'],
  102. ];
  103.  
  104. // стиль list()
  105. foreach ($data as list('id' => $id, 'name' => $name));
  106.  
  107. // стиль []
  108. foreach ($data as ['id' => $id, 'name' => $name]);
  109. ```
  110.  
  111. ---
  112.  
  113. #### 8. Поддержка отрицательных смещений для строк
  114. Поддержка отрицательных смещений для строк добавлена в функции для работы со строками,
  115. а также в индексацию строк с помощью `[]` или `{}`.
  116. В этих случаях отрицательные смещения интерпретируются как смещения относительно конца строки.
  117. ```php
  118. echo 'abcdef'[-2]; // e
  119.  
  120. // Производим поиск в последних четырех символах (abcd),
  121. // ищем слева на права символ 'a'
  122. // узнаем его индекс в общей строке (zzzxxxabcd)
  123. echo strpos('zzzxxxabcd', 'a', -4); // 6
  124.  
  125. $string = 'abcde';
  126. echo 'Предпоследним символом в строке ' . $string . ' является ' . $string[-2]; // Предпоследним символом в строке abcde является d
  127. ```
  128.  
  129. ---
  130.  
  131. #### 9. Поддержка AEAD в ext/openssl
  132. Поддержка AEAD (режимы GCM и CCM) была добавлена путем расширения
  133. функций `openssl_encrypt()` и `openssl_decrypt()` дополнительными параметрами.
  134.  
  135. ---
  136.  
  137. #### 10. Преобразование `callable` в `Closure` с помощью `Closure::fromCallable()`
  138. В класс `Closure` добавлен новый статический метод для возможности легко преобразовать `callable` в объекты типа `Closure`.
  139. ```php
  140. class Test
  141. {
  142.     public function getPrivateMethod(): callable {
  143.         return Closure::fromCallable([$this, 'sumMethod']);
  144.     }
  145.  
  146.     private function sumMethod($x, $y): int {
  147.         print_r($x + $x); // Это сработает!
  148.         return $y + $y;
  149.     }
  150. }
  151.  
  152. $privateMethod = (new Test)->getPrivateMethod();
  153. echo $privateMethod(10, 5); // 1020
  154. ```
  155.  
  156. ---
  157.  
  158. #### 11. Асинхронная обработка сигналов
  159. Новая функция `pcntl_async_signals()` была добавлена для разрешения асинхронной обработки сигналов
  160. без использования тиков (которые производят много накладных расходов).
  161. ```php
  162. pcntl_async_signals(true); // включает асинхронные сигналы
  163.  
  164. pcntl_signal(SIGHUP,  function($sig) {
  165.     echo "SIGHUP\n";
  166. });
  167.  
  168. posix_kill(posix_getpid(), SIGHUP); // SIGHUP
  169. ```
  170.  
  171. ---
  172.  
  173. #### 12. Поддержка HTTP/2 server push в ext/curl
  174. Поддержка "server push" добавлена в расширение CURL (требуется версия 7.46 и выше).
  175. Использовать можно в функции curl_multi_setopt() с новой константой CURLMOPT_PUSHFUNCTION.
  176. Также добавлены константы CURL_PUSH_OK и CURL_PUSH_DENY для определения,
  177. был ли принят или отклонен "server push".
  178.  
  179. ---
  180.  
  181. #### 13. Контекстные опции потока
  182. Была добавлена опция контекста потока `tcp_nodelay`.
  183. Установка этой опции в TRUE сделает SOL_TCP,NO_DELAY=1 соответственно, таким образом, отключение алгоритма TCP Nagle
  184. Алгоритм Нейгла — назван в честь Джона Нейгла, является средством повышения эффективности работы сетей TCP/IP,
  185. позволяющим уменьшить количество пакетов, которые должны быть отправлены по сети.
  186. Документ Нейгла, Управление перегрузкой сетей IP/TCP (RFC 896) описывает то,
  187. что он назвал «проблемой небольших пакетов», которая заключается в том,
  188. что приложение неоднократно посылает данные небольшими порциями, часто размером в 1 байт.
  189. Так как TCP-пакеты имеют 40 байт заголовка (20 байт TCP, 20 байт IPv4), это приводит к тому,
  190. что передается пакет размером 41 байт, несущий в себе 1 байт полезной информации, то есть к огромным накладным расходам.
  191. Эта ситуация часто встречается в сессии Telnet, где большинство нажатий клавиш генерируют один байт данных,
  192. который немедленно передается. Кроме того, по медленным каналам связи многие такие пакеты могут находиться в пути в одно и то же время,
  193. что может привести к перегруженности сети.
  194.  
  195. ---
  196.  
  197. #### 14. Вызов исключения при передаче функции недостаточного количества аргументов
  198. Ранее, если пользовательская функция вызывалась с недостаточным количеством аргументов, выдавалось предупреждение.
  199. Теперь же, вместо предупреждения будет вызываться исключение класса Error.
  200. Это изменение затрагивает только пользовательские функции и не оказывает влияния на встроенные.
  201. ```php
  202. function test($param){}
  203. test();
  204. ```
  205.  
  206. ---
  207.  
  208. #### 15. Запрет динамического вызова функций интроспекции области видимости
  209. Динамические вызовы определенных функций были запрещены (в виде $func() или array_map('extract', ...), и т.д.) Эти функции проверяют или модифицируют объекты другой области видимости, чем вызывают неоднозначное и неопределенное поведение. Список таких функций:
  210.  
  211. - assert() - со строкой в качестве первого аргумента
  212. - compact()
  213. - extract()
  214. - func_get_args()
  215. - func_get_arg()
  216. - func_num_args()
  217. - get_defined_vars()
  218. - mb_parse_str() - с одним аргументом
  219. - parse_str() - с одним аргументом
  220. ```php
  221. $func = 'func_num_args';
  222. $func();
  223. ```
  224.  
  225. ---
  226.  
  227. #### 16. Значение `error_log` изменено на `syslog`
  228. Если ini-параметр `error_log` установлен как `syslog`, то уровни ошибок PHP проецируются на уровни ошибок "syslog".
  229. Это позволяет более тонко логировать события, а не как раньше, когда все они записывались с уровнем "notice".
  230.  
  231. ---
  232.  
  233. #### 17. Присвоение через механизм доступа к элементу строки по индексу применительно к пустой строке
  234. Модификация символа в пустой строке теперь работает так же как и для не пустой.
  235. Т.е. запись по несуществующему смещению приведет к преобразованию не целочисленного значения смещения к целому числу,
  236. дополнению строки до нужной длины символами пробела и использованию только первого символа из присваиваемой строки.
  237. Раньше, в такой ситуации, пустая строка рассматривалась как пустой массив.
  238. ```php
  239. $a = '';
  240. $a[5] = 'foo';
  241. print_r($a);
  242. // 7.0 => Array([5] => foo)
  243. // 7.1 => '     f'
  244. ```
  245.  
  246. ---
  247.  
  248. #### 18. Порядок массива был изменен, когда элементы созданы автоматически через присвоение по ссылке
  249. Порядок расположения элементов массива,
  250. создаваемых присвоением по ссылке не созданных на момент присвоения элементов, был изменен
  251. ```php
  252. $array = [];
  253. $array["a"] =& $array["b"];
  254. $array["b"] = 1;
  255. print_r($array);
  256.  
  257. // 7.0 --> Array([b] => 1, [a] => 1)
  258. // 7.1 --> Array([a] => 1, [b] => 1)
  259. ```
  260.  
  261. ---
  262.  
  263. #### 19. Конструктор DateTime использует микросекунды
  264. Теперь `DateTime` и `DateTimeImmutable` используют микросекунды при создании с текущим временем,
  265. либо в явном виде, либо со строкой относительного времени (например, "first day of next month").
  266. Это означает, что сравнение двух подряд созданных экземпляров класса скорее будет возвращать FALSE нежели TRUE:
  267. ```php
  268. // 7.0 => true
  269. // 7.1 => false
  270. new DateTime() == new DateTime();
  271. ```
  272.  
  273. ---
  274.  
  275. #### 20. `session_start()` теперь возвращает `FALSE` и больше не инициализирует `$_SESSION`, когда она не смогла запустить сессию.
  276.  
  277. ---
  278.  
  279. #### 21. Исправлена несогласованность `$this`
  280. В то время как `$this` считается специальной переменной в PHP,
  281. ей не хватало специальных проверок, что ее не используют в качестве переменной и не переопределили.
  282. Теперь использовать $this в качестве пользовательской переменной запрещено.
  283. Также запрещено присваивать ей значение и использовать в глобальном пространстве имен.
  284.  
  285. ---
  286.  
  287. #### 21. Генерация идентификаторов сессий только с помощью `CSPRNG`
  288. Идентификаторы сессий теперь создаются только с помощью CSPRNG.
  289. Cryptographically secure pseudorandom number generator(CSPRNG) - Криптографически стойкий генератор псевдослучайных чисел.
  290.  
  291.  
  292.