Criar 2 construtores diferentes em PHP :: Diogo Besson Web Tecno Log
Diogo Besson :: Websites > Diogo Besson :: tecnologia > tecnologia > 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:
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?
Segundo o conceito do PHP, isso não é considerado gambi:
function __construct($usuario, $senha="", $nome=""){
Dessa maneira você pode codificar:
$x = new Teste("usuario");
$x = new Teste("usuario", "senha");
$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.
Pedro Paulo 2 de novembro de 2009 at 22:07
Valeu, ajudou bastante aqui. Abraço.
diogobesson 3 de novembro de 2009 at 13:23
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.
Lucas 12 de setembro de 2011 at 22:26
Muito obrigado Diogo…. ^^
diogobesson 12 de setembro de 2011 at 22:39
augustowend 16 de setembro de 2011 at 13:37
uma vez que voce conhece os possíveis paramentos de seu construtor, vc pode usar:
$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);
augustowend 16 de setembro de 2011 at 13:43
desculpa, a função correta para recuperar os parâmetros (e não parâmetros como ficou grafado na resposta anterior) é:
func_num_args() retorna o numero de parâmetros.
diogobesson 16 de setembro de 2011 at 14:52
Cláudio Rosse Pandolfi 18 de novembro de 2011 at 13:39
Cara .. ai sim vi vantagem .. depois de semanas procurando .. foi o unico lugar que achei uma resposta.
Felipe 1 de Abril de 2013 at 20:30
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.