PHP

Declarando tipo de retorno no PHP 7

Por em

O PHP 7 chegou e trouxe muitas novidades! Neste artigo vamos falar sobre o Return Type Hinting. Vamos lá!

Este é um recurso que já existe em outras linguagens de programação, como por exemplo, o Java, e agora está disponível também na linguagem PHP a partir da versão 7.

Mas antes de iniciarmos, vamos entender este conceito que é muito simples e consiste em determinar qual o tipo de retorno a função alvo terá, ou seja, é como se fosse possível dizermos o seguinte: “A função getName() irá retornar um dado do tipo string”, simples não é?

Veja o exemplo abaixo:

// anterior ao PHP 7
function getName()
{
   return "SchoolOfNet";
}

// a partir do PHP 7
function getName() : string
{
   return “SchoolOfNet”;
}

Percebam que no segundo bloco de código, foi acrescentado na assinatura da função o tipo de dado que ela deverá retornar. Muito simples!

Vamos aprofundar um pouco mais neste assunto e ver este comportamento aplicado na orientação a objetos. Vejam o bloco de código abaixo:

<?php

interface LogInterface
{
   public function write() : string;
}

class AppLog implements LogInterface
{
   public function write() : string
   {
       // do anything here…
       return "log success";
   }
}

$log = new AppLog();
var_dump($log->write());  // string(11) "log success"

Interessante!

Vejam que a nossa classe AppLog implementa a interface LogInterface, logo precisamos implementar o método write, que por sua vez, na sua assinatura é explicito que o mesmo deve retornar um tipo string, e assim também deve ser na declaração do método que o implementa, ou seja, deve estar declarado que o mesmo retorna um tipo string.

Vamos ver agora um exemplo de uma função retornando uma classe como tipo de dado. Veja o exemplo abaixo:

<?php

class Course
{

}

class School
{
    public function getCourse() : Course
    {
        return new Course();
    }
}

$school = new School();
var_dump($school->getCourse()); // object (Course)

No exemplo acima nossa função getCourse() declara em sua assinatura que será retornado um dado do tipo Course, ou seja, a classe Course.

Até agora tudo funcionou muito bem! Mas e se eu retornar um null?

Vamos ver o código abaixo:

<?php

function getMyBirthay() : DateTime
{
   return null;
}

getMyBirthay(); // fatal error

Percebam que declaramos que nossa função deve retornar um tipo DateTime, mas retornamos um null, neste caso vamos obter o seguinte erro:

Fatal error: Uncaught TypeError: Return value of getMyBirthay() must be an instance of DateTime, null returned in /Users/leandrorichard/Desktop/son/php-7/index.php:4 Stack trace: #0 /Users/leandrorichard/Desktop/son/php-7/index.php(7): getMyBirthay() #1 {main} thrown in/Users/leandrorichard/Desktop/son/php-7/index.php on line 4

A mensagem do erro obtido é bem objetiva, “você me disse que iria retornar um DateTime e retornou um null, e isso não pode, é um erro.”, ou seja, declarar um tipo de retorno e retornar null, ira gerar um Fatal error. Porém, ainda assim, podemos omitir o tipo de retorno da função, neste caso qualquer tipo de dado poderá ser retornado, inclusive o null. Vejam o exemplo abaixo:

<?php

function getMyBirthay()
{
   return null;
}

var_dump(getMyBirthay()); // null

Vamos ver mais dois exemplos, agora com relação aos métodos __construct() e __destruct():

<?php

// Example with __construct
class MyConstruct
{
    public function __construct() : string
    {
        return 'construct class';
    }
}

$myConstruct = new MyConstruct(); // fatal error
<?php

// Example with __destruct
class MyDestruct
{
    public function __destruct() : string
    {
        return 'destruct class';
    }
}

$myDestruct = new MyDestruct(); // fatal error

Para ambos os exemplos acima, teremos um Fatal Error, pois os métodos __construct() e __destruct() não podem declarar o tipo de retorno.

Vejam os respectivos erros abaixo:

// __construct method
PHP Fatal error: Constructor MyConstruct::__construct() cannot declare a return type
// __destruct method
PHP Fatal error: Destructor MyDestruct::__destruct() cannot declare a return type

Pessoal chegamos ao final deste artigo, como vocês puderam ver a declaração do tipo de retorno é um recurso muito útil e ao mesmo tempo muito simples.

Um abraço e até a próxima.