Bora ajudar o programador a transformar café em código?

Mostrando postagens com marcador Programação orientada a objetos. Mostrar todas as postagens
Mostrando postagens com marcador Programação orientada a objetos. Mostrar todas as postagens

Método Construtor (Orientação a Objetos em PHP)

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Neste tutorial, vamos aprender o que é e como usar o método construtor em orientação a objetos em PHP.

Baixar a apostila

Criação de Objetos

Um objeto é cheio de informação, cheio de atributos, variáveis, funções, faz isso, faz aquilo e se você for lembrar de fazer tudo ao criar cada coisa, ficaria louco.

Imagina que é o chefe de TI de uma grande empresa, cada pessoa que entra você tem que registrar nome, setor, salário, carga horária...não ia dar, ia ser muito trabalho manual, e programador é preguiçoso por natureza.

Existe um método, chamado método construtor, que ele já cria um objeto com diversas informações, automaticamente.
É o método construtor.

Método Construtor

O método construtor é um método como outro qualquer, a primeira diferença é que ele tem o nome da classe. Sempre.
Se sua classe for "Funcionario", seu método vai se chamar "Funcionario".

O método construtor tem a característica de sempre iniciar ao criarmos um objeto.
Sempre que instanciamos um objeto, o método construtor é inicializado.

Teste:
<?php
 $nome = $_GET['name'];
 class Empregado {
  var $nome;
  function Empregado()
  {
   echo "Construtor invocado";
  }
 }

 $func = new Empregado();
?>

Vai aparecer "Construtor invocado".
Agora vamos fazer com que este construtor sete a variável $nome da classe.

Para isso, ao instanciarmos o objeto $func, precisamos passar uma variável.
Depois, imprimimos a variável $nome do objeto para ver se o método construtor inicializou ela corretamente, veja:
<?php
 $nome = $_GET['name'];
 class Empregado {
  var $nome;
  function Empregado($nome)
  {
   $this->nome=$nome;
  }

 }

 $nome = "João";
 $func = new Empregado($nome);
 echo $func->nome;

?>

Escopo de Atributos e Métodos: public, private, protected, final e static

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Neste tutorial, vamos aprender algumas palavras-chaves que permitem que nosso escopo tenha um comportamento especial relativo a segurança dos dados contidos.

Escopo de Atributo Public

Você pode declarar seus atributos com a palavra chave public antes:

class Pessoa
{
public $nome;
}

Isso significa que ele pode ser acessado e alterado do lado de fora por qualquer pessoa ou entidade:
$alguem = new Pessoa();
$alguem->nome = "Neil Peart";
$name = $alguem->nome;
echo "Nome da pessoa: $name";

Escopo de Atributo Private

Esse só pode ser acessado de dentro da clase.

class Pessoa
{
private $nome;
}

Para definirmos um valor para esse atributo, temos que criar um método setter:

class Pessoa
{
private $nome;

public function setNome($name) {
$this->nome = $name;
}
}

Escopo de Atributo Protected

Assim como algumas funções querem que variáveis existam somente dentro de seu escopo, podemos querer o mesmo em classes.
Para isso, usamos a palavra-chave protected:

class Pessoa
{
protected $nome;
}

Porém, atributos do tipo protected estão disponíveis para serem acessados e modificados por classes herdadas, o que é uma características não existente no modo private.

Escopo de Atributo Final

Fazendo com que uma variável seja final, você previne que ela seja sobrecarregada por uma subclase, ou seja, que outra classe defina um atributo 'por cima' na hora da herança.

class Pessoa
{
final $nome;
}

Discutiremos esse assunto mais em detalhes adiante.


Escopo dos Métodos

Assim como atributos, métodos também possuem seus escopos de níveis de encapsulação.

O public, permite que você invoque ele de qualquer lugar do código, como já fizemos alguma vezes.
Já o privado é mais recluso, não pode ser invocado por subclasses ou objetos instanciados.
O protected pode ser invocado por suas subclasses e em qualquer lugar da classe, sem problemas.

