Sign in
Log inSign up

Post hidden from Hashnode

Posts can be hidden from Hashnode network for various reasons. Contact the moderators for more details.

Ante la duda 'Null'

Juan Millan's photo
Juan Millan
·Nov 1, 2019

Optional Es una forma de prevenir un error cuando se accede a una propiedad o método de una clase que es parte de otra.

lo puedes encontrar en laravel helpers y aquí explicare de forma simplificada como funciona.

Veamos de que va.

class Optional
{
    protected $value;
    public function __construct($value)
    {
        $this->value = $value;
    }

    public function __get($name)
    {
        if(is_object($this->value)) {
            return $this->value->{$name} ?? null;
        }
    }

    public function __call($method, $args)
    {
        if(is_object($this->value)) {
            return $this->value->{$method}(...$args);
        }
    }
}

Tenemos la clase Optional con dos métodos mágicos, que nos ayudaran a acceder a las propiedades y métodos de la clase "$value" (la clase que sera pasada al constructor), el primero es __get con el que capturamos el nombre de la propiedad a la que se desea acceder, validamos que el valor pasado al constructor sea un objeto y luego procedemos a acceder a la propiedad y si esta no existe retornamos null

El segundo es __call con el que podemos capturar el nombre del método que se desea invocar, volvemos a validar que se un objeto y tratamos de invocar dicho método de clase "$value" en caso de no encontrarlo __call retorna null por defecto.

Para que su uso se mas simple y extendido vamos a agregarlo como un helper, esto nos facilitara poderlo usar como una función global en todo nuestro proyecto.

#helpers.php
if(!function_exist('optional') {

    function optional($value = null)
    {
       return new Optional($value);
    }
}

Ahora que tenemos el nuestro optional podemos ponerlo a prueba, supongamos que tenemos un método estático que busca en un repositorio un usuario por Id y retorna una Instancia de User en caso de encontrarlo en base de datos, pero si no existe un registro con este Id retornara null.

/** User.php */
class User()
{
    public static function findById($id)
    {
        # repository working here....
        return null;
    }
}

Cuando queremos obtener el nombre de un usuario mediante el método getName() solemos confiar que la solicitud retornara un usuario, pero en caso de que no, podemos hacer uso de optional.

# Fatal Errror,  Call to a member function getName() on null
$userName = User::findById(13)->getName();

# Optional use, null response
$userName = optional(User::findById(13))->getName();