Новости

PHP 7.1 - 9 нових функцій, про які вам варто знати / DEVACADEMY

  1. 1. Ітеріруемий псевдотіпов
  2. 2. Замикання через функції зворотного виклику
  3. 3. Синтаксис з квадратними дужками для списку ()
  4. 4. Підтримка ключів в списку
  5. 5. Видимість констант класу
  6. 6. Типи, допускають значення null
  7. 7. Функції типу void
  8. 8. Захоплення винятків різних типів
  9. 9. Виключення «Занадто мало аргументів»
  10. підсумки
Павло Соловйов

Frontend розробник

Нарешті, в світ вийшла PHP 7.1, нова мінорна версія PHP, яка включає в себе ряд нових функцій, змін і виправлення помилок. У цій статті ми розглянемо деякі нові чудові функції PHP 7.1, а саме:

  • Ітеріруемий псевдотіпов
  • Замикання через функції зворотного виклику
  • Синтаксис з квадратними дужками для списку ()
  • Підтримка ключів в списку
  • Видимість констант класу
  • Типи, що допускають значення null
  • Функції типу void
  • Захоплення винятків різних типів
  • Виняток «Занадто мало аргументів»

Для вашої зручності по ходу статті я також буду посилатися на відповідні RFC.

Перед тим як ми почнемо: А ви хотіли б спробувати PHP 7.1, що не влаштовуючи бардак з вашої поточної середовищем програмування? Тоді Docker - це ваш кращий друг! PHP 7.1 можна запросто налаштувати за допомогою Docker, використовуючи одне з цих образів .

Щоб запустити контейнер 7.1:

docker run -v / Users / apple / Workplace / php /: / php -it php: 7.1-rc bash

Це дозволить завантажити (якщо на вашому локальному пристрої вже не збережені подібні файли) образи Docker для php: 7.1-rc, після чого запустіть контейнер і зайдіть в нього, використовуючи спливаючі підказки. Перенесіть карти опцій -v / Users / apple / Workplace / php /: / php з директорії / Users / apple / Workplace / php центрального комп'ютера в директорію / php всередині контейнера Docker. Таким чином, всі файли всередині / Users / apple / Workplace / php будуть доступні в директорії контейнера / php.
Тепер заходимо в директорію / php.

cd / php

Супер! Тепер ми готові випробувати нові функції PHP 7.1.

1. Ітеріруемий псевдотіпов

Припустимо, у нас є функція getUserNames, яка приймає перелік користувачів і повертає їх імена у вигляді списку.

function getUserNames ($ users) {return nikic \ map (function ($ user) {return $ user-> name;}, $ users); } Примітка: Тут ми використовуємо бібліотеку nikic / iter .

Параметр $ users може бути представлений масивом або об'єктом з реалізацією функції Traversable. До виходу PHP 7 було неможливо задати для даної функції будь-які підказки щодо типу, оскільки не існувало загального типу, який одночасно відповідав би і масиву і об'єкту Traversable.

Для вирішення даної проблеми в PHP 7.1 був реалізований новий псевдотіпов iterable, який ми можемо використовувати для того, що задати значення типу для всього, що може бути ітерованих з використанням foreach.

function getUserNames (iterable $ users): iterable {return nikic \ map (function ($ user) {return $ user-> name;}, $ users); }

Тепер ця функція може приймати масиви, ітеріруемие об'єкти і генератори.

Див. RFC

2. Замикання через функції зворотного виклику

Даний функціонал дозволяє нам створювати механізми замикання через будь-яку функцію, що викликається. Давайте подивимося один приклад, щоб краще з цим розібратися.

class MyClass {public function getCallback () {return Closure :: fromCallable ([$ this, 'callback']); } Public function callback ($ value) {echo $ value. PHP_EOL; }} $ Callback = (new MyClass) -> getCallback (); $ Callback ( 'Hello World');

Напевно, це не найкращий приклад, щоб пояснити, навіщо нам потрібна ця функція, але за допомогою нього можна проілюструвати, як саме вона працює. Застосування функції Closure :: fromCallable має ряд переваг в порівнянні з більш традиційними методами.

Покращений механізм виправлення помилок - При роботі з Closure :: fromCallable помилки відображаються в потрібному місці, а не там, де ми використовуємо функцію, що викликається. Це значно спрощує процес виправлення багів.

Перенесення обсягів - Приклад вище буде нормально працювати, навіть якщо callback - це приватний / захищений (private / protected) метод MyClass.

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

Див. RFC

3. Синтаксис з квадратними дужками для списку ()

Синтаксис коротких масивів був однією з приголомшливих функцій, доданих в PHP 5.4, що зробило роботу з масивами набагато простіше і зручніше. Тепер синтаксис короткого переліку дозволяє нам використовувати квадратні дужки замість list () для присвоєння масиву змінних.

// prior to php 7.1 list ($ firstName, $ lastName) = [ "John", "Doe"]; // php 7.1 [$ firstName, $ lastName] = [ "John", "Doe"];

Див. RFC

4. Підтримка ключів в списку

До виходу PHP7 функція list () підтримувала тільки проіндексовані числами масиви, індекс яких починається з нуля. Ми не могли використовувати цю функцію з асоціативними масивами.

Тепер новий функціонал дозволяє нам вказувати ключі при деструктуризации масивів.

