Pesquisar este blog

quarta-feira, 2 de setembro de 2015

POO - 03 Orientação a Objetos - O que é Herança, Visibilidades e encapsulamento

POO - 03 Orientação a Objetos - O que é Herança, Visibilidades e encapsulamento

Vamos de mais PHP e programação orientada à objetos. Agora vamos entender os termos Herança,  Visibilidade e Encapsulamento.

Visibilidade - é a forma como o atributo pode ser acessado e visualizado. Temos 3 tipos de visibilidade que podem ser trabalhadas nos atributos: Public, Private, e Protected.
public - aqui qualquer arquivo ou classe tem acesso a ver e alterar
private - somente a própria classe tem acesso ou visibilidade a essa propriedade, o acesso a essa propriedade só pode ser feito por meio de métodos..
protected - é como uma mistura da visibilidade public e private, de dentro da classe ele é acessado como o public pelos métodos, de outros objetos essa propriedade não poderá ser acessada diretamente o que faz essa propriedade assumir característica de uma visibilidade private quando acessado de outra classe que a herde.

Encapsulamento - é a possibilidade de visualizar e alterar informações.O aluno pode ver sua nota mas não pode digita-la para altera-la no sistema. Encapsular é uma forma de proteger as informações que não podem ser manipuladas por todos que acessem a mesma. Já que o aluno pode apenas visualizar a sua nota e não pode altera-la, não posso deixar essa informação dentro de um atributo declarado como public, pois o public permite que seja passado um novo valor facilmente por um usuário mal intencionado por exemplo.

Herança - é a característica de se poder passar propriedades de uma classe para outra. Na prática saberemos que uma classe carrega heranças de outras através da palavra chave extends.
Fica assim:
class nome_da_classe_que_recebe_a_herança extends nome_da_classe_pai {

Práticas e analise da classe MediaAluno() :

Essa analise tem como objetivo exibir na prática e identificar todos os termos vistos até o momento para um melhor entendimento dos mesmos e também para ver como todos esses termos se fazem necessário para um bom dialogo entre membros de uma equipe de desenvolvimento.

OBS: Aqui todos os comentários de código serão colocados com // no inicio do mesmo ou estando entre os símbolos de barra asterisco /* comentário */
Os textos em vermelho são apenas explicativos para fazer a prática não copiar os textos em vermelho ou comente os mesmos colocando // ao inicio do mesmo. Exemplo //esse é um atributo

arquivo MediaAluno.class.php essa classe é a classe pai (classe pai é uma classe que sede suas características e propriedades para outra classe através de herança).

<?php 
// declarando a classe, inicio da classe 
class MediaAluno{
private $nome;  //esse é um atributo com visibilidade public 
protected $turma; //esse é um atributo com visibilidade protecte
public $nota1;
public $nota2;
private $media; // esse é um atributo com visibilidade private
/*o valor do atributo $media não pode ser alterado por um usuario, só pode ser alterado por um método!*/

public function CalcularMedia($a, $b) {
//esse é o inicio do método CalcularMedia
    $this->nota1 = $a;
//o $this acessa elementos dessa classe
    $this->nota2 = $b;
    $this->media = ($this->nota1 + $this->nota2)/2;
    return $this->media;   
}// fim do método CalcularMedia()
}
// final da classe

// fim do código 
?>


Ótimo, agora vamos iniciar nossos primeiros testes:
TESTE 1:
$teste1 = new MediaAluno(); // instanciei a classe
$teste1->nota1 = 7;  // atribui valor em $nota1 
echo $teste1->nota1; // exibe o atributo $nota1

Salve e execute o arquivo no localhost e vera o seguinte resultado: 7

Então continuando o teste faça:
$teste1-> turma = "5A";  //atribui o valor em turma
echo $teste1->turma; // exibe o valor de turma

No teste acima vai dar erro na linha do $teste1-> turma = "5A"; isso porque o atributo $turma foi definido como protected, tente apagar essas duas ultimas linhas e atribuir um valor para a propriedade nome, e também dará erro por ser um elemento privado (private).

Como atribuir um valor para a propriedade nome e turma então? Vamos com mais um teste:
Agora nosso arquivo vai ficar assim: 
<?php 

class MediaAluno{
private $nome;  
protected $turma; 
public $nota1;
public $nota2;
private $media; 

public function CalcularMedia($a, $b) {
//esse é o inicio do método CalcularMedia
    $this->nota1 = $a;
//o $this acessa elementos dessa classe
    $this->nota2 = $b;
    $this->media = ($this->nota1 + $this->nota2)/2;
    return $this->media;   
}// fim do método CalcularMedia()

// agora teremos mais um método
public function testar($a,$b){
    $this->nome = $a; // valor passado pelo parâmetro do método ($a)
    $this->turma = $b;
    echo "O aluno/a eh:".$this->nome;// exibe o $nome
    echo"<br>"; // apenas uma quebra de linha
    echo "a turma eh: ".$this->turma;
}

}
// final da classe
$teste1 = new MediaAluno();
$teste1->nota1 = 7;
echo "<br>";
echo $teste1->nota1;
echo "<br>";
$teste1->testar('Laura', '4B'); // passa os valores por parâmetro
// os valores estão entre aspas pois é texto, separados por virgula
// Laura = $a     e     4B = $b


//echo $teste1->turma;
// fim do código 
?>

Agora basta salvar e executar o código no localhost e veremos que tudo irá funcionar normalmente.

TESTE 2:
Crie um arquivo FilhaDoMedia.class.php e escreva o seguinte código:

<?php

include "MediaAluno.class.php"; // inclui o arquivo 

class VerMedia extends MediaAluno {
/* note no class temos um extends então o VerMedia herda as propriedades de MediaAluno (classe do arquivo MediaAluno.class.php)
*/

    public function VA() {
//método VA
        $teste2 = new MediaAluno(); //instanciar a classe MediaAluno
        echo "a media eh:" . $teste1->CalcularMedia(10, 6); 
// chamar o método CalcularMedia do arquivo MediaAluno.class.php
        $teste2->turma = "Turma 1C"; // passa o valor para a turma
        echo "<br>";
        echo $teste2->turma; // exibe a turma
        echo '<br>';
         
    }
}

$t = new VerMedia();

$t->VA();
?>

Salve e execute o arquivo FilhaDoMedia.class.php no localhost

Agora vamos passar um valor para o $nome, assim:
Basta acrescentar a linha abaixo dentro do método VA() abaixo do echo "<br>";

$teste2->nome = "Rita";
echo $teste2->nome;

Salve e execute o arquivo no localhost, e então... Deu erro né. Pois é então o Private só pode ser acessado via método e dentro do próprio arquivo, e o protected já pode ser trabalhado por método fora e dentro do seu arquivo.
Pois então agora sim chegamos ao fim desse post, espero ter ajudado e até o próximo post!

Nenhum comentário:

Postar um comentário