Existe ainda um tipo especial, chamado de abstract.
Ele é declarado na classe pai, porém só é implementado nas classes filhas.

Por exemplo, a classe:
class Animal
{
abstrc som();
}

Só isso.
Então a classe filha, que vai herdar a classe pai (ainda vamos estudar), é que implementa essa classe.
Se for um leão, implementa um som.
Se for uma cobra, implementa outro som.

Por fim, o escopo final, que assim como no atributo, evita que ela seja sobrescrita por qualquer classe herdada. Ela é a implementação única e final daquele método.

Propriedades SET e GET

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Fazer download da apostila de PHP

Propriedades

Nunca é interessante deixar que nossos atributos e métodos fiquem 100% disponíveis e livres para qualquer um usar, acessar ou até mesmo alterar, isso pode ser uma falha e deixar brecha para hackers invadirem seus sistemas.

Então, para acessar e alterar alguns tipos de informações, usaremos alguns métodos especiais, chamados accessors ou mutators, cujo único objetivo é alterar ou acessar determinadas informações, mas sob o 'olhar' vigilante e sanguinário do vigia, digo, do objeto, para saber o que está acontecendo de fato ali.

As funções Get e Set

Set significa...setar, configurar, colocar...quando setamos uma variável, estamos impondo um valor nela.
O método setName($name) por exemplo, vai colocar o valor $name na variável $name do objeto.

Para não confundir as coisas, a variável do objeto é definida pro:
$this->name
E a variável que vem de fora por: $name

Então, um método setName() que seta um nome para a variável do objeto é:
public function setName($name) {
$this->name = $name;
}


Get significa pegar, acessar...usamos ela para ter controle, pegar alguma informação de uma variável de um objeto, por exemplo, a getName(), retorna o valor da variável $name de um objeto:
public function getName() {
return $this->name;
}


Note que mais uma vez usamos o $this que serve para se referir ao próprio objeto.

Classe Empregado

Então uma classe Empregado, onde pedimos o nome do usuário, setamos o nome dele e depois exibimos, ficaria:
<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>

 <form action=ae method="get">
  Digite o nome do funcionario<input type="text" name="name" /><br />
  <input type="submit" name="submit" value="Testar" />
 </form> 

 <?php

  $nome = $_GET['name'];

 class Empregado {
  private $name;
  // Get
  public function getName() {
   return $this->name;
  }

  // Set

  public function setName($name) {
   $this->name = $name;
  }
 }
 
 $func = new Empregado();
 $func->setName($nome);
 echo "Funcionário: ".$func->getName();

?>

 </body>
</html>


Uso real de SET e GET

O uso mostrado de set e get, são apenas para enfatizar que você não deve deixar que acessem diretamente os dados de atributos.
O saldo bancário, por exemplo, é um atributo.

O método get para acessar esse atributo, só deve ocorrer depois do usuário fornecer a senha ou digital dele, provando ser ele o titular da conta, só então ele vai poder acessar o atributo, entende?

O mesmo jeito o método set.
Vamos supor que ele tenha mil na conta e queira setar um saque de 1200.
Não dá amigo.

Você precisa fazer uma verificação antes de permitir qualquer set. Pra depositar, ok, pode depositar o que for, agora pra sacar, tem regras, não é só sair sacando, a vida real não é assim? Pois é exatamente assim nos sistemas reais bancários, ok?

Relembre: use métodos para deixarem que acessem suas variáveis,seus sagrados atributos.

Características da Orientação a Objetos: Polimorfismo, Herança e Encapsulamento

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Neste tutorial, vamos estudar algumas vantagens da orientação a objetos, como o polimorfismo e a herança

Baixe: Apostila de PHP para download

Polimorfismo em Orientação a objetos

Não se preocupe com a quantidade de teoria dada neste início, vamos aprender tudo depois na prática.

