Programação para WEB II Programação para WEB II
Orientação a objetos no PHP Orientação a objetos no PHP
Contato: <[email protected]>
Site: docente.ifsc.edu.br/lara.popov/
Site: http://professores.chapeco.ifsc.edu.br/lara/
Parte II
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 2
Encapsulamento
Encapsulamento
Encapsulamento
● É um dos recursos mais interessantes que a programação orientada a objetos nos fornece.
● Trata-se de um mecanismo que provê proteção de acesso aos membros internos de um objeto.
● Alguns métodos e propriedades devem ser só de responsabilidade da classe-pai.
● Sem os modificadores de acesso, ela perde esta responsabilidade, fazendo com que outras classes tenham acesso a estes métodos e propriedades.
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 4
Encapsulamento
● Para atingir o encapsulamento, uma das formas é definindo a visibilidade das propriedades e dos métodos de um objeto.
● A visibilidade define a forma como essas propriedades devem ser acessadas.
Encapsulamento: formas de acesso
● - private: não permite ser acessado por classes descendentes (classes-filhas), só pode ser acessado dentro da própria classe.
● + public: significa que o método ou propriedade em questão pode ser acessado por todas as outras classes e métodos sem quaisquer restrições.
● # protected: pode ser acessado apenas por métodos da própria classe e classes filhas.
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 6
Encapsulamento Encapsulamento
- private
- private
Encapsulamento: private
● Vamos criar uma classe chamada Fornecedor e marcaremos algumas das propriedades como private.
● Dessa forma, os elementos private só poderão ser alterados por métodos da mesma classe.
Funcionário - Codigo
+ Nome
- Nascimento - Salario
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 8
Encapsulamento: private
Funcionario.class.php
<?php
class Funcionario { private $Codigo;
public $Nome;
private $Nascimento;
private $Salario;
}
?>
Funcionário - Codigo
+ Nome
- Nascimento - Salario
Encapsulamento: private
private.php
<?php
#carrega classe Funcionario
include_once 'Funcionario.class.php';
$ana = new Funcionario;
$ana->Salario = 'Oitocentos reais';
?>
RETORNO: Fatal error: Cannot access private property Funcionario::$Valor in
C:\xampp\htdocs\aulas\aula13\private.php on line 6
Funcionário - Codigo
+ Nome
- Nascimento - Salario
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 10
Encapsulamento: private
● Mas como faço para atribuir algo a essa propriedade caso necessário?
● Para atribuir algo, basta criar um método pertencente a classe Funcionario que manipule estas propriedades.
Encapsulamento: private: exemplo
//Incrementando a Classe Funcionario
…
// Método SetSalario
function SetSalario($Salario){
//verifica se é numérico e positivo
if(is_numeric($Salario) and ($Salario >0)){
$this->Salario = $Salario;
} }
//Método GetSalario function GetSalario(){
return $this->Salario;
}
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 12
Encapsulamento: private: exemplo
//Incrementando private.php
<?php
//carrega classe Funcionario
include_once 'Funcionario.class.php';
$ana = new Funcionario;
$ana->Nome = 'Ana';
//atribui novo valor
$ana->SetSalario(800);
//obtem valor
echo 'Nome: '.$ana->Nome;
echo '<br/>Salário: R$ '.$ana->GetSalario();
?>
Encapsulamento: private
● Poderíamos criar um set e um get para mais elementos definidos como private mas cuidado, utilize os Getters e Setters somente quando existe a real necessidade, variáveis internas ou que não precisam de nenhum tipo de verificação ou tratamento, não utilize.
● Prefira sempre utilizar métodos Get e Set ao invés de um campo público (public) mas lembre-se, simplificar é a alma da POO, criar dezenas de métodos não simplifica.
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 14
Encapsulamento Encapsulamento
+ protected
+ protected
Encapsulamento: protected
● Vale ressaltar que quando uma propriedade é definida como private, ela não pode ser sobrescrita por classes filhas, ou seja, uma classe filha não consegue chamar os métodos setters e getters da classe pai (no caso do atributo estar como private).
● Caso você tenha uma classe Funcionário com o método setSalario e o atributo Salário do tipo private, e crie a subclasse Estagiário, você não consegue chamar o método mesmo fazendo uso da herança, está é uma característica do private.
● Em outras palavras, se um atributo é do tipo private, ele só funciona na classe que foi declarado, caso você queira fazer uso do mesmo em outras classes (filhas) é necessário modificar o tipo para Protected.
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 16
Encapsulamento: protected
Estagiario.class.php
class Estagiario extends Funcionario{
function GetSalario(){
return $this->Salario * 1.12;
} }
Funcionário - Codigo
+ Nome
- Nascimento
# Salario
+SetSalario() +GetSalario()
Estagiário +GetSalario()
Encapsulamento: protected
● Depois das duas classes criadas, vamos criar o objeto estagiário:
$aninha = new Estagiario;
$aninha->Nome = 'Ana';
//atribui novo valor
$aninha->SetSalario(800);
//obtem valor
echo 'Nome: '.$aninha->Nome;
echo '<br/>Salário: R$ '.$aninha->GetSalario();
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 18
Encapsulamento Encapsulamento
+ public
+ public
Encapsulamento: public
● Explicar o comportamento do modificador de acesso public é simples, pois é a propriedade padrão do PHP.
● Quando não é definido a visibilidade, ela será pública ou seja, você pode modificar, herdar ou atribuir sem nenhum impedimento, não é necessário os métodos Gets e Sets para propriedades públicas.
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 20
Encapsulamento: public
…
$paulo = new Funcionario;
$paulo->Nome = 'Ana';
//obtem valor
echo 'Nome: '.$paulo->Nome;
...
Armazenamento
● As classes permitem armazenar valores de duas formas:
– constantes de classe e
– propriedades estáticas.
● Estes atributos são comuns em todos os objetos da mesma classe.
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 22
Constantes
Constantes
Constantes
● Uma constante é exatamente o oposto de uma variável, ou seja, algo que mantém seu valor até o final do script (salvo alguma exceções).
● Geralmente definimos uma constante perto do início do código ou em uma função.
● A declaração de constantes é feita através da palavra- chave const.
● Acessar constantes de classe fora do escopo dela:
– NomeClasse::Constante;
● Dentro da classe:
– self::Constante
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 24
Constantes: exemplo
/* Vamos declarar uma
* constante chamada pi
*/
class Funcoes{
const Pi = 3.14;
}
/* Vamos herdar Funcoes
* e criar outra constante
*/
class Aplicacao extends Funcoes{
const Versao = 2.7;
function __construct($Nome){
echo $Nome. "<br/>";
echo self::Versao . "< br />";
echo parent::Pi . "< br />";
echo Funcoes::Pi . "< br />";
} }
$sistema = new Aplicacao("IFSC Software");
Propriedades e Propriedades e
Métodos
Métodos
estáticos
estáticos
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 26
Propriedades e métodos estáticos
● Podemos considerar que propriedades e métodos estáticos podem ser acessados sem a necessidade de instanciar um objeto.
● Utilizamos este recurso quando, por exemplo, temos um método que é acessado diversas vezes na mesma aplicação, e queremos economizar algumas linhas de código a fim de não ter que criar um objeto a todo momento.
Propriedades e métodos estáticos
● É importante destacar que um método estático não pode fazer referência a propriedades internas pelo operador
$this, pois este operador é usado para referenciar instâncias da classe ou seja, objetos.
● Utilizamos a palavra chave static para definir a declaração de membros estáticos.
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 28
Propriedades e métodos estáticos
class Teste{
public static $propriedade = "Esta é uma propriedade estática";
public static function MetodoEstatico(){
echo "Este é um método estático";
} }
/* Para acessar é simples,
* perceba que não é necessário
* criar o objeto.
*/
echo Teste::$propriedade;
//Agora o método
Teste::MetodoEstatico();
Propriedades e métodos estáticos
● Membros estáticos também podem ser acessados internamente utilizando o operador self (o mesmo que vimos anteriormente), veja:
class Teste{
public static $propriedade = "www.cafeesoftware.com - Transformando Café em Software";
public static function RetornaPropriedade(){
return self::propriedade;
}
public static function UsarMetodoRetorna(){
return self::RetornaPropriedade();
} }
// Para acessar:
echo Teste::RetornaPropriedade();
Teste::UsarMetodoRetorna();
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 30
Propriedades e métodos estáticos
● Quando se tratar de uma subclasse herdando propriedades ou mesmo métodos estáticos, a referência é feita normalmente através da palavra reservada parent, como já vimos anteriormente.
Associação, Associação, Agregação e Agregação e
Composição
Composição
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 32
Conceitos
● Associação:
– É a relação mais comum entre dois objetos.
– Quando acontece? Quando uma classe
“usa” outra classe.
– Exemplo: Um motorista utiliza (depende do carro, mas este não faz parte do motorista) o carro para trabalhar.
Conceitos
● Agregação:
– É o tipo de relação conhecida como todo/parte.
– Na agregação o objeto agrega outro objeto, ou seja, torna um objeto externo parte de si..
– Assim o objeto pai poderá utilizar funcionalidades do objeto agregado, mas ele não depende dele (agregado) para existir.
– Exemplo: A tampa de uma caneta é parte da caneta, se a caneta não tiver a tampa, ela não deixará de ser uma caneta.
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 34
Conceitos
● Composição:
– Neste caso, o objeto-pai é responsável pela criação e destruição de suas partes.
– O objeto-pai realmente “possui” as instâncias de suas partes.
Resumidamente, um só existe caso o outro também exista.
– Exemplo: O motor de um carro é parte fundamental do carro.
Associação
Associação
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 36
Associação
● A forma mais comum de associação é quando temos um objeto como atributo de outro.
● Criaremos um objeto Produto e outro Fornecedor. Onde Fornecedor é um dos atributos de Produto.
Associação
Produto Id: Integer Nome: String Valor: Float
Fornecedor: Fornecedor
Fornecedor Id: Integer
RazaoSocial: String Endereco: String Telefone: String
Observe que uma das propriedades (Fornecedor), espera receber um objeto do tipo Fornecedor.
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 38
Associação
class Produto{
public $Id;
public $Nome;
public $Valor;
public $Fornecedor;
public function __construct($Id, $Nome, $Valor, $Fornecedor){
$this->Id = $Id;
$this->Nome = $Nome;
$this->Valor = $Valor;
$this->Fornecedor = $Fornecedor;
} }
Associação
class Fornecedor{
public $Id;
public $RazaoSocial;
public $Endereco;
public $Telefone;
public function __construct($Id, $RazaoSocial, $Endereco, $Telefone){
$this->Id = $Id;
$this->RazaoSocial = $RazaoSocial;
$this->Endereco = $Endereco;
$this->Telefone = $Telefone;
} }
$fornecedor = new Fornecedor(359, "Mercado da Casa", "Rua B", "3232-2222" );
$produto = new Produto(122, "Café 250g", 2.85, $fornecedor );
echo "Código: " . $produto->Codigo . "<br />";
echo "Produto: " . $produto->Nome . "<br />";
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 40
Agregação
Agregação
Agregação
● Conforme visto anteriormente, esta relação se dá quando temos o
“TODO/PARTE”.
● Uma forma de exemplificar sua implementação e com o clássico exemplo de um carrinho de compras.
● Teremos duas classes, produto (bem parecido com a que vimos anteriormente) e a classe Carrinho.
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 42
Agregação
Produto Id: Integer Nome: String Valor: Float
Fornecedor: Fornecedor
Carrinho
Itens: Produto
ExibeLista() CalculaTotal()0
Observe que Itens é um array, poderia ser representando como: Itens[] : Produto.
Agregação
class Produto{
public $Id;
public $Nome;
public $Valor;
public function __construct($Id, $Nome, $Valor){
$this->Id = $Id;
$this->Nome = $Nome;
$this->Valor = $Valor;
} }
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 44
Agregação
class Carrinho{
private $itens;
public function InsereProduto(Produto $item){
$this->itens[] = $item;
}
public function ExibeLista(){
foreach( $this->itens as $item ){
return $item->nome."<br />;
} }
public function CalculaTotal(){
$valor_total = 0;
foreach( $this->itens as $item ){
$valor_total += $item->Valor;
}
echo " R$ " . number_format($valor_total, 2, ',', '.');
} }
Agregação
$produto1 = new Produto(1, "Milho verde", 1.75);
$produto2 = new Produto(2, "Ervilha", 1.65);
$produto3 = new Produto(3, "Café 250Gr", 3.45);
$produto4 = new Produto(4, "Refrigerante 2L", 3.69);
$CarrinhoCompra = new Carrinho();
$CarrinhoCompra->InsereProduto($produto1);
$CarrinhoCompra->InsereProduto($produto2);
$CarrinhoCompra->InsereProduto($produto3);
$CarrinhoCompra->InsereProduto($produto4);
$CarrinhoCompra->ExibeLista();
$CarrinhoCompra->CalculaTotal();
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 46
Composição
Composição
Composição
● A diferença da composição para a agregação é que quando o objeto
“todo” é destruído, suas partes também são, exatamente por terem sido criadas pelo objeto “todo”.
● Podemos dizer que na composição o objeto-pai “possui” as instâncias de suas partes.
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 48
Composição
Cliente
Codigo: Integer Endereco: String
Contato: Contato
Contato
Nome: Integer Email: String
Telefone: String
Observe que Itens é um array, poderia ser representando como: Itens[] : Produto.
Composição
class Contato{
public $Nome;
public $Email;
public $Telefone;
/* Método setContato()* Grava informações de contato */
public function setContato($Nome, $Email, $Telefone){
$this->Nome = $Nome;
$this->Email = $Email;
$this->Telefone = $Telefone;
}
/* Método EscreveContato() Escreve as informações de contato */
public function EscreveContato(){
echo "Nome: " . $this->Nome . "<br />";
echo "Email: " . $this->Email . "<br />";
echo "Telefone: " . $this->Telefone . "<br />";
}
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 50
Composição
class Cliente{
public $Codigo;
public $Endereco;
public $Contato;
/* Método construtor() Construtor da classe */
public function __construct(){
/* Instancia um novo Contato Perceba que isso só é feito aqui. Não é feito fora dessa* classe */
$this->Contato = new Contato();
}
/* Método setContato() Grava informações de contato */
public function setContato($Nome, $Email, $Telefone){
// Chama e envia informações para o objeto Contato $this->Contato->setContato($Nome, $Email, $Telefone);
}
/* Método EscreveContato() Escreve as informações de contato */
public function EscreveContato(){
// Chama um método do objeto Contato $this->Contato->EscreveContato();
} }
Composição
$leandro = new Cliente();
$leandro->Codigo = 7;
$leandro-
>setContato("Leandro","leandrocastro@gmail .com","(33) 3333-3333");
$leandro->Endereco = "Rua 13 de maio";
$leandro->EscreveContato();
echo "Endereço: " . $leandro->Endereco;
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 52
Exercícios
Exercícios
Revisando
● http://ned.unifenas.br/cursosgratuitos/2 012/poo/
Lara Popov Zambiasi Bazzi Oberderfer Programação para WEB II
Programação para WEB II 54
Revisando Orientação a Objetos
● Classe
● Objeto
● Construtores
● Destrutores
● Herança
● Polimorfismo
● Encapsulamento
● Abstração
● Associação
● Agregação
● Composição
Referencias Bibliográficas
● Introdução à Orientação a Objetos em PHP.
Disponível em:
http://www.devmedia.com.br/introducao-a- orientacao-a-objetos-em-php/26762.
Acesso em: 07 de Ago de 2014.
● Curso de PHP Orientado a Objetos.
Disponível em:
http://cafeesoftware.com/curso-de-php-
orientado-a-objetos-parte-1/. Acesso em 08 de Ago de 2014.