Usando tipos de retorno anuláveis em PHP
“Um dos recursos mais interessantes que o PHP oferece é a dica de tipo especificamente para aqueles que vêm de um background de programação orientada a objetos.
Do manual do PHP :
As declarações de tipo permitem que as funções exijam que os parâmetros sejam de um determinado tipo no momento da chamada. Se o valor fornecido for do tipo incorreto, um erro será gerado: no PHP 5, este será um erro fatal recuperável, enquanto o PHP 7 lançará uma exceção TypeError.
A razão pela qual isso é importante é porque dá às pessoas que vão usar seu código – especificamente aquelas que escreverão código em seu código – que tipos de parâmetros um determinado construtor ou função aceitará.
Mas há mais do que isso porque as dicas de tipo também são aplicáveis ao tipo de dados que uma função pode retornar.
Tipos de retorno anuláveis
Para começar, digamos que você tenha uma função que deve retornar algum tipo de objeto. Neste exemplo, digamos que temos um Poste o post é representado por um modelo. Naturalmente, o modelo será do tipo post, então a assinatura da classe ficará assim :
<?php
namespace Acme;
class Post {
// Attributes, Constructor, and Functions here.
}
Agora, digamos que você tenha uma classe secundária que retornará uma instância do post. Ao usar uma dica de tipo para a função, a assinatura ficaria assim:
<?php
namespace Acme;
class PostManager {
private $post;
// Constructor and other Functions here.
public function getPost(): Post
{
return $this->post;
}
}
O problema é que o método pode retornar um post ou pode retornar nullse o modelo nunca foi instanciado, passado para uma determinada classe ou simplesmente não existe por algum motivo, então precisamos levar em conta isso.
Caso em questão: Se você trabalhou no WordPress em profundidade por algum tempo, então você sabe que as funções podem retornar várias coisas (como uma instância WP_Errorou uma matriz). Mas no caso orientado a objetos mais puro do qual estou falando acima, estamos olhando para uma função que pode retornar nullou pode retornar uma instância de Post.
E para indicar isso, você pode configurar o método assim:
<?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;
}
}
Em resumo, adicionar o simples ponto de interrogação antes do tipo de objeto diz "Este método pode retornar nulo ou uma instância de Post."
Ou, mais especificamente do manual do PHP:
As declarações de tipo para parâmetros e valores de retorno agora podem ser marcadas como anuláveis prefixando o nome do tipo com um ponto de interrogação. Isso significa que, assim como o tipo especificado,
NULLpode ser passado como argumento ou retornado como valor, respectivamente.
Então, sim, este é um post um pouco longo para explicar um conceito direto. Mas acho que usar exemplos concretos geralmente é mais útil do que simplesmente falar sobre isso de forma abstrata.