Uso de tipos de devolución anulables en PHP
«Una de las características más agradables que ofrece PHP es la sugerencia de tipo específicamente para aquellos que provienen de una experiencia en programación orientada a objetos.
Del manual de PHP :
Las declaraciones de tipo permiten que las funciones requieran que los parámetros sean de cierto tipo en el momento de la llamada. Si el valor dado es del tipo incorrecto, se genera un error: en PHP 5, este será un error fatal recuperable, mientras que PHP 7 arrojará una excepción TypeError .
La razón por la que esto es importante es porque les brinda a las personas que van a usar su código, específicamente a aquellos que escribirán código contra su código, qué tipos de parámetros aceptará un determinado constructor o función.
Pero hay más que eso porque las sugerencias de tipo también son aplicables al tipo de datos que puede devolver una función.
Tipos de devolución anulables
Para empezar, digamos que tiene una función que se supone que devuelve un objeto de algún tipo. En este ejemplo, digamos que tenemos un Posty la publicación está representada por un modelo. Naturalmente, el modelo será de tipo post, por lo que la firma de la clase se verá así :
<?php
namespace Acme;
class Post {
// Attributes, Constructor, and Functions here.
}
Ahora supongamos que tiene una clase secundaria que devolverá una instancia de la publicación. Al usar una sugerencia de tipo para la función, la firma se vería así:
<?php
namespace Acme;
class PostManager {
private $post;
// Constructor and other Functions here.
public function getPost(): Post
{
return $this->post;
}
}
La cuestión es que el método puede devolver una publicación o puede devolver nullsi el modelo nunca fue instanciado, pasado a una clase determinada o simplemente no existe por algún motivo, entonces debemos tenerlo en cuenta.
Caso en cuestión: si ha trabajado en profundidad en WordPress durante un período de tiempo prolongado, entonces sabe que las funciones pueden devolver varias cosas (como una instancia de WP_Erroro una matriz). Pero en el caso más puro orientado a objetos del que hablo anteriormente, estamos viendo una función que puede devolver nullo puede devolver una instancia de Post.
Y para indicar esto, puede configurar el método de esta manera:
<?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;
}
}
En resumen, agregar el signo de interrogación simple antes del tipo de objeto dice "Este método puede devolver un valor nulo o una instancia de Post".
O, más específicamente del manual de PHP:
Las declaraciones de tipo para parámetros y valores devueltos ahora se pueden marcar como anulables al anteponer el nombre del tipo con un signo de interrogación. Esto significa que, además del tipo especificado,
NULLse puede pasar como argumento o devolver como valor, respectivamente.
Entonces, sí, esta es una publicación un poco larga para explicar un concepto directo. Pero encuentro que usar ejemplos concretos a menudo es más útil que simplemente hablar de ello en abstracto.