Layo 10 Denunciar post Postado Outubro 2, 2012 Boa noite galera beleza ?? Alguem tem um exemplo bem simples de polimorfismo do php ? estou começando a estudar o (POO) e nao consegui entender............. a herança OK consegui ... queria algo mais básico possivel apenas para entender como se usa com echo por exemplo bem básico.. Compartilhar este post Link para o post Compartilhar em outros sites
Vinicius Rangel 208 Denunciar post Postado Outubro 2, 2012 Polimorfismo é a capacidade de um mesmo objeto de se comportar de diversas formas diferentes ou de objetos totalmente diferentes se comportarem de forma igual. Palavras de João Neto o cara que tem uma didática muito boa através dos tutoriais na Imasters http://forum.imasters.com.br/forum/159-curso-de-php/ Compartilhar este post Link para o post Compartilhar em outros sites
Layo 10 Denunciar post Postado Outubro 3, 2012 Entao eu li o do joao e achei muito bom a didatica... com base no tutorial eu fiz um sera q eh isso utilizando o Nome 2 vezes ? isso eh o polimorfismo ? class Pai { public $nome; public $olhos; } class Filho extends Pai { public $carro; } $pai = new Pai; $pai->Nome = "Layo"; // nome $pai->Olhos = "azul"; $pai->Carro = "golf"; $filho = New Filho; $filho->Nome = "marcos"; // nome Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Jacinto 74 Denunciar post Postado Outubro 3, 2012 Não sei explicar, mas fiz um pequenos exemplo bem básico, que depois que ler os posts do João, entenderá facilmente. Ou que alguém do fórum te explique, pois explicar coisas não é comigo: <?php interface Nomes{ public function DefineNome(Idades $Idade); } /* Nomes */ class Joao implements Nomes{ public function DefineNome(Idades $Idade){ return "João"; } } class Gabriel implements Nomes{ public function DefineNome(Idades $Idade){ return "Gabriel"; } } /* Fim Nomes */ /*Idades*/ interface Idades{ public function Idade(Nomes $Nome); } class idade13 implements Idades{ public function Idade(Nomes $Nome){ return "13 anos"; } } class idade15 implements Idades{ public function Idade(Nomes $Nome){ return "15 anos"; } } /* Fim Idades */ /* Entregar os dados da pessoa à alguém */ class EntregarOsDados{ public function Entregar($Nome, $Idade){ echo "O usuário ".$Nome->DefineNome($Idade); echo "<br />"; echo "Ele tem ".$Idade->Idade($Nome); } } /* Fim [entregar] */ /* Fim da parte das classes */ $gabriel = new Gabriel(); $joao = new Joao(); $anos13 = new idade13(); $anos15 = new idade15(); $entregar = new EntregarOsDados(); $entregar->Entregar($gabriel, $anos13); /* Demos o nome: Gabriel a uma pessoa de 13 anos. */ Entao eu li o do joao e achei muito bom a didatica... com base no tutorial eu fiz um sera q eh isso utilizando o Nome 2 vezes ? isso eh o polimorfismo ? class Pai { public $nome; public $olhos; } class Filho extends Pai { public $carro; } $pai = new Pai; $pai->Nome = "Layo"; // nome $pai->Olhos = "azul"; $pai->Carro = "golf"; $filho = New Filho; $filho->Nome = "marcos"; // nome Não, isto é apenas métodos de herança. Compartilhar este post Link para o post Compartilhar em outros sites
Vinicius Rangel 208 Denunciar post Postado Outubro 3, 2012 Cara eu também penei de mais para aprender e mesmo aplicando tenho minhas dúvidas que vão se resolver ao longo do tempo e necessidade mas o básico creio que saberei falar o que é. Quando ele diz do mesmo objeto se comportando de mais de um modo eu vou tentar dar um exemplo teórico: você tem o seu objeto veiculo por exemplo um veiculo pode ser várias coisas então ao invés de você amarrar o seu código fazendo objeto Carro, Objeto Moto você simplesmente cria interfaces com métodos definidos e então quando uma pessoa precisar fazer um veiculo ela terá que implementar o veiculo que ela quer assim sendo "obrigada" a utilizar de seu métodos já definidos em sua interface. não leve a palavra "obrigada" como algo que vai amarrar o seu código pois é justamente o oposto. Compartilhar este post Link para o post Compartilhar em outros sites
Leonardo Leal 4 Denunciar post Postado Outubro 3, 2012 Então Layo, herança é basicamente isto ai mesmo, pois a subclasse (Filho) herda as propriedades $nome e $olhos da superclasse (Pai). Com herança você pode usar propriedades e métodos já implementados na superclasse. Porém aonde você diz: $pai = new Pai; ... $pai->Carro = "golf" está errado pois a classe Pai que é a superclasse não possui a propriedade $carro, está propriedade foi implementado apenas na classe Filho que é subclasse. Isto é o filho vai ter características do Pai, mas o Pai não vai ter características que o Filho gerou ao longo da vida. ps.: se você declara uma propriedade com letra minúscula (public $nome;)você deve utilizar da mesma forma ($pai->nome). Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Outubro 3, 2012 Pegando o exemplo teórico do Vinicius... um exemplo prático: <?php interface Veiculo { public function getModelo(); public function setModelo($modelo); } class Moto implements Veiculo { private $modelo; public function __construct($modelo){ $this->setModelo($modelo); } public function getModelo(){ return $this->modelo; } public function setModelo($modelo){ $this->modelo = $modelo; } } class Carro implements Veiculo { private $modelo; public function __construct($modelo){ $this->setModelo($modelo); } public function getModelo(){ return $this->modelo; } public function setModelo($modelo){ $this->modelo = $modelo; } } class Garagem { private $listaveiculo = array(); public function addVeiculo(Veiculo $veiculo){ $this->listaveiculo[] = $veiculo; } public function getListaVeiculo() { return $this->listaveiculo; } } $garagem = new Garagem(); $garagem->addVeiculo(new Carro("VW Gol G4")); $garagem->addVeiculo(new Carro("Ford Focus")); $garagem->addVeiculo(new Moto("Honda CBR 600")); $garagem->addVeiculo(new Carro("Ford Fiesta")); $garagem->addVeiculo(new Carro("Ford Ecosport")); $garagem->addVeiculo(new Carro("VW Gol G4")); $garagem->addVeiculo(new Moto("Yamaha R1")); $garagem->addVeiculo(new Carro("VW Gol G4")); $garagem->addVeiculo(new Carro("VW Polo")); $garagem->addVeiculo(new Moto("Honda CBR 600")); print_r($garagem->getListaVeiculo()); ?> Se você extender a funcionalidade da sua garagem para estacionar outros Veículos, você cria a classe, sei lá, por exemplo, Caminhao() e implementa a interface Veiculo(), pronto... sua classe Garagem já pode estacionar caminhões. Rs Não esquecendo de seguir a "assinatura" da interface. class Caminhao implements Veiculo { private $modelo; private $carregado; public function __construct($modelo){ $this->setModelo($modelo); } public function getModelo(){ return $this->modelo; } public function setModelo($modelo){ $this->modelo = $modelo; } public function isCarregado(){ return $this->carregado; } public function setCarregado($carregado){ $this->carregado = $carregado; } } Bons estudos. Compartilhar este post Link para o post Compartilhar em outros sites
Layo 10 Denunciar post Postado Outubro 3, 2012 Bom dia galera ??? primeiramente obrigado pelas respostas muito boas... Gabriel Jacinto - Cara muito obrigado ficou bem claro com o seu codigo, uma coisa que reparei q para um unico objeto se comportar diversas formas diferentes temos sempre q usar o interface e implements ? existe alguma forma sem usar os 2 ? Vinicius Rangel / Prog - Obrigado os 2 a ideia da garagem foi bem legal tambem surgiu a mesma duvida da de cima ... Leonardo Leal - Obrigado pela ajuda, cara acho entao q nao entendi herança muito bem: class Pai { public $Nome; public $Olhos; } class Filho extends Pai { public $Carro; } $pai = new Pai; $pai->Nome = "Layo"; // nome $pai->Olhos = "azul"; $pai->Carro = "golf"; O carro ele foi criado no filho entao nao poderia acontecer isso ? qual é entao a ideia da herança seguindo esse exemplo como eu faria uma herança ? Compartilhar este post Link para o post Compartilhar em outros sites
Prog 183 Denunciar post Postado Outubro 3, 2012 É ao contrário... $filho = new Filho(); $filho->Nome = "Layo"; // nome $filho->Olhos = "azul"; $filho->Carro = "golf"; O filho herda (extende) as características do pai (superclasse). Compartilhar este post Link para o post Compartilhar em outros sites
Vinicius Rangel 208 Denunciar post Postado Outubro 3, 2012 é só pensar que um Pai não pode herdar características do filho. Compartilhar este post Link para o post Compartilhar em outros sites
Leonardo Leal 4 Denunciar post Postado Outubro 3, 2012 O carro ele foi criado no filho entao nao poderia acontecer isso ? qual é entao a ideia da herança seguindo esse exemplo como eu faria uma herança ? class Pai { public $Nome; public $Olhos = "azul"; } class Filho extends Pai { public $Carro; } $pai = new Pai(); $pai->Nome = "Layo"; // nome echo $pai->Nome; //Layo echo $pai->Olhos; //Azuis echo $pai->Carro; //ERRO pois a propriedade não existe na classe pai e sim na filho $filho = new Filho(); $filho->Nome = "Pedro"; $filho->Carro = "golf"; echo $filho->Nome; //Pedro echo $filho->Olhos; //Azuis echo $filho->Carro; //golf Compartilhar este post Link para o post Compartilhar em outros sites
Layo 10 Denunciar post Postado Outubro 3, 2012 Galera agora sim entendi a herança !!! rsrs obrigado... desculpe se demorei para compreender mais estou começando a entrar nesse mundo de orientação a objeto agora... Ficou mais uma duvida o polimorfismo so ira funcionar com: interface implements Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Jacinto 74 Denunciar post Postado Outubro 3, 2012 Galera agora sim entendi a herança !!! rsrs obrigado... desculpe se demorei para compreender mais estou começando a entrar nesse mundo de orientação a objeto agora... Ficou mais uma duvida o polimorfismo so ira funcionar com: interface implements Bem, segundo o manual do PHP, diz que é possível por herança: Interfaces podem ser estendidas como classes, usando o operador extends. Compartilhar este post Link para o post Compartilhar em outros sites
Layo 10 Denunciar post Postado Outubro 4, 2012 Poxa legal....alguem tem um exemplo de como ficaria apenas por herança ?? os exemplos so tem com interfaces/implements ... Compartilhar este post Link para o post Compartilhar em outros sites
Vinicius Rangel 208 Denunciar post Postado Outubro 4, 2012 Exemplo do amigo Leornado: class Pai { public $Nome; public $Olhos = "azul"; } class Filho extends Pai { public $Carro; } $pai = new Pai(); $pai->Nome = "Layo"; // nome echo $pai->Nome; //Layo echo $pai->Olhos; //Azuis echo $pai->Carro; //ERRO pois a propriedade não existe na classe pai e sim na filho $filho = new Filho(); $filho->Nome = "Pedro"; $filho->Carro = "golf"; echo $filho->Nome; //Pedro echo $filho->Olhos; //Azuis echo $filho->Carro; //golf veja que na Classe pai ele definiu a propriedade Olhos e por padrão ele é azul. acontece que a classe filho não tem essa propriedade e a partir do momento que ele usou o extends ele passou a herdar propriedades e até métodos se tivesse. então quando ele criar um Objeto filho ele pode usar das propriedades do pai sem precisar ter no seu escopo ou até mesmo sem ter instanciado o Objeto Pai. Compartilhar este post Link para o post Compartilhar em outros sites