PHP 7.2 – новата версия на PHP официално дебютира в края на Ноември 2017 г. Изданието има нови функции и подобрения, които ще ни позволят да пишем по-добър код. Пълният списък с промени може да видите ето тук.
Съдържание
Основни подобрения
Декларация на аргументи
От PHP 5 можем да посочим в декларацията на функцията типа аргумент, който се очаква да бъде приет. Ако дадена стойност е от неправилен тип, PHP изкарва грешка. (Декларирането на аргументи определя типа променлива, която се очаква да бъде подадена на функция или метод на класа).
Пример :
class MyClass {
public $var = 'Hello World';
}
$myclass = new MyClass;
function test(MyClass $myclass){
return $myclass->var;
}
echo test($myclass);
В кодa по-горе, функцията test очаква инстанция на класa MyClass. Това ще „гръмне“, както обичат да казват програмистите, когато имат грешка при компилация, и ще се отпечата следната фатална грешка :
Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of MyClass, string given, called in /app/index.php on line 12 and defined in /app/index.php:8
Новите промени в PHP 7.2 позволяват да бъде използван типът данни на обект, с което може да се декларира общ даден обект като аргумент на функция или метод.
Ето пример :
class MyClass {
public $var = '';
}
class FirstChild extends MyClass {
public $var = 'My name is Jim';
}
class SecondChild extends MyClass {
public $var = 'My name is John';
}
$firstchild = new FirstChild;
$secondchild = new SecondChild;
function test(object $arg) {
return $arg->var;
}
echo test($firstchild);
echo test($secondchild);
В този пример сме извикали функцията за тестване два пъти, като по време на всяко извикване преминава различен обект. Това не беше възможно при предишни версии на PHP.
Също така вече можем да използваме декларации от тип return за обекти.
Пример:
class MyClass {
public $var = 'Hello World';
}
$myclass = new MyClass;
function test(MyClass $arg) : object {
return $arg;
}
echo test($myclass)->var;
В предишните версии на PHP щеше да се покаже фатална грешка, но в новата версия ще се отпечата „Hello world“.
Разширяване на Type параметъра
Понастоящем PHP не позволява никакви вариации на типовете параметри между подчинените класове и техните класове родители или интерфейси. Какво означава това? Нека да разгледаме следния код:
<?php
class MyClass {
public function myFunction(array $myarray) { /* ... */ }
}
class MyChildClass extends MyClass {
public function myFunction($myarray) { /* ... */ }
}
Тук сме задали типа параметър в подклас. В PHP 7.0 този код ще даде следното предупреждение:
Warning: Declaration of MyChildClass::myFunction($myarray) should be compatible with MyClass::myFunction(array $myarray) in %s on line 8
В новата версия на PHP имаме право да пропуснем един тип в подклас, без да „гърми“ кодът. Тази възможност ще ни позволи да надстроим класовете, без да се налага да актуализираме всички подкласове.
Подобрена сигурност
Argon2 в хеш парола
Алгоритъмът за хеширане Argon 2 ще ни донесе сигурна алтернатива на алгоритъма Bcrypt . Новата версия на PHP ще използва ARGON2I.
За разлика от Bcrypt, който отнема само един фактор на разходите, Argon2 приема три фактора на разходите, които се различават по следния начин:
- Цената на паметта, определяща количеството на KiB, които ще се използват по време на хеширане (стойности по подразбиране са 1 << 10 или 1024 KiB, или 1 MiB).
- Стойност на времето, което определя броя на повторения на алгоритъма за хеширане (по подразбиране е 2).
- Факторът паралелизъм , което определя броя на успоредни нишки, които ще се използват по време на хеширане (по подразбиране е 2).
Три нови константи определят стандартните фактори на разходите:
- PASSWORD_ARGON2_DEFAULT_MEMORY_COST
- PASSWORD_ARGON2_DEFAULT_TIME_COST
- PASSWORD_ARGON2_DEFAULT_THREADS
От какво значение е PHP 7.2 за хората, използващи WordPress?
Според WordPress Stats, почти 20 процента от потребителите на WordPress използват PHP 7 и едва 5% използват PHP 7.1 . Забелязва се, че голяма част от потребителите, над 40%, все още работят на PHP 5.6. Още по-плашещо е, че над 39% от потребителите използват вече неподдържани версии на PHP.
Изброените по-горе цифри не изглеждат особено добре, защото PHP 7 се оказва значително по-бърз. Ето няколко статистически данни:
- PHP 7 позволява на системата да изпълнява два пъти повече заявки в секунда в сравнение с PHP 5.6 при почти половината от латентността, показват официалните показатели на PHP.
- Kinsta изпълни собствените си показатели за ефективност на PHP 5.6 срещу PHP 7 срещу HHVM. Подобно на показателите по-горе, те видяха, че PHP 7 може да изпълнява почти три пъти повече транзакции в секунда в сравнение с PHP 5.6.
- Christian Vigh публикува също и сравнение на ефективността в PHP, в което установи, че PHP 5.2 е с 400% по-бавен от PHP 7.