Poli quer dizer várias, morfos maneira. Ou seja, polimorfismos quer dizer várias maneiras de fazer a mesma coisa, e essa é uma característica da orientação a objetos.

Imagine que a classe Automóvel tenha a função ligar().
Ora, a maneira de ligar um carro é diferente da maneira de ligar uma moto, que é diferente da maneira de ligar um triciclo e é diferente da maneira de ligar uma mobilete. Mas todos são automóveis, e todos ligam, e todos tem a função (que em orientação a objetos chamamos de métodos) ligar().

Então, ao executar o método ligar() de um carro ou de uma moto, ele vai ligar, pode ser de uma maneira ou outra, mas vai ligar.
Isso é polimorfismo, é a capacidade de fazer algo de maneiras diferentes.

Se você tem um objeto chamado "moto", para ligar ela, vai acionar o método: moto.ligar()
Se tem uma "BWM", vai chamar o mesmo método: BMW.ligar()

Porém, cada um deles funciona de uma maneira diferente, internamente, embora todos sejam automóveis.
Isso é a ideia básica por trás do polimorfismo. O importante é ligar o automóvel.

Herança em Orientação a objetos

Uma das características mais interessantes da orientação a objetos, é a da herança, que é a capacidade que uma classe tem de herdar informações de outras classes.

Vamos supor a classe Funcionario.
Ela define todos os funcionários de uma empresa.
O que todos funcionários tem em comum?

Ué, salário, horário de trabalho, tarefas a fazer...

Porém, cada funcionário, de cada setor, tem coisas especificas a fazer.

Os funcionários de TI, herdam as características da classe Funcionário: tem salário, horários a cumprir e tarefas a fazer dentro da empresa.
Os funcionários de entrega, também herdam algumas características, como salário, horários a cumprir, mas não ficam dentro da empresa, ficam fazendo entregas fora dela.

O presidente da empresa também é um funcionário, também vai herdar características gerais da classe Funcionário, como salário, mas vai viajar, vai passar dias fora, nem sempre vai estar na empresa.

O que queremos dizer com isso, é que algumas classes podem herdar informações e métodos de outras classes ditas superiores, assim evitamos escrever muito código.

Dizemos que a classe Funcionario é uma superclasse.
A classe TI é uma subclasse, assim como a Entregador é uma subclasse, pois herdam características da classe Funcionario.
Uma subclasse herda atributos e métodos de uma superclasse.

Com o uso da herança, você poupa escrever código ao escrever uma classe que difere de outra apenas em algumas detalhes menores e mais específicos.

Encapsulamento em Programação orientada a objetos

Até o momento, todo nosso código são ‘pedaços’ soltos, uma função aqui, um formulário ali, e as coisas meio que vão se encaixando.
Uma função, por exemplo, ela é do script inteiro, qualquer um pode ter acesso a ela e usar como bem entender, isso pode ser bom ou ruim.

Pode ser bom por facilitar a vida, já que ela deveria ser usada mesmo
Pode ser ruim porque algumas funções não deveriam ser usadas por algumas pessoas.
Por exemplo, a galera da TI não deveria ter acesso as funções da galera do setor da Tesouraria da empresa, concorda?

E é aí que vem o encapsulamento.
Quando criamos uma classe, definimos basicamente duas coisas dentro dela: informações (atributos) e ações (métodos) e estes são próprios. Somente os próprios objetos tem acesso a seus próprios atributos e métodos.

Se quiser que um objeto do setor de RH converse com um objeto do setor de TI, você vai ter que fazer um método específico em ambos os lados para que ocorra essa conversa.
Um objeto não faz ideia do que ocorre dentro de outro. É um mundo a parte. É o encapsulamento.

Por exemplo, os atributos e métodos do motor de um carro não são acessíveis pelo objeto ar-condicionado, assim esse não pode se meter naquele e ocasionar problema. É cada um no seu quadrado, entendeu?

Veja também

O melhor PC para programar

O melhor celular para programar