Tipos de retornos do PHP 7: Por que não usá-los?

php_logoBom dia pessoal,

Hoje não venho falar a favor do PHP, mas sim contra, especificamente a implementação feita do PHP 7 para especificarmos os tipos de retornos de cada método.

Neste post estarei explicando como funciona os tipos de retornos no PHP 7.0 e comparando ao funcionamento do mesmo recurso linguagem Java, que por sua vez funciona da mesma maneira que o C#(uma das linguagens do .NET). Em seguida, estarei mostrando motivos para não utilizar este recurso do PHP.

Diferenças de linguagens fortemente tipadas e não fortemente tipadas

Antes de mais nada, o tipo de retorno do PHP 7 foi criado no intuito de começar a tornar o PHP em uma linguagem fortemente tipada. Isso não significa que o PHP 7 tenha se tornado uma linguagem fortemente tipada, mas posso afirmar que está caminhando para este rumo.

Mas afinal, uma linguagem fortemente tipada é uma característica ruim que está começando a ser adotada no PHP? A resposta para essa pergunta é certamente não. O fato do PHP não ser fortemente tipado não o torna uma linguagem ruim, no mercado temos inclusive outras linguagens muito utilizadas em grandes empresas nas quais também não são fortemente tipadas, como o Python(usado pela B2W, Globo.com, Hotel Urbano e demais empresas nas quais não posso citá-las), o JavaScript(usado basicamente em todas as empresas que adotam desenvolvimento da “plataforma” MEAN), entre outras.

O que torna uma linguagem fortemente tipada melhor que uma não fortemente tipada? Nas linguagens fortemente tipadas, o sistema operacional sabe exatamente quanto de memória armazenar para cada variável declarada no sistema, diferente das não fortemente tipadas, onde o interpretador/compilador deverá descobrir que tipo está sendo utilizada na variável declarada para depois sim armazenar a quantidade de espaço necessária na memória. Ainda temos a desvantagem de qualquer tipo poder ser inserido a qualquer momento, ou seja, caso uma variável tenha se tornado uma variável com valor inteiro, nada impede que ela guarde futuramente um valor string. A desvantagem de linguagens não fortemente tipadas começam quando o sistema desenvolvido tem muitos acessos simultâneos, onde a linguagem exigirá mais memória do computador em comparação a linguagem fortemente tipada.

Então, porque o Python(uma linguagem não fortemente tipada) é usado por empresas cujo seus sistemas tem muitos acessos simultâneos? A maioria das empresas que possuem sistemas muito grandes e com acessos simultâneos constantes, não se prende a somente uma linguagem. Por exemplo, a B2W não utiliza somente Python em seus projetos. Também utiliza Java e outras linguagens fortemente tipadas.

Tipo de retorno no PHP

Agora que foi explicado a diferença entre linguagens fortemente tipadas e não fortemente tipadas, vou mostrar como funciona os tipos de retornos no PHP 7. Vale lembrar que especificar o tipo de dado no qual um método irá retornar é uma característica de uma linguagem fortemente tipada que em outras palavras, aumenta o desempenho do PHP.

No PHP 7, além da opção de especificar o tipo de dado que será retornado por um método, foi criado o reconhecimento de tipos primitivos, são eles:

  • string: Usado para especificar que o dado é um texto;
  • int: Usado para especificar que o dado é um número inteiro;
  • float: Usado para especificar que o dado é um número real;
  • bool: Usado para especificar que o dado é um valor booleano(true/false – verdadeiro/falso)

Vale lembrar que desde o PHP 5.0 podemos especificar uma classe/interface como um tipo de dado, e desde o 5.1 podemos especificar array como tipo de dado.

No Java, a declaração do tipo de retorno de um método é obrigatório, diferente do PHP 7 que ainda é opcional. Abaixo estou colocando um exemplo de como escrever que um método retornará um inteiro no Java.

public int getIdade() {
    return this.idade;
}

Já no PHP 7, escrevemos utilizando a seguinte forma:

