PHP 7.1: Прийдешні зміни



Нижче наведені основні зміни, привнесені
PHP 7.1
. Для одержання повного списку затверджених і обговорюваних на поточний момент змін перевірте офіційний PHP RFC.

  • Перехоплення декількох типів виключень за раз
  • Підтримка
    Curl HTTP/2 server push
  • Області видимості для констант класів
  • Зворотний тип
    void
  • Єдине поведінка строкових функцій
  • Підтримка строкових параметрів у функції
    list()
    і новий синтаксис c
    []
  • Викид попередження при валідних рядках в арифметиці
  • Оголошення застарілим
    mcrypt()
    та його подальше видалення
Перехоплення декількох типів виключень за раз
У деяких випадках ми опрацьовуємо різні винятку однаково і немає можливості успадкувати їх від спільного предка, що призводить до дублювання коду. Наприклад:

try {
// to do something
} catch (MyException $e) {
// Handle this exception
} catch (AnotherException $e) {
// Handle this in the same way as MyException
} catch (Exception $e) {
// Handle this in a different way
}

В PHP 7.1, обидва винятку, оброблювані в прикладі однаково, можна зловити одночасно:

try {
// to do something
} catch (MyException | AnotherException $e) {
// Handle these exceptions
} catch (Exception $e) {
// Handle this in a different way
}

Зверніть увагу на синтаксис — це не звичайний
||
оператор, який ми асоціюємо з
or
, це одинарний символ
|
.

Підтримка
Curl HTTP/2 server push

По-перше, що ж таке
server push
? Кращим способом, можливо, буде зрозуміти це через приклад.

Як ви знаєте, коли користувач робить запит до domain.com (не беремо в розрахунок DNS і т. д.), веб-сервер віддає відповідь з купою розмітки, яку браузер потім інтерпретує і відображає. В рамках цієї інтерпретації, що виконується браузером, йому необхідно зрозуміти, які додаткові ресурси він повинен запросити, щоб повністю відобразити сторінку. Це включає в себе CSS, JavaScript і зображення.

Server push
прагне прискорити час завантаження і дозволяє пропустити цей крок, відразу спрямовуючи ресурси клієнта безпосередньо.

Ця функціональність доступна в
libcurl
з версії
7.44.0
, але поки нестабільна і не пішла в реліз (Детальніше: тут і тут). Для більш докладної інформації читайте офіційний PHP RFC: ext/curl HTTP/2 Server Push Support.

Області видимості для констант класів
Константи класів в даний час не можна зробити
private
або
protected
. Вони завжди є
public
.

Наприклад:

class Panda
{
private $pandaId;
public $name;

// This is public, and there's 
// nothing you can do about it.
const MAGIC_POWER = 20; 
}

PHP 7.1 вводить модифікатори видимості для констант:

class Panda
{
// Constants default to public
const MAGIC_POWER = 20;

private const LIMIT_BREAK = 30;
protected const EXPERIENCE_POINTS = 0;
public const HEALTH_POINTS = 100;

}

Це ставить константи в один ряд з іншими членами класу.

Зворотний тип
void

Типи, що повертаються були додано в PHP 7.0. Нагадаю, що це дозволяє розробнику явно оголосити тип повертається функцією значення.

Наприклад:
function foo(): array {
return [];
}

Починаючи з PHP 7.1, можна вказати, що функція має тип
void
, тобто вона виконує дію, але нічого не повертає.

function i_dont_return_anything(): void {
// Perform some action
// This is perfectly valid.
return; 
// This would throw a Fatal error (A 
// void function must not return a 
// value).
// return true; 
}

Звичайно, ви можете заперечити, що функція завжди щось повертати, хоча б
boolean
, який вказує на успішне виконання, але це вже тема для іншої статті.

Єдине поведінка строкових функцій
Погляньте на вбудовану в PHP функцію strrpos().

strrpos($needle, $haystack, $offset = 0); 

