Post de quarentena - Nullable types vs. Parâmetros opcionais


Nullable Types é um recurso adicionado a partir da versão 7.1 do PHP, ele serve para permitir que um parâmetro possa receber nulo além do tipo definido como type hinting. A função printName a seguir espera um parâmetro do tipo StdClass, só que o ponto de interrogação (?) antes da declaração do tipo define esse parâmetro como nullable type.

<?php

function printName(?StdClass $user)
{

    if(!is_null($user)){
        echo sprinf('Meu nome é %s', $user->name), PHP_EOL;
        return;
    }
    
    echo 'Nenhum nome!', PHP_EOL;

}

Como o parâmetro é nullable type, ele pode ser executado de duas formas: passando o tipo esperado ou passando um valor nulo.

<?php

$user = new \StdClass;
$user->name = 'Usuário da Silva';

printName($user); // Imprime 'Meu nome é Usuário da Silva'
printName(null); // Imprime 'Nenhum nome!'

Isso difere o recurso de nullable types dos parâmetros opcionais, pois quando um parâmetro opcional é definido, significa que a função pode ser chamada sem nenhum parâmetro. Segue o código:

<?php

// Agora o parâmetro é opcional
function printName(StdClass $user = null)
{

    if(!is_null($user)){
        echo sprinf('Meu nome é %s', $user->name), PHP_EOL;
        return;
    }
    
    echo 'Nenhum nome!', PHP_EOL;

}

$user = new \StdClass;
$user->name = 'Usuário da Silva';

printName($user); // Imprime 'Meu nome é Usuário da Silva'
printName(null); // Imprime 'Nenhum nome!'

// É possível executar a função sem parâmetro.
printName(); // Imprime 'Nenhum nome!'

Como é possível perceber na terceira execução da função, nenhum parâmetro está sendo passado, isso é possível porque o parâmetro foi declarado como opcional. Essa é a diferença principal, já que no nullable type não dá para omitir um parâmetro, pois é necessário que ele receba um valor nulo explicitamente (além do tipo esperado, é claro).


ver todos os posts
Publicado em 20/04/2020
Para comentar ou oferecer sugestões, por favor abra uma issue no repositório deste blog no github.