Diogo Besson :: tecnologia

Criar 2 construtores diferentes em PHP

Criar 2 construtores diferentes em PHP

Criar 2 construtores diferentes em PHP ajuda a sobrecarregar o método construtor das classes em PHP

Encontrei esse tópico aqui na minha análise de buscas dentro deste blog como um dos mais procurados, então resolvi que deveria comentar um pouco sobre esse caso.

Como o pessoal que acompanha esse weblog deve lembrar, concluí há pouco tempo atrás o curso da Academia do Java, na Globalcode, em São Paulo. Esse curso me ensinou muito (graças ao mestre Jedi, sr. Giulian Dalton Luz) sobre orientação a objetos.

Um dos tópicos abordados foi “overload“, que significa “sobrecarregar” um certo método (veja também, polimorfismo), fazendo com que ele possa ser chamado de maneiras diferentes, passando parâmetros diferentes ou nenhum parâmetro na sua composição.

Como funciona essa parte de OO no PHP? Do mesmo jeito que no Java, oras! Ou pelo menos, deveria ser, pois orientação a objetos é um conceito e não uma linguagem. Ela não pode ser diferente ou variável de acordo com o projeto.

Acontece que, pela gênese do PHP, a orientação a objetos foi adaptada, enquanto que no Java, ela é nativa. Isso dá margem a uma série de diferenciações.

Minha fonte foi o fórum da bytes.com:
http://bytes.com/topic/php/answers/497948-constructor-overloading-php

Se você tentar programar as seguintes linhas:

class Teste{
function __construct($usuario){
}
function __construct($usuario, $senha){
}
function __construct($usuario, $senha, $nome){
}
}

Receberá o seguinte erro:
Fatal error: Cannot redeclare Teste::__construct()

Em linhas brasileiras, isso é um erro fatal de redeclaração de método dentro de uma classe.

E agora? Se o overload dá esse erro, como eu faço? Redeclaração não é quase sinônimo de overload? Como pode existir overload se redeclarações não são permitidas?

Calma……………..

Atenção, pessoal!
Segundo o conceito do PHP, isso não é considerado gambi:

class Teste{
function __construct($usuario, $senha=””, $nome=””){
}
}

Dessa maneira você pode codificar:

$x = new Teste(“usuario”);
ou
$x = new Teste(“usuario”, “senha”);
ou
$x = new Teste(“usuario”, “senha”, “nome”);

Os argumentos que não forem passados serão iguais a “”, que no caso é o valor default para $senha e $nome.

Isso acontece porque, segundo Janwillem Borleffs, overload é suportado no PHP, porém não da mesma forma como ele é suportado no Java.

Justo!

um abraço.

9 Comments

  1. Pedro Paulo

    Valeu, ajudou bastante aqui. Abraço.

  2. diogobesson

    Por nada, Pedro.

    Se tiver alguma outra sugestão sobre assustos que possamos discutir, ou qualquer outra observação referente a esse assunto, é só enviar.

    agradeço sua visita e sua participação.

    um abraço,

    Diogo Besson
    .

  3. Lucas

    Muito obrigado Diogo…. ^^

  4. diogobesson

    opa!!!
    😀
    agradeço sua visita.
    abraço!

  5. augustowend

    uma vez que voce conhece os possíveis paramentos de seu construtor, vc pode usar:
    public function __construct ()
    {
    $params = func_num_args();
    $len = sizeof($params);
    list($param1, $param2, $param3, … ) = $params;

    if (1 === $len) {
    $this->_constructor1($param1);
    } elseif (2 === $len) {
    $this->_constructor1($param1, $param2);
    } …
    }

  6. augustowend

    desculpa, a função correta para recuperar os parâmetros (e não parâmetros como ficou grafado na resposta anterior) é:

    func_get_args()

    func_num_args() retorna o numero de parâmetros.

  7. diogobesson

    Valeu Augusto!!!

  8. Cláudio Rosse Pandolfi

    Cara .. ai sim vi vantagem .. depois de semanas procurando .. foi o unico lugar que achei uma resposta.

    Muito obrigado

  9. Felipe

    Vamos concordar que isso ai não tem nada de overload neh, mas, infelizmente ou felizmente, é a forma que podemos fazer em php. Sinceramente, em alguns casos é muito melhor q sobrecarga.

Leave a Comment

O seu endereço de e-mail não será publicado.