PHP
Declarando tipo de retorno no PHP 7
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.