[PHP, Программирование, Яндекс API] Эволюция PHP — от 5.6 до 8.0 (Часть 1) (перевод)
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Перевод статьи подготовлен в преддверии старта курса «Backend-разработчик на PHP».Шпаргалка по изменениям в PHP v7.x
PHP_v8.0После релиза PHP версии 7.3 я решил уделить больше внимания развитию PHP: что собственно развивается и в каком направлении искать понимание потенциала и оптимизации этого невероятно популярного языка программирования.В результате поиска лаконичного списка функций, реализованных PHP за время разработки PHP v7.x, я решил составить список сам - приятное дополнение, которое, я думаю, кому-то тоже может пригодиться.За основу мы возьмем PHP 5.6 и рассмотрим, что было добавлено и изменено. Я также добавил везде где смог ссылки на официальную документацию по каждой из упомянутых фич, поэтому, если вам вдруг понадобится получить более подробную информацию - пожалуйста.PHP 7.0Поддержка анонимных классовАнонимный класс может использоваться вместо именованного класса:
- Когда класс не нужно документировать
- Когда класс во время выполнения используется только один раз
new class($i) {
public function __construct($i) {
$this->i = $i;
}
}
Функция целочисленного деления - безопасный способ деления (даже на 0).Возвращает целочисленный результат деления первого операнда на второй. Если делитель (второй операнд) равен нулю, функция пробрасывает EWARNING и возвращает FALSE.
intdiv(int $numerator, int $divisor)
Добавлен новый оператор объединения с null - «??»
$x = NULL;
$y = NULL;
$z = 3;
vardump($x ?? $y ?? $z); // int(3)
$x = ["c" => "meaningfulvalue"];
vardump($x["a"] ?? $x["b"] ?? $x["c"]); // string(16) "meaningfulvalue"
Добавлен новый оператор - spaceship (космический корабль)(<=>)Используется для оптимизации и упрощения операций сравнения.
// Прежде
f unction orderfunc($a, $b) {
return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);
}
// Используя оператор <=>
function orderfunc($a, $b) {
return $a <=> $b;
}
Объявления скалярных типовЭто всего лишь первый шаг к реализации преимуществ более строго типизированного языка программирования в PHP - v0.5.
function add(float $a, float $b): float {
return $a + $b;
}
add(1, 2); // float(3)
Объявления типов возвращаемых значенийДобавлена возможность возвращать типы помимо скалярных - классы, включая наследование. Хех, упустив при этом возможность сделать это необязательным (что будет введено в v7.1 :))
interface A {
static function make(): A;
}
class B implements A {
static function make(): A {
return new B();
}
}
Групповые объявления use
// Явный use синтаксис:
use FooLibrary\Bar\Baz\ClassA;
use FooLibrary\Bar\Baz\ClassB;
use FooLibrary\Bar\Baz\ClassC;
use FooLibrary\Bar\Baz\ClassD as Fizbo;
// Групповой use синтаксис:
use FooLibrary\Bar\Baz{ ClassA, ClassB, ClassC, ClassD as Fizbo };
Делегация генератораВ теле функций генераторов разрешен следующий новый синтаксис:
yield from <expr>
Повышение производительностиPHP 7 почти вдвое быстрее, чем PHP 5.6.
Значительное сокращение использования памяти
Как видно из диаграмм, PHP 7.0 стал громадным шагом вперед с точки зрения производительности и использования памяти. Для страницы с запросами к базе данных версия 7.0.0 более чем в 3 раза быстрее, чем 5.6 с включенным opcache в 2.7 раза быстрее без opcache! С точки зрения использования памяти разница тоже существенная!Интерфейс ThrowableКлассы исключений были реструктурированы к более контринтуитивной схеме именования, которая приведет к меньшей путанице, особенно для новых пользователей.Error и Exception теперь реализуют Throwable.Иерархия Throwable:
interface Throwable
|- Error implements Throwable
|- ArithmeticError extends Error
|- DivisionByZeroError extends ArithmeticError
|- AssertionError extends Error
|- ParseError extends Error
|- TypeError extends Error
|- ArgumentCountError extends TypeError
|- Exception implements Throwable
|- ClosedGeneratorException extends Exception
|- DOMException extends Exception
|- ErrorException extends Exception
|- IntlException extends Exception
|- LogicException extends Exception
|- BadFunctionCallException extends LogicException
|- BadMethodCallException extends BadFunctionCallException
|- DomainException extends LogicException
|- InvalidArgumentException extends LogicException
|- LengthException extends LogicException
|- OutOfRangeException extends LogicException
|- PharException extends Exception
|- ReflectionException extends Exception
|- RuntimeException extends Exception
|- OutOfBoundsException extends RuntimeException
|- OverflowException extends RuntimeException
|- PDOException extends RuntimeException
|- RangeException extends RuntimeException
|- UnderflowException extends RuntimeException
|- UnexpectedValueException extends RuntimeException
⚠ Внимание! Вы можете реализовать Throwable только через Error и Exception.Синтаксис кодирования Unicode — “\u{xxxxx}”
echo "\u{202E}Reversed text"; // выводит Reversed text
echo "mañana"; // "ma\u{00F1}ana"
echo "mañana"; // "man\u{0303}ana" "n" комбинирована с символом ~ (U+0303)
Чувствительный к контексту лексерС этим нововведением глобально зарезервированные словами стала полу-зарезервированными:
callable class trait extends implements static abstract final public protected private const
enddeclare endfor endforeach endif endwhile and global goto instanceof insteadof interface
namespace new or xor try use var exit list clone include includeonce throw array
print echo require requireonce return else elseif default break continue switch yield
function if endswitch finally for foreach declare case do while as catch die self parent
За исключением того, что по-прежнему запрещено определять константу класса с именем class из-за разрешения имени класса ::class.Выражения return в генераторахЕдиный синтаксис переменныхПоддержка уровня вложенности для функции dirname()PHP 7.1Обнуляемые типы
function answer(): ?int {
return null; // ок
}
function answer(): ?int {
return 42; // ок
}
function answer(): ?int {
return new stdclass(); // ошибка
}
function say(?string $msg) {
if ($msg) {
echo $msg;
}
}
say('hello'); // ок - выводит hello
say(null); // ок - ничего не выводит
say(); // ошибка - отсутствует параметр
say(new stdclass); // ошибка - не подходящий тип
Ничего не возвращающие функции
function shouldreturnnothing(): void {
return 1; // Fatal error: A void function must not return a value
}
В отличие от других типов, которые принудительно применяются при вызове функции, этот тип проверяется во время компиляции, что означает, что ошибка возникает без необходимости вызова функции.Функция с типом возврата void или void функция может либо возвращать неявно, либо иметь оператор возврата без значения:
function lacksreturn(): void {
// валидно
}
Псевдотип IterableОбычно функция принимает или возвращает array или объект, реализующий Traversable, который используется с foreach. Однако, поскольку array является примитивным типом, а Traversable - интерфейсом, в настоящее время нет способа использовать объявление типа для параметра или возвращаемого типа, чтобы указать, что значение является итерируемым.
function foo(iterable $iterable) {
foreach ($iterable as $value) {
// …
}
}
iterable также может использоваться в качестве возвращаемого типа, чтобы указать, что функция вернет итерируемое значение. Если возвращаемое значение не является массивом или экземпляром Traversable, будет проброшена TypeError.
function bar(): iterable {
return [1, 2, 3];
}
Параметры, объявленные как iterable могут использовать null или массив в качестве значения по умолчанию.
function foo(iterable $iterable = []) {
// …
}
Closure из callable
class Closure {
…
public static function fromCallable(callable $callable) : Closure {…}
…
}
Синтаксис квадратных скобок для деструктуририрующего присваивания в массиве
$array = [1, 2, 3];
// Присваивает $a, $b и $c значения соответствующих элементов массива $array с ключами, пронумерованными от нуля
[$a, $b, $c] = $array;
// Присваивает $a, $b и $c значения элементов массива $array с ключами "a", "b" и "c" соответственно
["a" => $a, "b" => $b, "c" => $c] = $array;
Синтаксис квадратных скобок для list()
$powersOfTwo = [1 => 2, 2 => 4, 3 => 8];
list(1 => $oneBit, 2 => $twoBit, 3 => $threeBit) = $powersOfTwo;
Видимость констант класса
class Token {
// Константы по умолчанию public
const PUBLICCONST = 0;
// Константы также могут иметь определенную пользователем видимость
private const PRIVATECONST = 0;
protected const PROTECTEDCONST = 0;
public const PUBLICCONSTTWO = 0;
// Константы могут иметь только один список объявлений видимости
private const FOO = 1, BAR = 2;
}
Перехват нескольких типов исключений
try {
// Какой-то код…
} catch (ExceptionType1 | ExceptionType2 $e) {
// Код обработки исключения
} catch (\Exception $e) {
// …
}
В ближайшие дни мы опубликуем вторую часть статьи, а прямо сейчас приглашаем вас записаться на бесплатный вебинар в рамках которого наши эксперты ответят на все интересующие вас вопросы.
Читать ещё:
===========
Источник:
habr.com
===========
===========
Автор оригинала: Martynas Eskis
===========Похожие новости:
- [JavaScript, Программирование, Разработка веб-сайтов] Настройка Webpack 5 с нуля (перевод)
- [Python, Программирование] О полезности contextvars
- [JavaScript, Программирование, Java, TypeScript] TypeScript для бэкенд-разработки (перевод)
- [Программирование, Разработка мобильных приложений, Разработка под Android] Большие картинки? Deal with it
- [C, C++, Программирование, Функциональное программирование] Сравнение встраиваемых ЯП по размеру в исполняемом файле
- [Сетевые технологии, Интернет вещей] Обзор сетевых протоколов и протоколов обмена сообщениями для IoT (перевод)
- [JavaScript, Программирование, Разработка веб-сайтов] Использование «глобального» await в JavaScript (перевод)
- [SQL, Microsoft SQL Server, Администрирование баз данных] Шифрование в MySQL: использование Master Key
- [Карьера в IT-индустрии, Программирование, Управление разработкой] Junior — приговор или возможность? Что надо знать новичкам о своей первой работе
- [IT-компании, Машинное обучение, Программирование] Microsoft рассказала, как ИИ поможет инвалидам
Теги для поиска: #_php, #_programmirovanie (Программирование), #_jandeks_api (Яндекс API), #_php, #_programming, #_php_developers, #_blog_kompanii_otus._onlajnobrazovanie (
Блог компании OTUS. Онлайн-образование
), #_php, #_programmirovanie (
Программирование
), #_jandeks_api (
Яндекс API
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 21:13
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Перевод статьи подготовлен в преддверии старта курса «Backend-разработчик на PHP».Шпаргалка по изменениям в PHP v7.x PHP_v8.0После релиза PHP версии 7.3 я решил уделить больше внимания развитию PHP: что собственно развивается и в каком направлении искать понимание потенциала и оптимизации этого невероятно популярного языка программирования.В результате поиска лаконичного списка функций, реализованных PHP за время разработки PHP v7.x, я решил составить список сам - приятное дополнение, которое, я думаю, кому-то тоже может пригодиться.За основу мы возьмем PHP 5.6 и рассмотрим, что было добавлено и изменено. Я также добавил везде где смог ссылки на официальную документацию по каждой из упомянутых фич, поэтому, если вам вдруг понадобится получить более подробную информацию - пожалуйста.PHP 7.0Поддержка анонимных классовАнонимный класс может использоваться вместо именованного класса:
new class($i) {
public function __construct($i) { $this->i = $i; } } intdiv(int $numerator, int $divisor)
$x = NULL;
$y = NULL; $z = 3; vardump($x ?? $y ?? $z); // int(3) $x = ["c" => "meaningfulvalue"]; vardump($x["a"] ?? $x["b"] ?? $x["c"]); // string(16) "meaningfulvalue" // Прежде
f unction orderfunc($a, $b) { return ($a < $b) ? -1 : (($a > $b) ? 1 : 0); } // Используя оператор <=> function orderfunc($a, $b) { return $a <=> $b; } function add(float $a, float $b): float {
return $a + $b; } add(1, 2); // float(3) interface A {
static function make(): A; } class B implements A { static function make(): A { return new B(); } } // Явный use синтаксис:
use FooLibrary\Bar\Baz\ClassA; use FooLibrary\Bar\Baz\ClassB; use FooLibrary\Bar\Baz\ClassC; use FooLibrary\Bar\Baz\ClassD as Fizbo; // Групповой use синтаксис: use FooLibrary\Bar\Baz{ ClassA, ClassB, ClassC, ClassD as Fizbo }; yield from <expr>
Значительное сокращение использования памяти Как видно из диаграмм, PHP 7.0 стал громадным шагом вперед с точки зрения производительности и использования памяти. Для страницы с запросами к базе данных версия 7.0.0 более чем в 3 раза быстрее, чем 5.6 с включенным opcache в 2.7 раза быстрее без opcache! С точки зрения использования памяти разница тоже существенная!Интерфейс ThrowableКлассы исключений были реструктурированы к более контринтуитивной схеме именования, которая приведет к меньшей путанице, особенно для новых пользователей.Error и Exception теперь реализуют Throwable.Иерархия Throwable: interface Throwable
|- Error implements Throwable |- ArithmeticError extends Error |- DivisionByZeroError extends ArithmeticError |- AssertionError extends Error |- ParseError extends Error |- TypeError extends Error |- ArgumentCountError extends TypeError |- Exception implements Throwable |- ClosedGeneratorException extends Exception |- DOMException extends Exception |- ErrorException extends Exception |- IntlException extends Exception |- LogicException extends Exception |- BadFunctionCallException extends LogicException |- BadMethodCallException extends BadFunctionCallException |- DomainException extends LogicException |- InvalidArgumentException extends LogicException |- LengthException extends LogicException |- OutOfRangeException extends LogicException |- PharException extends Exception |- ReflectionException extends Exception |- RuntimeException extends Exception |- OutOfBoundsException extends RuntimeException |- OverflowException extends RuntimeException |- PDOException extends RuntimeException |- RangeException extends RuntimeException |- UnderflowException extends RuntimeException |- UnexpectedValueException extends RuntimeException echo "\u{202E}Reversed text"; // выводит Reversed text
echo "mañana"; // "ma\u{00F1}ana" echo "mañana"; // "man\u{0303}ana" "n" комбинирована с символом ~ (U+0303) callable class trait extends implements static abstract final public protected private const
enddeclare endfor endforeach endif endwhile and global goto instanceof insteadof interface namespace new or xor try use var exit list clone include includeonce throw array print echo require requireonce return else elseif default break continue switch yield function if endswitch finally for foreach declare case do while as catch die self parent function answer(): ?int {
return null; // ок } function answer(): ?int { return 42; // ок } function answer(): ?int { return new stdclass(); // ошибка } function say(?string $msg) { if ($msg) { echo $msg; } } say('hello'); // ок - выводит hello say(null); // ок - ничего не выводит say(); // ошибка - отсутствует параметр say(new stdclass); // ошибка - не подходящий тип function shouldreturnnothing(): void {
return 1; // Fatal error: A void function must not return a value } function lacksreturn(): void {
// валидно } function foo(iterable $iterable) {
foreach ($iterable as $value) { // … } } function bar(): iterable {
return [1, 2, 3]; } function foo(iterable $iterable = []) {
// … } class Closure {
… public static function fromCallable(callable $callable) : Closure {…} … } $array = [1, 2, 3];
// Присваивает $a, $b и $c значения соответствующих элементов массива $array с ключами, пронумерованными от нуля [$a, $b, $c] = $array; // Присваивает $a, $b и $c значения элементов массива $array с ключами "a", "b" и "c" соответственно ["a" => $a, "b" => $b, "c" => $c] = $array; $powersOfTwo = [1 => 2, 2 => 4, 3 => 8];
list(1 => $oneBit, 2 => $twoBit, 3 => $threeBit) = $powersOfTwo; class Token {
// Константы по умолчанию public const PUBLICCONST = 0; // Константы также могут иметь определенную пользователем видимость private const PRIVATECONST = 0; protected const PROTECTEDCONST = 0; public const PUBLICCONSTTWO = 0; // Константы могут иметь только один список объявлений видимости private const FOO = 1, BAR = 2; } try {
// Какой-то код… } catch (ExceptionType1 | ExceptionType2 $e) { // Код обработки исключения } catch (\Exception $e) { // … } В ближайшие дни мы опубликуем вторую часть статьи, а прямо сейчас приглашаем вас записаться на бесплатный вебинар в рамках которого наши эксперты ответят на все интересующие вас вопросы.
=========== Источник: habr.com =========== =========== Автор оригинала: Martynas Eskis ===========Похожие новости:
Блог компании OTUS. Онлайн-образование ), #_php, #_programmirovanie ( Программирование ), #_jandeks_api ( Яндекс API ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 21:13
Часовой пояс: UTC + 5