$ User = [ "first_name" => "John", "last_name" => "Doe"]; [ "First_name" => $ firstName, "last_name" => $ lastName] = $ user;

Як цікавий побічний ефект тепер ми можемо привласнювати тільки необхідні ключі з масиву.

[ "Last_name" => $ lastName] = $ user;

Також можна деструктуріровать багатовимірні масиви, використовуючи списки всередині списку.

$ Users = [[ "name" => "John Doe", "age" => 29], [ "name" => "Sam", "age" => 36]]; [[ "Name" => $ name1, "age" => $ age1], [ "name" => $ name2, "age" => $ age2]] = $ users;

Див. RFC

5. Видимість констант класу

Константи класу допомагають нам поставити значуще ім'я для значення, яке використовується в даному класі. Ці константи завжди були публічними, і доступ до них можна було отримати з зовнішнього класу. Але ж ми далеко не завжди хочемо виставляти їх на огляд зовнішнього світу, чи не так?
У версії PHP7.1 ми можемо приписати констант класу модифікатори видимості точно так же, як ми робимо з методами і властивостями.

class PostValidator {protected const MAX_LENGTH = 100; public function validateTitle ($ title) {if (strlen ($ title)> self :: MAX_LENGTH) {throw new \ Exception ( "Title is too long"); } Return true; }}

Тут константа MAX_LENGHT є внутрішньою константою класу PostValidator, і ми не хочемо, щоб це значення було доступно для зовнішнього світу.

Див. RFC

6. Типи, допускають значення null

Цей функціонал дозволяє нам поставити підказки щодо типу функції, дозволяючи при цьому використовувати значення null як параметр або повернення. Ми можемо поставити параметру або результату тип Null, поставивши знак питання (?) Перед підказкою типу.

function sayHello (? string $ name) {echo "Hello". $ Name. PHP_EOL; } SayHello (null); // Hello sayHello ( "John"); // Hello John

Точно також це працює і для повернення.

class Cookie {protected $ jar; public function get (string $ key):? string {if (isset ($ this-> jar [$ key])) {return $ this-> jar [$ key]; } Return null; }}

Див. RFC

7. Функції типу void

Починаючи з версії PHP 7, ми можемо задавати тип значення, яке функція повинна повертати на виході. Іноді бувають випадки, коли необхідно вказати, що функція не повинна повертати ніякого значення взагалі.

class Cookie {protected $ jar; public function set (string $ key, $ value): void {$ this-> jar [$ key] = $ value; }}

Коли для повернення задано значення void, функція або повинна упускати оператор повернення взагалі, або може мати порожній оператор повернення. Функція не повинна повертати ніяких значень.

Див. RFC

8. Захоплення винятків різних типів

При роботі з винятками іноді нам може знадобитися обробляти кілька винятків одним і тим же способом. Зазвичай для роботи з різними типами винятків нам довелося б створити кілька окремих блоків захоплення.

try {// somthing} catch (MissingParameterException $ e) {throw new \ InvalidArgumentException ($ e-> getMessage ()); } Catch (IllegalOptionException $ e) {throw new \ InvalidArgumentException ($ e-> getMessage ()); }

У версії PHP 7.1 ми можемо працювати з множинними винятками в рамках одного спільного блоку захоплення.

try {// something} catch (MissingParameterException | IllegalOptionException $ e) {throw new \ InvalidArgumentException ($ e-> getMessage ()); }

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

Read RFC

9. Виключення «Занадто мало аргументів»

Як і в PHP 7, ми можемо викликати функцію з меншою кількістю аргументів, ніж фактично потрібно. В такому випадку серед тільки видасть попередження про відсутніх аргументах, але продовжить виконання функції. Іноді це може привести до дивного або несподіваного поведінки функції.

У версії PHP 7.1 виклик функції без необхідних параметрів призведе до спрацьовування виключення помилки ArgumentCountError.

function sayHello ($ name) {echo "Hello". $ Name; } SayHello (); // Fatal error: Uncaught ArgumentCountError: Too few arguments to function sayHello (), 0 passed in ...

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

Див. RFC

підсумки

В рамках даної статті ми обговорили деякі важливі функції, додані у версію PHP 7.1. Для того щоб дізнатися більше про нові функції та зміни PHP 7.1, рекомендуємо ознайомитися з офіційним керівництвом щодо переходу з більш ранніх версій. Я пропустив якусь важливу функцію? Напишіть в коментарях нижче :)

О не влаштовуючи бардак з вашої поточної середовищем програмування?
Але ж ми далеко не завжди хочемо виставляти їх на огляд зовнішнього світу, чи не так?
Class Cookie {protected $ jar; public function get (string $ key):?
Я пропустив якусь важливу функцію?

Уважаемые партнеры, если Вас заинтересовала наша продукция, мы готовы с Вами сотрудничать. Вам необходимо заполнить эту форму и отправить нам. Наши менеджеры в оперативном режиме обработают Вашу заявку, свяжутся с Вами и ответят на все интересующее Вас вопросы.

Или позвоните нам по телефонам: (048) 823-25-64

Организация (обязательно) *

Адрес доставки

Объем

Как с вами связаться:

Имя

Телефон (обязательно) *

Мобильный телефон

Ваш E-Mail

Дополнительная информация: