Tutorial do conceito de programação orientada a objetos (OOPs) PHP com exemplo
O que são OOPs?
Orientado a Objetos é uma abordagem de desenvolvimento de software que modela aplicativos em torno de objetos do mundo real, como funcionários, carros, contas bancárias, etc. Uma classe define as propriedades e métodos de um objeto do mundo real. Um objeto é uma ocorrência de uma classe.
Os três componentes básicos da orientação a objetos são;
- Análise orientada a objetos – funcionalidade do sistema
- Design orientado a objetos – arquitetura do sistema
- Programação orientada a objetos – implementação da aplicação
Princípios de programação orientada a objetos
Os três princípios principais da OOP são;
- Encapsulamento – trata-se de ocultar os detalhes da implementação e apenas expor os métodos. O principal objetivo do encapsulamento é;
- Reduza a complexidade do desenvolvimento de software – ao ocultar os detalhes da implementação e expor apenas as operações, o uso de uma classe torna-se fácil.
- Proteja o estado interno de um objeto – o acesso às variáveis da classe é feito através de métodos como get e set, o que torna a classe flexível e fácil de manter.
- A implementação interna da classe pode ser alterada sem a preocupação de quebrar o código que utiliza a classe.
- Herança – trata-se da relação entre as classes. O relacionamento assume a forma de pai e filho. O filho usa os métodos definidos na classe pai. O principal objetivo da herança é;
- Reutilização – vários filhos podem herdar do mesmo pai. Isso é muito útil quando precisamos fornecer funcionalidades comuns, como adicionar, atualizar e excluir dados do banco de dados.
- Polimorfismo – trata-se de ter um formulário único, mas muitas formas de implementação diferentes. O principal objetivo do polimorfismo é;
- Simplifique a manutenção de aplicativos e torne-os mais extensíveis.
OOPs Concepts em PHP
PHP é uma linguagem de script orientada a objetos; ele apóia todos os princípios acima. Os princípios acima são alcançados através de;
- Encapsulamento – através do uso dos métodos “get” e “set”, etc.
- Herança – através do uso da palavra-chave extends
- Polimorfismo – através do uso da palavra-chave implements
Agora que temos o conhecimento básico de OOP e como ele é suportado em PHP, vejamos exemplos que implementam os princípios acima
O que é UML?
Linguagem de Modelagem Unificada UML é uma técnica usada para projetar e documentar sistemas orientados a objetos.
A UML produz vários documentos, mas veremos o diagrama de classes, que é muito importante para a programação PHP orientada a objetos.
Exemplo de diagrama de classes
Chave do Diagrama de Classes
- A Caixa superior contém o nome da classe
- A caixa do meio contém as variáveis de classe
- A caixa inferior contém os métodos da classe
- A menos (-) signo significa escopo privado
- A mais (+) sinal significa escopo público
- A cerquilha (#) sinal significa escopo protegido
Como criar uma classe em PHP
A palavra-chave class é usada para definir uma classe em PHP. Abaixo estão as regras para criação de uma classe em PHP.
- O nome da classe deve começar com uma letra
- O nome da classe não pode ser uma palavra reservada do PHP
- O nome da classe não pode conter espaços
Digamos que queremos criar uma classe para representar animais.
Começaremos identificando as características comuns a todos os animais.
- Todos os animais pertencem a uma família como herbívoro, carnaval, etc.
- Todos os animais comem comida
O diagrama abaixo mostra o diagrama do animal
Vamos agora codificar nossa classe animal
<?php class Animal { private $family; private $food; public function __construct($family, $food) { $this->family = $family; $this->food = $food; } public function get_family() { return $this->family; } public function set_family($family) { $this->family = $family; } public function get_food() { return $this->food; } public function set_food($food) { $this->food = $food; } } ?>
AQUI,
- “private $family, $food” significa que as variáveis não podem ser acessadas diretamente fora da classe (Encapsulamento).
- “função pública __construct($family…)” é o método construtor php. Esta função é chamada sempre que uma instância da classe é criada. Neste caso, estamos definindo a família e a alimentação.
- “função pública get…()” é o método utilizado para acessar o valor familiar ou alimentar (Encapsulamento)
- “public function set…()” é o método usado para definir o valor familiar ou alimentar (Encapsulamento)
Como implementar herança em PHP
Trabalharemos com uma vaca e um leão. Tanto a vaca quanto o leão herdam da classe Animal.
O diagrama de classes abaixo mostra os relacionamentos.
Observe que a vaca herda da classe animal e também define suas próprias variáveis e métodos.
Vamos agora codificar a classe Cow
<?php class Cow extends Animal { private $owner; public function __construct($family, $food) { parent::__construct($family, $food); } public function set_owner($owner) { $this->owner = $owner; } public function get_owner() { return $this->owner; } } ?>
Vamos agora codificar a classe Lion
<?php class Lion extends Animal { public function __construct($family, $food) { parent::__construct($family, $food); } } ?>
AQUI,
- “class… extends Animal” faz com que a vaca e o leão usem métodos da classe Animal (Herança).
Como criar objeto da classe
As classes Animal, Cow e Lion devem estar todas no mesmo diretório para simplificar.
Vamos agora criar a aplicação que utiliza nossas classes.
Exemplo de classe PHP
<?php require 'Animal.php'; require 'Cow.php'; require 'Lion.php'; $cow = new Cow('Herbivore', 'Grass'); $lion = new Lion('Canirval', 'Meat'); echo '<b>Cow Object</b> <br>'; echo 'The Cow belongs to the ' . $cow->get_family() . ' family and eats ' . $cow->get_food() . '<br><br>'; echo '<b>Lion Object</b> <br>'; echo 'The Lion belongs to the ' . $lion->get_family() . ' family and eats ' . $lion->get_food(); ?>
Testando nosso aplicativo
Vamos agora visualizar nosso aplicativo em um navegador da web
Fantástico, certo! Vejamos agora o terceiro princípio da POO, o polimorfismo.
Digamos que queremos desenvolver uma aplicação que se conecte a diferentes mecanismos de banco de dados, como MySQL e SQL Servidor, mas use a mesma interface uniforme.
Podemos criar uma interface que defina os métodos padrão e uma classe abstrata que implemente os métodos comuns.
- Interface – é semelhante a uma aula. Ele apenas define os métodos e parâmetros.
- Aula abstrata – é uma classe que não pode ser usada para criar um objeto diretamente. Seu objetivo é fornecer implementações parciais ou completas de métodos comuns.
O diagrama de classes abaixo ilustra o relacionamento entre nossa classe abstrata, interface e classes de implementação.
Vamos agora criar nossa classe abstrata
<?php abstract class DBCommonMethods { private $host; private $db; private $uid; private $password; public function __construct($host, $db, $uid, $password) { $this->host = $host; $this->db = $db; $this->uid = $uid; $this->password = $password; } } ?>
AQUI,
- “classe abstrata” significa que a classe não pode ser usada diretamente para criar objeto php
- “$host,$db…” são variáveis de classe comuns a todas as implementações
- “function __construct(…)” é o método construtor da classe php que define os valores das variáveis comuns na inicialização
Vamos agora criar a interface que contém os métodos padrão que serão implementados de forma diferente dependendo do mecanismo de banco de dados.
<?php interface DBInterface { public function db_connect(); public function insert($data); public function read($where); public function update($where); public function delete($where); } ?>
AQUI,
- “interface” é a palavra-chave para criar interfaces
- “função pública…(…)” são os métodos padrão que devem ser implementados
Vamos agora criar as classes concretas que estenderão a classe DBCommonMethods e estenderão a interface DBInterface. MySQLMotorista.php
<?php class MySQLDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { //connect code goes here } public function delete($where) { //delete code goes here } public function insert($data) { //insert code goes here } public function read($where) { //read code goes here } public function update($where) { //update code goes here } } ?>
MSSQLServerDriver.php
<?php class MSSQLServerDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { //connect code goes here } public function delete($where) { //delete code goes here } public function insert($data) { //insert code goes here } public function read($where) { //read code goes here } public function update($where) { //update code goes here } } ?>
AQUI,
- “class… estende DBCommonMethods” use os métodos no DBCommonMethods
- “…implementa DBInterface” garante que a classe forneça métodos padrão, independentemente do driver de banco de dados usado.
Uso do código acima O código usando a classe acima ficaria assim
<?php $db = new MySQLDriver($host,$db,$uid,$password); ?>
Or
<?php $db = new MSSQLServerDriver ($host,$db,$uid,$password); ?>
O resto do código seria o mesmo para ambos os drivers, como;
<?php $db->db_connect(); $db->insert($data); ?>
Resumo
- Programação Orientada a Objetos OOP é uma técnica poderosa que modela aplicativos a partir de objetos do mundo real
- Uma classe é uma representação de objetos do mundo real com propriedades e métodos
- Os três princípios básicos da OOP são;
- Encapsulamento
- Herança
- Polimorfismo