Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

João Batista Neto

1.2 - Herança de Classes

Recommended Posts

Recentemente falamos sobre essas coisas chamadas objetos e como classes agrupam essas coisas segundo suas características. Hoje falaremos como criar um objeto, seus componentes e, posteriormente, sobre herança.

Como dito, um objeto possui características (propriedades) porém, mais importante, um objeto possui comportamento:

 

 

Imagem Postada

 

 

Como sabemos, ao olhar para uma porta, que se trata de uma porta ?

Mesmo que essa porta não esteja instalada, ainda na prateleira de uma loja, basta olhar por um segundo que sabemos que se trata de uma porta, mas porquê ?

De fato, ao olhar para essa porta, nossa memória visual faz com que visualizemos tal aparato instalado e já funcionando, ou seja, fechando alguma entrada. Ao programar orientado a objetos, nossos objetos conhecem-se uns aos outros segundo seus comportamentos e não segundo suas características.

Imaginem-se em um salão, com 300 pessoas, você não conhece absolutamente ninguém, se você perguntar para alguém:

"Qual a cor de seus olhos ?"

Saber que uma pessoa tem os olhos verdes, azuis, ou de qualquer outra cor, ajudará você a conhecê-la ?

Agora, se você perguntar:

"O que você faz ?"

As pessoas poderão responder:

"Sou médico"
"Sou programador"
"Sou dentista"

Perceba que, conhecendo o que uma pessoa faz (seu comportamento) é muito mais útil do que conhecer a cor de seus olhos (característica), em orientação a objetos é a mesma coisa, não precisamos saber exatamente uma característica de um objeto e sim seu comportamento, qual a função que esse objeto exerce no todo, é através desse conhecimento que saberemos como utilizá-lo.

Assim como na biologia, onde um filho herda características e comportamentos do pai, na orientação a objetos um objeto também pode herdar características e comportamentos de seu pai, por exemplo, imagine uma classe Pai:

<?php
class Pai {
public $olhos = 'Azuis';
public $nome;
}

class Filho extends Pai {
}

$pai = new Pai();
$pai->nome = 'João';

$filho = new Filho();
$filho->nome = 'Neto';

echo 'O pai tem os olhos ' , $pai->olhos , '<br />';
echo 'O filho tem os olhos ' , $filho->olhos , '<br />';



A saída será:

O pai tem os olhos Azuis<br />
O filho tem os olhos Azuis<br />



Percebam que em nenhum momento, definimos que o filho teria os olhos azuis, ele simplesmente herdou a característica do pai, da mesma forma, ele poderia herdar comportamento:

<?php
class Pai {
public $olhos = 'Azuis';
public $nome;

public function digaOi(){
echo 'Oi, sou o ' , $this->nome , ', tenho os olhos ' , $this->olhos , '<br />';
}
}

class Filho extends Pai {
}

$pai->digaOi();
$filho->digaOi();



A saída será:

Oi, sou o João, tenho os olhos Azuis<br />
Oi, sou o Neto, tenho os olhos Azuis<br />



Percebam novamente, que em nenhum momento definimos o comportamento digaOi() para o filho, ele simplesmente herdou tal comportamento do pai.

Em PHP, utilizamos a palavra chave extends para definir herança de classes e utilizamos herança de classes para compartilhar código entre os herdeiros. Imaginem que tenhamos 50 classes que possuem vários comportamentos exatamente iguais, não existe nenhum sentido ficar reescrevendo o mesmo código para cada uma dessas classes. Imaginem em uma manutenção, teríamos que ajustar cada um dos 50 códigos !!!

Então, herança de classes serve exatamente para isso, compartilhar código entre os herdeiros.

Bom, por hora é só, no próximo artigo da série PHP Orientado a Objetos, falaremos sobre visibilidade e encapsulamento.

Imagem Postada

Próximo :seta:

Índice :seta:

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

boa fera ... =] parabas

hehe que continue assim estamo ansciosos pelos proximos ^^

 

obs: os verdinhos ou azuiszinhos podiam agrupa os topicos relacionados a seguencia desse "tutorial" sobre oop neh :P =]

 

valww

