Использование типов возвращаемых значений Nullable в PHP
«Одна из самых приятных функций, которые предоставляет PHP, — это подсказки типов, специально предназначенные для тех, кто имеет опыт объектно-ориентированного программирования.
Из руководства по PHP :
Объявления типов позволяют функциям требовать, чтобы параметры имели определенный тип во время вызова. Если данное значение имеет неправильный тип, то генерируется ошибка: в PHP 5 это будет исправимая фатальная ошибка, тогда как PHP 7 выдаст исключение TypeError.
Причина, по которой это важно, заключается в том, что это дает людям, которые будут использовать ваш код, особенно тем, кто будет писать код для вашего кода, какие типы параметров будет принимать данный конструктор или функция.
Но это еще не все, потому что подсказки типа также применимы к типу данных, которые может возвращать функция.
Типы возвращаемых значений, допускающие значение NULL
Для начала предположим, что у вас есть функция, которая должна возвращать какой-то объект. В этом примере допустим, что у нас есть Postи пост представлен моделью. Естественно, модель будет иметь тип post, поэтому сигнатура класса будет выглядеть примерно так :
<?php
namespace Acme;
class Post {
// Attributes, Constructor, and Functions here.
}
Теперь предположим, что у вас есть вторичный класс, который будет возвращать экземпляр сообщения. При использовании подсказки типа для функции сигнатура будет выглядеть примерно так:
<?php
namespace Acme;
class PostManager {
private $post;
// Constructor and other Functions here.
public function getPost(): Post
{
return $this->post;
}
}
Дело в том, что метод может вернуть сообщение или он может вернуться null, если модель никогда не создавалась, не передавалась в данный класс или просто не существовала по какой-то причине, тогда нам нужно это учитывать.
Показательный пример: если вы работали с WordPress в течение длительного времени, то вы знаете, что функции могут возвращать несколько вещей (например, экземпляр WP_Errorили массив). Но в самом чистом объектно-ориентированном случае, о котором я говорил выше, мы рассматриваем функцию, которая может возвращать nullили может возвращать экземпляр Post.
И чтобы указать это, вы можете настроить метод следующим образом:
<?php
namespace Acme;
class PostManager {
private $post;
// Constructor and other Functions here.
public function getPost(): ?Post
{
if ($this->post === null) {
return null;
}
return $this->post;
}
}
Короче говоря, добавление простого вопросительного знака перед типом объекта говорит: «Этот метод может возвращать null или экземпляр Post».
Или, точнее, из руководства по PHP:
Объявления типов для параметров и возвращаемых значений теперь можно пометить как допускающие значение NULL, добавив к имени типа префикс вопросительного знака. Это означает, что, как и указанный тип,
NULLон может быть передан как аргумент или возвращен как значение соответственно.
Итак, да, это довольно длинный пост, чтобы объяснить простую концепцию. Но я считаю, что использование конкретных примеров часто бывает полезнее, чем просто говорить об этом абстрактно.