Как стать автором
Обновить

Обзор моих любимых фич PHP7

Время на прочтение4 мин
Количество просмотров20K
Автор оригинала: Jody LeCompte


Когда люди обсуждают изменения в PHP7, самое распространенное что вы слышите — это значительно улучшенный движок, который может похвастаться более быстрой скоростью выполнения и значительно меньшим объемом памяти при сравнении обычных приложений PHP, таких как Drupal, WordPress и MediaWiki.


Не поймите меня неправильно, это все конечно здорово! Мне удалось перенести несколько устаревших приложений CodeIgniter на PHP7 и достигнуть гораздо более высокой производительность с небольшими изменениями в кодовой базе. Тем не менее, PHP7 также добавляет несколько новых функций, которые могут помочь оптимизировать существующий код или повысить качество написания нового кода. Здесь я изложил несколько моих избранных фич.


Скалярный параметр и возврат заявленного типа


PHP имел объявления типов и до 7 версии, но ограничивался только объектами и массивами. PHP7 теперь обеспечивает поддержку всех скалярных типов и предлагает два разных объявления типов.


Принудительный:


это тип объявления по умолчанию и просто означает, что среда выполнения PHP будет пытаться приводить значения, когда это необходимо. Возьмем, к примеру, следующий код.


<?php
function reverseString(String $str) : String 
{
    return strrev($str);
}
print(reverseString(1234));

Мы указываем, что параметр $str должен иметь тип String а также возвращаемое значение также должно иметь тип String. Поэтому, когда мы передаем число 1234, оно принудительно переводится в строку "1234" и переводится без ошибок.


Строгий:


Второй, строгий тип, включается с помощью флага, добавленного в начало каждого файла. Когда он включен, то интерпретатор не приводит тип, как в приведенном выше примере, он отвечает ошибкой и останавливает выполнение скрипта.



<?PHP
declare(strict_types = 1);
function  reverseString(String  $str): String 
{
    return  strrev($str);
}
print (reverseString(1234));

Добавив единую declare инструкцию в самом начале файла, в тот же код, что и раньше, теперь мы получаем следующее сообщение об ошибке:


Fatal error: Uncaught TypeError: Argument 1 passed to reverseString() must be of the type string, integer given

Маленькое дополнение: когда вы включаете строгий режим, это также распространяется на встроенные функции и функциям PHP загружаемым из расширений.


Null Оператор ??


В отличие от некоторых языков, где вы можете использовать имя переменной в качестве выражения в выражении if и смело предполагать, что если значение не определено или пустое, то значение будет false, PHP же будет бросать ошибку о неопределенной переменной, индексе и т. д. Это делает очень многословным, обычный код, с использованием if, чем другие языки, как например, в следующем примере.


 <?php
if(!isset($_GET['key'])) {
    $key = 'default-value';
} else {
    $key = $_GET['key'];
}

Даже при использовании тернарного оператора необходима функция isset. С новым null оператором ?? вы можете существенно облегчить код:


 <?PHP
$key = $_GET['key'] ?? 'default_value';

Такое использование еще более эффективно в случаях цепочной проверки, требующих одного или несколько других операторов if.


 <?php
if (isset($_GET['key']) {
    $key = $_GET['key'];
} else if(isset($_POST['key'])) {
    $key = $_POST['key'];
} else {
    $key = 'default value';
}

// Versus

$key = $_GET['key'] ?? $_POST['key'] ?? 'default value';

Маленькое дополнение: Если вы работаете с JavaScript, вы можете делать такие вещи:


const value = 0 || false || 'hello';
console.log(value); // hello

Это не будет работать в PHP, и эквивалентный код на PHP установит значение 0, поскольку новый оператор работает только с null значениями.


Групповые Use Declarations


В предыдущих версиях PHP вы могли импортировать только один элемент (класс, функцию, константу) из определенного пространства имен в одном выражении с использованием объявления use. Это часто приводило к очень повторяющемуся коду, такому, как в примере ниже..


<?php
use VendorName/LibraryName/ClasName1;
use VendorName/LibraryName/ClasName2;
use VendorName/LibraryName/ClasName3;

При группировке вышеперечисленное может быть сокращено, как показано на примере ниже, что позволяет получить более чистый и наглядный код, что импортируется и откуда.


<?php
use VendorName/LibraryName/{ClasName1, ClassName2. ClassName3};

Константные массивы


Именованные константы — очень ценный инструмент в PHP. Одним из распространенных вариантов использования является улучшение читаемости кода путем предоставления семантических имен произвольным данным, таким как цвета, значениям RGB или магическим номерам в коде, которые неоднозначны и могут сбить с толку в других случаях.
Любой, кто работал с PHP долгое время, скорее всего, видел приложение с файлом констант (или даже несколькими файлами), которое содержит десятки, если не сотни именованных констант, требующих длинных и описательных имен, чтобы избежать конфликтов имен.


<?php
define('COLOR_RED', '#f44141');
define('COLOR_BLUE', '#4286f4');
define('COLOR_GREEN', '#1ae01e');
define('COLOR_PURPLE', '#f309f7');
define('COLOR_ORANGE', '#ef7700');

Именованные константы, в дополнение к ранее поддерживаемым типам данных, могут быть как индексированным так и ассоциативным массивом. Это поможет более точно сгруппировать многие именованные константы, которые могут быть у вас в вашем приложении.


<?php

// В качестве ассоциативного массива

define('COLORS', [
    'red' => '#f44141',
    'blue' => '#4286f4',
    'green' => '#1ae01e',
    'purple' => '#f309f7',
    'orange' => '#ef7700',
]);
echo(COLORS['red']); // #f44141

// Как индексированный массив

define('COLORS', [
    'red',
    'blue',
    'green',
    'purple',
    'orange',
]);
echo(COLORS[0]); // 'red'

Вывод


Есть еще несколько замечательных новых функций, о которых я не сказал, таких как анонимные классы и оператор spaceship. Так что определенно проверьте документацию на PHP.net для получения дополнительной информации. Спасибо, что нашли время, чтобы прочитать все это и, пожалуйста, оставляйте любые вопросы или комментарии ниже.


спасибо berez за замечания.

Теги:
Хабы:
Всего голосов 33: ↑21 и ↓12+9
Комментарии55

Публикации

Истории

Работа

PHP программист
148 вакансий

Ближайшие события