public function getIdade() : int
{
    return $this->idade;
}

Bem fácil né? Mas nem tudo são flores, pelo menos até a versão atual do PHP.

Porque não utilizar tipos de retornos no PHP

Existe uma “falha” lógica no meio da nova funcionalidade do PHP 7 que poderá interferir e muito na hora de colocarmos em prática. O problema basicamente existe quando não temos um valor declarado para o atributo “$idade”, que em outras palavras, deveria retornaria nulo.

No Java, assim como nas demais linguagens onde obrigatoriamente possui um tipo de retorno, se não existe nenhum valor atribuído ao atributo que está sendo chamado, é retornado o valor nulo sem nenhum problema. Já no PHP 7, se não existir nenhum valor atribuído ao atributo que está sendo chamado, é feita a tentativa de retornar valor nulo, porem o interpretador dá “fatal error“devido considerar “nulo” diferente do tipo declarado.

Em tipos primitivos podemos contornar o problema na seguinte forma:

public function getTexto() : string
{
    return !$this->texto
                ? ''
                : $this->texto;
}

public function getInteiro() : int
{
    return !$this->inteiro
                ? 0
                : $this->inteiro;
}

public function getReal() : float
{
    return !$this->real
                ? 0
                : $this->real;
}

public function getBooleano() : bool
{
    return !$this->booleano
                ? false
                : $this->booleano;
}

public function getArray() : array
{
    return !$this->array
                ? []
                : $this->array;
}

Porem, sabemos que no paradigma de sistemas orientados a objetos, na maioria das vezes precisamos retornar objetos. Por exemplo:

public function getDataNascimento() : \DateTime
{
    return $this->dataNascimento;
}

Neste caso, caso não haja um valor atribuído a “$dataNascimento”, aconteceria um “fatal error” durante a execução. Por tratar-se de um objeto, caso o mesmo não exista, muitas vezes não podemos criá-los em uma chamada a um método get. Por exemplo, se criássemos um objeto \DateTime, seria retornado a data atual do servidor e não a data de nascimento do usuário. Além disso, normalmente diversas classes possuem métodos construtores que muitas vezes seus atributos não serão acessíveis diretamente na classe onde o método get está sendo chamado.

Ainda sim, poderíamos resolver esse problema removendo a declaração do tipo de retorno, que não é obrigatório no PHP 7.

public function getDataNascimento()
{
    return $this->dataNascimento;
}

No caso acima, caso não exista valor atribuído ao atributo “$dataNascimento” o método get conseguirá retorna nulo sem ocorrer erros em tempo de execução.

Nos casos em que não ocorrerá esse problema, podemos utilizar os tipos de retornos? Sim. Porem neste caso o seu código-fonte não possuirá uma padronização recomendada e você terá um trabalho a mais para se assegurar de que o método no qual o tipo de retorno foi implementado jamais retornará nulo.

Links úteis

Por hoje é só pessoal, espero que tenham gostado e em caso de dúvidas, não deixem de comentar.

Abraços e até a próxima. 😉

7 comentários em “Tipos de retornos do PHP 7: Por que não usá-los?

      1. > Existe uma “falha” lógica no meio da nova funcionalidade do PHP 7 que poderá interferir e muito na hora de colocarmos em prática. O problema basicamente existe quando não temos um valor declarado para o atributo “$idade”, que em outras palavras, deveria retornaria nulo.

        “‘Falha’ lógica”… Quanta arrogância…

        Exceções vs retorno nulo é algo para se dicidir ao arquitetar sua aplicação ou biblioteca em PHP.

        Dizer que há falha lógica é dar um tapa na cara de todos desenvolvedores e a comunidade do PHP…

        Curtir

  1. Quando você se refere a a fortemente tipada ou fracamente tipada deve estar querendo dizer estaticamente tipada e dinamicamente tipada. São conceitos distintos.
    Python, por exemplo, é uma linguagem de tipagem dinâmica e forte, já o PHP é de tipagem dinâmica e fraca.

    Curtir

Deixe um comentário