Останній параметр підтримує негативне зміщення, яке замість того, щоб знайти останнє входження
$needle
на
$haystack
починаючи від початку рядка, знаходить останнє входження починаючи з N позицій назад від кінця $haystack.

Багато пов'язані з рядками функції PHP мають цей необов'язковий параметр
$offset
, а деякі — ні. Один з яскравих прикладів —
strpos()
. Тут, щоб досягти негативного зсуву, функцію необхідно об'єднати з
substr()
, що знижує читабельність і продуктивність коду.

Наступне оновлення PHP усуває цю прогалину в мові, додаючи параметр
$offset
та його поведінку з від'ємним значенням у безліч стандартних функцій.

Підтримка строкових параметрів у функції
list()
і новий синтаксис c
[]

В даний час в PHP є можливість перетворити масив в список змінних за допомогою функції
list()
:

Приклад:

$myArray = ['monkey', 'tree', 'banana'];
list($monkey, $tree, $banana) = $myArray;
// $monkey now is equal to 'monkey'.

_list()
працює тільки з числовими індексами масивів, що починаються з нуля, наприклад, у коді вище. Вона не працює з асоціативними масивами, такими як:

$myNamedArray = [
'name' => 'Amo',
'age' => 32,
'location' => 'London'
];

PHP 7.1 вирішує це:

list('name', 'age', 'location') = $myNamedArray;

Іншим значним поліпшенням PHP 7.1. є введення квадратних дужок
[]
для позначення масиву змінних. Це забезпечує альтернативу
list()
для розбиття масиву на змінні.

[$a, $b, $c] = [1, 2, 3];

Зверніть увагу, що використовується той же синтаксис, як і при створенні масиву:

$numbers = [1, 2, 3];

Повна інформація по цій зміні доступна на сторінці RFC.

Викид попередження при валідних рядках в арифметиці
При виконанні арифметики в PHP, мова буде коректно (або ні, в залежності від того, як ви на це дивитесь) змішує цілочисельні значення із рядковими на основі містяться в них чисел.

Візьмемо наступні приклади:

//Results in 10
$total = 5 + 5; 
// Results in 10
$total = '5' + '5';
// Results in 10
$total = 5+ '5';
// Results in 10
$total = 'I ate 3 bananas yesterday' + 'and I ate 7 bananas today';
// Results in 5
$total = 5 + 'I love bananas';

Четвертий приклад містить числові значення, а оскільки все інше вирізається, то і сума решти символів, що використовуються для розрахунку, дасть у загальній складності 10. Але все одно було б приємно побачити попередження про роботу з непризначеними для подібної поведінки рядками.

Останній приклад також демонструє таку поведінку в роботі. У рядку
I love bananas
немає числових значень і вся рядок трактується як 0.

В PHP 7.1, приклади чотири і п'ять повернуть:

Notice: A non well formed numeric string encountered in file.php on line x

Це вносить деякі проблеми з зворотною сумісністю в тих випадках, коли очікується мовчазна обробка подібних рядків. Можна заздалегідь перетворити заздалегідь рядка в ціле число через
(int) "string"
, але особисто я думаю, якщо ви виконуєте арифметичні операції на подібних рядках, то варто задуматися про якість цього коду.

Оголошення застарілим
mcrypt()
та його подальше видалення
Бібліотека
mcrypt
була закинута в 2007-му році і містить численні помилки і несмердженные патчі. Таким чином, питання її включення в PHP давно вже дозрів для розгляду.

В PHP 7.1 всі
mcrypt_*
функції будуть видавати повідомлення
E_DEPRECATED
. В PHP 7.1+1, вони будуть повністю вилучені.

Пам'ятайте, якщо ви використовуєте
mcrypt
у вашому PHP коді, ви робите це неправильно
.

На цьому поки все, але якщо ви будете стикатися з якими-небудь іншими
core
-змінами, які я не згадав, будь ласка, дайте мені знати в коментарях нижче. Спасибі за прочитання.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.