Compartilhar este post


Link para o post
Compartilhar em outros sites

João, muito bom sua explicação. Que bom que os conceitos que aprendi de herança estão corretos. haha

 

E continuamos na espera dos próximos artigos! :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

boa fera ... =] parabas

 

;)

 

agrupa os topicos relacionados a seguencia desse "tutorial" sobre oop neh

 

Já estou providenciando um tópico índice, para facilitar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom, bem didático e em capítulos pequenos e de fácil leitura.

 

Mas, antes que alguém venha e questione que o segundo exemplo não funcionou, eu sugiriria replicar a instrução de $pai e $filho do primeiro código, no segundo, antes de invocar o método.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ótimo material

 

já pode ser realocado na área de cursos

 

parabéns pelo grande trabalho

Compartilhar este post


Link para o post
Compartilhar em outros sites

João, suas explicações são muito boas, parabéns.

 

Tenho uma dúvida diferente. Conheço os conceitos da orientação a objeto porque programo em várias outras linguagens, mas queria migrar para o PHP.

 

Estava eu tentando fazer uns testes e não fui bem sucedido, na verdade o que estava tentando fazer era instanciar um objeto dentro de outro objeto, mas não consegui =[

poderia me dar uma dica se isso é possível em PHP e se for como fazer ou o que eu fiz de errado?

 

<?php
	class Arma{
		public $atq = "100";
	}
	class Escudo{
		public $def = "50";
	}
	class Gerreiro{
		public $arma = new Arma();
		public $escudo = new Escudo();
	}
	$gerreiro = new Gerreiro();
	echo $gerreiro->arma->atq;
?>

Desde já muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Properties

 

Class member variables are called "properties". You may also see them referred to using other terms such as "attributes" or "fields", but for the purposes of this reference we will use "properties". They are defined by using one of the keywords public, protected, or private, followed by a normal variable declaration. This declaration may include an initialization, but this initialization must be a constant value--that is, it must be able to be evaluated at compile time and must not depend on run-time information in order to be evaluated.

Tradução livre:

 

Propriedades

 

Membros variáveis de classes são chamados "propriedades". Você também poderá encontrá-los referenciados por outros termos como "atributos" ou "campos", mas para os propósitos desta referência utilizaremos "propriedades". Estas são definidas usando-se uma das palavras-chave public, protected ou private seguidos de uma declaração comum de variável. Esta declaração pode incluir uma inicialização, mas esta inicialização deve ser um valor constante - ou seja, pode ser um valor avaliado em tempo de execução mas não pode depender do tempo de execução para ser avaliado.

http://www.php.net/manual/pt_BR/language.oop5.properties.php

 

class Exemplo {
  public $permitido = 2 + 1;
  public $naopermitido = calcula(2+1);
}

 

Se quiser definir um valor para a estrutura de uma classe, este valor deve sempre ser o mesmo em todas as instâncias.

 

Para valores variáveis, popule os valores das propriedades durante o método mágico __construct

 

class Gerreiro{
   public $arma;
   public $escudo;

   public function __construct(){
       $this->arma = new arma();
       $this->escudo = new escudo();
   }

 

ou ainda:

interface ofensivo {
   public function getAtk();
}

interface defensivo {
   public function getDfn();
}

class espada implements ofensivo {
   private $atk = 10;

   public function getAtk(){
       return $this->atk;
   }
}

class escudo implements defensivo {
   private $dfn = 5;

   public function getDfn(){
       return $this->dfn;
   }
}

class Gerreiro{
   public $arma;
   public $escudo;

   public function __construct(ofensivo $arma, defensivo $escudo){
       $this->arma = $arma;
       $this->escudo = $escudo;
   }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito Obrigado Evandro.

 

Já havia tentado passar os objetos por parametro e seta-los por métodos, mas não tinha gostado da solução.

 

O Construtor já me ajudará nesta questão.

 

Mais uma vez: Muito Obrigado =]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ontem quase morri pra instalar PHP + Apache + Mysql... enfim isso é passado e comecei a aprender PHP pelo site do w3schools e agora to acompanhando esse tutorial... tava lendo as dúvidas e me surgiu essa:

 

<?php

interface ofensivo {
    public function getAtk();
}

interface defensivo {
    public function getDfn();
}

class arma implements ofensivo {
    private $atk = 10;

    public function getAtk(){
        return $this->atk;
    }
}

class escudo implements defensivo {
    private $dfn = 5;

    public function getDfn(){
        return $this->dfn;
    }
}

class Guerreiro{
    public $arma;
    public $escudo;

    public function __construct(ofensivo $arma, defensivo $escudo){
        $this->arma = $arma;
        $this->escudo = $escudo;
    }
}

$guerreiro = new Guerreiro();

echo $guerreiro->arma->atk;
echo $guerreiro;
echo $atk;
echo $guerreiro->$atk;
echo $guerreiro->$arma->$atk;

?>

Nenhum dos "echo" funciona... como eu devo escrever pra aparecer o atk ou a dfn do guerreiro? Por exemplo "Guerreiro X tem atk = Y"?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma vez que as propriedades referentes ao ataque e a defesa são possuem visibilidade private, você deveria usar os accessors getAtk() e getDfn()

Compartilhar este post


Link para o post
Compartilhar em outros sites

Irmão seria pedir muito pra você "desenhar" pra mim como ficaria o correto então? Não to em casa então não da pra eu confirmar agora... seria algo como:

"echo $guerreiro->ofensivo"? ou escrever mesmo "echo $guerreiro->getAtk()"?

 

Valeu! e tenham paciencia com um pobre iniciante kkk se der tempo hj ainda pretendo ler a aula 3! valeu

 

Desculpa o double post! Mas é que não tem mais como editar o de cima pelo visto... eu não consegui kkk

 

O que eu consegui até agora é esse código que não funciona... se alguém puder me ajudar eu agradeço!

 

<?php

interface ofensivo {
    public function getAtk();
}

interface defensivo {
    public function getDfn();
}

class arma implements ofensivo {
    private $atk = 10;

    public function getAtk(){
        return $this->atk;
    }
}

class escudo implements defensivo {
    private $dfn = 5;

    public function getDfn(){
        return $this->dfn;
    }
}


class Guerreiro{
    public $arma;
    public $escudo;

    public function __construct(ofensivo $arma, defensivo $escudo){
	$this->$arma = $arma;
        $this->$escudo = $escudo;
    }
}
	$escudo = new escudo();
        $arma = new arma();
	$guerreiro = new Guerreiro($arma,$escudo);

echo $guerreiro->arma->getAtk();
echo $guerreiro->escudo->getDfn();

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ivan, atente para os parâmetros de construção da classe "Guerreiro":

public funcion __construct(ofensivo $arma, defensivo $escudo){ ...

Estes valores entre parênteses implicam que, para criarmos um novo Objeto "Guerreiro", precisamos fornecer a ele um objeto ofensivo que será utilizado como $arma, além de um objeto defensivo para ser usado como $escudo.

 

Se não tivermos estes objetos, poderemos "forjá-los".

 

$guerreiro = new Guerreiro ( new arma, new escudo );
echo $guerreiro->arma->getAtk() . '<br>';
echo $guerreiro->escudo->getDef() . '<br>';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Evandro eu fiz o que você falou e não funcionou também... o seguinte, se eu uso o "echo 'Oi';" antes dessa linha de código

 

$guerreiro = new Guerreiro ( new arma, new escudo );

ele funciona normal... se eu coloco depois dessa linha ele para de funcionar... tem algum erro nela?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ivanildo, analise as classes Guerreiro que você mesmo postou nos posts #13 e #15.

 

Encontre a diferença, conserte-a e a do post #15 funcionará.

 

Aviso: É coisa beeeeeeem boba. Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

CONSEGUIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII AHHHHHHHHHHHHHHH VALEUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU

 

caracás que alegria irmão kkkkkkkkkkkkk depois de passa 2 dias torrando neuronios por horas e mais horas o negócio funcionou kkk pra qm já sabe de php deve se a coisa mais fácil do mundo faze isso... mas pra mim foi sensacional kkkkkkkkkkkkkk valeu pra todo mundo que ajudo!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.