INTRODUÇÃO PHP AULA 8 ORIENTAÇÃO A OBJETOS Professor: Leonardo Pereira E-mail: leongamerti@gmail.com Facebook: leongamerti Material de Estudo: http://www.leonti.vv.si A orientação a objetos ou OO é o paradigma mais utilizado para construção de sistema. Em vez de construir um sistema formado por um conjunto de funções e variáveis nem sempre agrupadas de acordo com o contexto, na OO utilizamos uma ótica mais próxima do mundo real. Lidamos com objetos, estruturas que já conhecemos do nosso dia-a-dia e sobre as quais possuímos maior compreensão. CLASSES E OBJETOS Ao trabalharmos com orientação a objetos é fundamental entender o conceitos de classes e objetos. Uma classe é uma estrutura que define um tipo de dados, podendo conter atributos e também métodos para manipular esses atributos. Pense em uma classe como um molde para criar (instanciar) objetos. CLASSES E OBJETOS Vamos declarar uma classe chamada Produto com 4 propriedades. Uma propriedade é uma variável que existe dentro do contexto de um objeto. Para declarar uma classe usamos a palavra chave class. Para declarar uma propriedade usamos a palavra chave var.
CLASSE PRODUTO CLASSES E OBJETOS var $codigo; var $descricao; var $preco; var $quantidade; Um objeto contém exatamente a mesma estrutura de uma classe. Por isso que falamos que a classe é o molde para um objeto. No entanto, sua estrutura é dinâmica. Seus atributos podem mudar de valor durante a execução do programa e podemos declarar diversos objetos oriundos de uma mesma classe. A classe é apenas o código fonte. O objeto é um pedaço de um programa em execução na CPU e residente na memoria principal. INCLUINDO CÓDIGO Para que um script contido em um arquivo separado possa ser usado, devemos chamá-lo utilizando uma das 4 funções abaixo: include include_once require require_once INCLUINDO CÓDIGO include: inclui um arquivo no escopo do programa tornando-se disponível a partir da linha em que a inclusão ocorre produzindo uma mensagem de advertência (warning) caso o arquivo não exista. include_once: funciona parecido com o include, porém só inclui o arquivo apenas uma vez, sendo útil em casos em que programa pode passar mais de uma vez pela instrução. require: similar ao include porém produz um erro fatal parando o processamento do código caso o arquivo não exista. require_once: similar ao require, porém o arquivo só é incluído uma única vez.
CLASSES E OBJETOS CLASSES E OBJETOS $p = new Produto; $p->codigo = 1000; $p->descricao = "Mouse sem fio"; echo $p->codigo; echo $p->descricao; No exemplo primeiro importamos o código fonte da classe Produto usamos a função include. Depois criamos um objeto da classe Produto usando o operador new seguido do nome da classe. Para acessar as propriedades de um objeto em nosso programa, utilizamos o nome da propriedade sem o $ precedido do nome do objeto. MÉTODOS MÉTODOS Agora vamos adicionar um método que é uma função declarada dentro da estrutura da classe. O método etiqueta() trabalha com as propriedades do objeto. Para diferenciar as propriedades de um objeto de variáveis locais, utiliza-se a pseudovariavel $this para referenciar as propriedades do objeto que está executando o método. var $codigo; var $descricao; var $preco; var $quantidade; function etiqueta(){ echo "$this->codigo - $this->descricao";
EXECUTANDO UM MÉTODO $p = new Produto; $p->codigo = 1000; $p->descricao = "Mouse sem fio"; $p->etiqueta(); // Saída é : 1000 Mouse sem fio Para executar um método é bem parecido com a atribuição de valor a uma propriedade. CLASSE É uma estrutura estática utilizada para descrever objetos mediante atributos e métodos. A classe é um modelo para criação de objetos. Ao modelarmos uma classe Pessoa, suas propriedades podem ser: nome, altura, idade, escolaridade e etc. Os métodos são as funcionalidades desempenhadas pela casse. No caso da classe Pessoa podemos ter os métodos falar(), crescer(), correr(), andar(). OBJETO MÉTODO COM RETORNO Um objeto é uma estrutura dinâmica originada com base em uma classe. Um objeto também é conhecido como instancia de uma classe, porque o objeto existe durante um dado instante de tempo que vai da sua criação ate a sua destruição. Podemos ter diversos objetos da classe Pessoa sendo que cada um pode possuir um valor diferente para suas respectivas propriedades. var $codigo; var $descricao; var $preco; var $quantidade; function etiqueta(){ echo "$this->codigo - $this->descricao"; function desconto($desconto){ $desconto = $desconto / 100; return $this->preco * $desconto;
MÉTODO COM RETORNO Um método pode retornar um valor quando for executado. Para isso usamos a palavra return da mesma forma que usamos quando criamos uma função comum. No final da execução do método, a instrução return devolve um determinado conteúdo para o chamador do método. MÉTODO COM RETORNO $p = new Produto; $p->codigo = 1000; $p->descricao = "Mouse sem fio"; $p->preco = 700; echo {$p->desconto(20) reais ; Saída: 140 reais. O método desconto possui retorno por isso que usamos o echo. Ao executar um método entre aspas duplas é necessário colocar a declaração entre chaves {. CONSTRUTORES CONSTRUTORES Um construtor é um método especial usado para definir o comportamento inicial de um objeto. É executado automaticamente no momento em que instanciamos um objeto por meio do operador new. Não se deve retornar nenhum valor por meio deste método porque o seu retorno é o próprio objeto que está sendo instanciado. Caso não seja definido um método construtor, automaticamente todas as propriedades do objeto criado são inicializados com NULL. Para definir um método construtor declaramos o método construct(); var $quantidade; function construct(){ $this->quantidade = 100;
CONSTRUTORES $p = new Produto; echo $p->quantidade; Saída é: 100 Agora, todo objeto criado possui inicial como quantidade o valor 100. DESTRUTORES Um destrutor ou finalizador é um método especial executado automaticamente quando o objeto é retirado da memória.. Isso ocorre nos seguintes casos: quando atribuímos o valor NULL ao objeto quando usamos a função unset() sobre o objeto quando o programa é finalizado. Para definir um método destrutor em uma classe basta declarar o método destruct(). DESTRUTORES DESTRUTORES var $codigo; var $descricao; function etiqueta(){ echo "$this->codigo - $this->descricao"; function destruct(){ echo "Objeto destruído"; $p = new Produto; $p->codigo = 100; $p->descricao = "Mouse sem fio"; echo $p->etiqueta(); Saída é: 100 - Mouse sem fio Objeto destruído A mensagem objeto destruído foi executado quando o script chegou no ponto.
ENCAPSULAMENTO É um mecanismo que fornece proteção de acesso aos membros internos de um objeto. Existem certas propriedades de uma classe que devem ser tratadas exclusivamente por métodos dela mesma, que são implementações projetadas para manipular essas propriedades de forma correta. As propriedades nunca devem ser acessadas diretamente de forma do escopo de uma classe, pois dessa forma a classe não fornece mais garantias sobre os atributos que contem, perdendo, assim a responsabilidade sobre ele. Os métodos devem ser projetados de forma a protegerem suas propriedades, fornecendo interfaces para a manipulação destas. ENCAPSULAMENTO Para atingir o encapsulamento, podemos definir a visibilidade das propriedades e dos métodos de um objeto. Existem 3 formas de acesso: private: membros declarados como private somente podem ser acessados dentro da própria classe. protected: somente podem ser acessados dentro da própria classe em que foram declarado e partir de classes filhas. public: podem ser acessados livremente. HERANÇA O uso da OO nos orienta em direção a uma maior organização de código, mas um dos maiores benefícios que encontramos na utilização desse paradigma é a possibilidade de reutilizar partes de código já definidas fornece maior agilidade no dia-a-dia. Através da herança eliminamos a necessidade de eventuais duplicações ou reescritas de código. HERANÇA Uma herança cria uma arvore genealógica onde as classes inferiores da hierarquia herdam todas as propriedades e os métodos das classes superiores, chamadas de superclasses. Este recurso tem uma aplicabilidade muito grande, visto que é relativamente comum termos de criar novas funcionalidades em software. Utilizando a herança, em vez de criamos uma estrutura totalmente nova, podemos reaproveitar uma estrutura já existente que nos fornece uma base abstrata para o desenvolvimento, provendo recursos básicos e comuns.
HERANÇA CLASSE FUNCIONÁRIO Vamos criar uma classe genérica chamada Funcionário e aproveitar seu código fonte para criar uma classe mais específica chamada e Médico. class Funcionario{ protected $nome; protected $salario; public function setnome($n){ $this->nome = $n; public function getnome(){ return $this->nome; public function setsalario($s){ $this->salario = $s; public function getsalario(){ return $this->salario; CLASSE MEDICO include_once "classes/funcionario.class.php"; class Medico extends Funcionario{ private $crm; public function setcrm($c){ $this->crm = $c; public function getcrm(){ return $this->crm; public function cracha(){ echo "$this->nome - $this->crm"; public function getsalario(){ return $this->salario * 1.1; // return parent::getsalario() * 1.1; CLASSE ENGENHEIRO include_once "classes/funcionario.class.php"; class Engenheiro extends Funcionario{ private $crea; public function setcrea($c){ $this->crea = $c; public function getcrea(){ return $this->crea; public function cracha(){ echo "$this->nome - $this->crea";
HERANÇA SOBRESCRITA OU OVERRIDING include_once "classes/medico.class.php"; include_once "classes/engenheiro.class.php"; $m = new Medico(); $m->setnome("patricia Silva"); $m->setcrm("331245-0"); $m->setsalario(1000); $m->cracha(); echo "<br>"; $e = new Engenheiro(); $e->setnome("vitor Mendes"); $e->setcrea("123456-9"); $e->setsalario(1000); $e->cracha(); Ocorre quando modificamos o comportamento de um método da classe pai na filha adicionando uma nova funcionalidade. Temos um exemplo de sobrescrita na classe Medico quando está sobrescreve a implementação de getsalario() herdada da superclasse Funcionário. Nela, o salario é aumentado em 10%. Vale ressaltar que na classe Engenheiro não ocorre esse procedimento. Se for necessário chamar um método da classe mãe podemos usar o parent. A linha comentada em getsalario() realizada o mesmo trabalho que a linha está acima porem chamando o getsalario() da superclasse. Como temos apenas um único método com varias implementações diferentes temos aqui presente o mecanismo chamado polimorfismo. SOBRESCRITA OU OVERRIDING CLASSES ABSTRATAS include_once "classes/medico.class.php"; include_once "classes/engenheiro.class.php"; $m = new Medico(); $m->setnome("henrique"); $m->setsalario(1000); echo $m->getnome(); echo $m->getsalario(); echo "<br>"; $e = new Engenheiro(); $e->setnome("leonardo"); $e->setsalario(1000); echo $e->getnome(); echo $e->getsalario(); Saída: Henrique 1100 Leonardo 1000 São classes estruturais, ou seja, que estão na hierarquia de classes para servirem de base para outras classes. São classes que nunca serão instanciadas na forma de objetos. Somente suas classes filhas permitiram a criação de objetos. Para isso, devemos marcar essas classes como classes abstratas para impedir que sejam criados objetos a partir delas. Se marcarmos a classe funcionário como abstract, ou seja, abstract class Funcionario, somente poderemos criar objetos a partir de Medico e Engenheiro.
MÉTODOS ABSTRATOS Consiste na definição de uma assinatura na classe abstrata. Este método deverá conter uma implementação na classe filha, mas não deve possuir uma implementação na classe em que ele é definido. Métodos abstratos só existem em classes abstratas. CLASSES FINAIS Uma classe marcado como final não pode ser uma superclasse, ou seja, não pode ser base em uma estrutura de herança. Para criar uma classe folha basta inserir a palavra final na declaração da classe. MÉTODOS FINAIS Um método final não pode ser sobrescrito, ou seja, não pode ser redefinido na classe-filha. Para marcar um método como final, basta utilizar o operador final no inicio da sua declaração. CONSTANTES Para criar uma constante usamos o operador const e seu acesso de forma externa ao contexto da classe é feito pela sintaxe: NomeDaClasse::NomeDaConstante. Dentro da classe é feito pela sintaxe self::nomedaconstante. O operador self representa a própria classe.
MÉTODOS ESTÁTICOS CLASSE CALCULADORA Podem ser invocados diretamente da classe, sem a necessidade de instanciar um objeto para isso. Ele não devem referenciar propriedades internas pelo operador $this, porque este operador é utilizado para referenciar instancias da classe, mas não a própria classe. Podem chamar apenas outros métodos estáticos da classe ou utilizar apenas propriedades estáticas e constantes de classe. Para executar um método estático, basta utilizar a sintaxe NomeDaClasse:NomeDoMétodo(). class Calculadora{ const pi = 3.14; // constante static function soma($a, $b){ return $a + $b; static function subtracao($a, $b){ return $a - $b; static function multiplicacao($a, $b){ return $a * $b; static function divisao($a, $b){ return $a / $b; static function areacirculo($raio){ return 2 * self::pi * $raio * $raio; EXEMPLO include_once "classes/calculadora.class.php"; echo Calculadora::pi; echo Calculadora::soma(4,2); echo Calculadora::subtracao(4,2); echo Calculadora::multiplicacao(4,2); echo Calculadora::divisao(4,2); echo Calculadora::areaCirculo(1); PROPRIEDADES ESTÁTICAS São atributos de uma classe sendo dinâmicas como as propriedades de um objeto, mas estão relacionados a classe. Como a classe é a estrutura comum a todos os objetos dela derivados, propriedades estáticas são compartilhadas entre todos os objetos de uma classe. Para fazer referencia à propriedade estática dentro da classe também usamos o self.
CLASSE PRODUTO EXEMPLO static $quantidade; function construct(){ self::$quantidade = self::$quantidade + 1; $a = new Produto; $b = new Produto; $c = new Produto; echo Produto::$quantidade; Saída é: 3 Foram criados 3 objetos da classe Produto. O construtor da classe incrementa em 1 a variável $quantidade a cada objeto instanciado. MÉTODO TOSTRING() CLASSE PRODUTO Um objeto não foi feito para ser impresso diretamente. Quando imprimimos a referencia de um objeto com echo ou print, o PHP exibe o identificador do objeto. Cada objeto possui seu identificador próprio. Para alterar esse comportamento, definindo um método tostring() para cada classe. Caso o método tostring() exista, no momento em que mandarmos exibir um objeto no console, o PHP irá imprimir o retorno dessa função. static $quantidade; function construct(){ self::$quantidade = self::$quantidade + 1; function tostring(){ $numero = self::$quantidade; return "Eu sou o objeto $numero";
EXEMPLO $a = new Produto; echo $a; $b = new Produto; echo $b; $c = new Produto; echo $c; Saída é: Eu sou o objeto 1 Eu sou o objeto 2 Eu sou o objeto 3