MUDAMOS DE ENDEREÇO.
ACESSE:
WWW.CAFEESOFTWARE.COM
![]() |
| Imagem meramente ilustrativa |
/* Vamos crair a classe Pessoa
* com somente uma propriedade
* chamada Idade.
*/
class Pessoa{
private $Idade;
/* Quando tentarmos
* atribuir um valor
* para a propriedade idade
* o método __set() entre em ação
*/
public function __set( $propriedade, $valor ){
if( $propriedade == "Idade" ){
if( is_integer($valor) && strlen($valor) > 1 ){
$this->Idade = $valor;
echo "Valor: " . $valor . " Atribuído à propriedade: " . $propriedade;
}else{
echo "Valor: " . $valor . "NÃO atribuído à propriedade: " . $propriedade;
}
}
}
}
$leandro = new Pessoa();
$leandro->Idade = 27;
class Carro{
public $Nome;
private $Valor;
const MargemLucro = 8;
public function __construct($Nome, $Valor){
$this->Nome = $Nome;
$this->Valor = $Valor;
}
/* Quando o usuario requisitar
* uma propriedade, o __get()
* irá interceptar, verificar se a
* propriedade é a "Valor" e realizar
* o ajuste da margem de lucro
*/
function __get($Propriedade){
if( $Propriedade == "Valor" ){
$valor_reajustado = $this->Valor * ( 1 + self::MargemLucro / 100 );
return "R$ " . number_format($valor_reajustado, 3, ',', '.');
}
}
}
$vectra = new Carro("Vectra 2.0", 40.000);
echo $vectra->Valor;
class Carro{
public $Nome;
private $Valor;
const MargemLucro = 8;
public function __construct($Nome, $Valor){
$this->Nome = $Nome;
$this->Valor = $Valor;
}
//Este é o método que fará a intercepção
function __call($Metodo, $Parametros){
echo "Método executado: " . $Metodo;
echo "Parâmetros do método:< br />";
// Um array para mostrar os parametros passados
foreach ( $Parametros as $Chave => $Parametro ){
echo "Parâmetro {$Chave} = " . $Parametro;
}
}
}
$vectra = new Carro("Vectra s.0", 40.000);
// Opa!! Que método é esse?? Ah, deixa que o __call cuida
echo $vectra->DefineCaracteristicas("Preto",2.0,"4 portas");
![]() |
| Associação entre Produto e Fornecedor |
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;
}
}
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 />";
echo "Fornecedor: " . $produto->Fornecedor->RazaoSocial . "< br />";
![]() |
| Relação de 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;
}
}
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, ',', '.');
}
}
$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();Ao executar, você perceberá que a lista de itens (nome) será exibida, seguido do valor total.
![]() |
| Relação de 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 />";
}
}
Agora vamos criar a classe Cliente: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();
}
}
$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;
![]() |
| imagem meramente ilustrativa |
/* 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 = 3.8;
function __construct($Nome){
echo $Nome. "< br/>";
echo self::Versao . "< br />";
echo parent::Pi . "< br />";
echo Funcoes::Pi . "< br />";
}
}
$sistema1 = new Aplicacao("CafeeSoftware");
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();
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();
class Fornecedor{
private $Id; //identificação
public $Nome; //nome do produto
private $Compra; //valor de compra
public $Valor; //valor de venda
}
![]() |
| Eclipse exibindo apenas as propriedades públicas da classe Fornecedor |
$empresa1 = new Fornecedor(); $empresa1->Compra = 400;Será retornado uma mensagem de erro, pois a propriedade Compra é privada (private).
class Fornecedor{
private $Id; //identificação
public $Nome; //nome do produto
private $Compra; //valor de compra
public $Valor; //valor de venda
/* Olha o método setCompra()
* que vai definir um valor para
* a propriedade $Compra
*/
public function setCompra($Compra){
if (is_numeric($Compra) && $compra > 0)
{
$this->Compra = $Compra;
}
}
/* Vamos agora criar o método
* getCompra que vai retornar
* o conteúdo da propriedade $compra
*/
public function getCompra(){
return $this->Compra;
}
}
$empresa1 = new Fornecedor(); $empresa1->Nome = "Vale"; $empresa1->setCompra(400); echo "O valor do produto ".$empresa1->Nome." é de ".$empresa1->getCompra();
class Funcionario{
private $Id;
private $Nome;
private $Nascimento;
private $Salario;
function setSalario($Salario){
if (is_numeric($Salario) && $Salario > 0)
{
$this->Salario = $Salario;
}
}
function getSalario(){
return $this->Salario;
}
}
class Estagiario extends Funcionario {
/* Método getSalario será
* sobrescrito pois o estagiário
* neste modelo possui um bônus
* de 10%
*/
function getSalario(){
return $this->Salario * 1.10;
}
}
Depois das duas classes criadas, vamos criar o objeto estagiário:
$junior = new Estagiario; $junior->setSalario(300); echo "O salario é: ".$junior->getSalario;
class Funcionario{
private $Id;
private $Nome;
private $Nascimento;
protected $Salario;
function setSalario($Salario){
if (is_numeric($Salario) && $Salario > 0)
{
$this->Salario = $Salario;
}
}
function getSalario(){
return $this->Salario;
}
}
$junior = new Estagiario; $junior->setSalario(300); echo "O salario é: ".$junior->getSalario;
/*Definimos uma classe como abstrata
* utilizando a palavra reservada abstract
* antes da palavra class
*/
abstract class Animal
{
public $nome;
public $idade;
//O método construtor seta os dois atributos
function __construct($nome, $idade)
{
$this->nome = $nome;
$this->idade = $idade;
}
//O método descrição retorna o nome e a idade
public function Descricao()
{
return $this->nome . ", " . $this->idade . " anos de idade";
}
/*O método Falar deve
*ser implementado na classe filha
*perceba que ele não tem implementação
*/
abstract public function Falar();
}
Temos nessa classe todas as características comuns de um animal. Todo animal possui um nome e todo animal possui uma idade, todo animal fala (o cachorro faz Au Au, o gato faz Miau). Perceba que o método Falar não possui nada implementado, além disso, a definição do método é precedida pela palavra abstract, o que significa que o método deve ser implementado em TODAS as classes que estenderem a classe Animal.// Herdamos a classe Animal
class Cachorro extends Animal
{
/* Somos obrigados a implementar
* o método falar
*/
public function Falar()
{
return "Au Au!";
}
/* Vamos também complementar
* o método Descricao
*/
public function Descricao()
{
return parent::Descricao() . ", eu sou um cachorro!";
}
}
$animal = new Cachorro("Rex", 5);
echo $animal->Descricao();
echo $animal->Falar();
final class Cachorro
{
public $nome;
public $idade;
function __construct($nome, $idade)
{
$this->nome = $nome;
$this->idade = $idade;
}
public function Descricao()
{
return $this->nome . ", " . $this->idade . " anos de idade";
}
}
Class Cachorro
{
public $nome;
public $idade;
/* Este método não pode
* se estendido (sobrescrito)
*/
final function Descricao()
{
return $this->nome . ", " . $this->idade . " anos de idade";
}
}
class Cheque{
public $Valor;
/* Método Construtor
* Recebe o parâmetro $Valor.
*/
function __construct($Valor){
$this->Valor = $Valor;
}
/* Método CalcularJuros()
* Calcula os Juros, neste caso 20%
*/
function CalcularJuros(){
return $this->Valor * 1.20;
}
/* Método TipoCheque()
* Retorna o tipo do Cheque
*/
function TipoCheque(){
return "Comum";
}
}
Estrutura básica, caso você tenha dúvidas com relação ao código, consulte as aulas anteriores. /* Perceba a herança acontecendo
* definida pela palavra extends
*/
class ChequeEspecial extends Cheque{
/* Método CalcularJuros() - Opa!! Mas esse método já não tinha sido
* implementado na classe anterior? Sim, está aí o polimorfismo.
* O juros do Cheque especial é 10%, não 20 como o anterior
*/
function CalcularJuros(){
//Perceba que herdamos a propriedade Valor da classe pai
return $this->Valor * 1.10;
}
/* Método TipoCheque() - Também Sobrescrito
* uso explicito do polimorfismo
*/
function TipoCheque(){
return "Especial";
}
}
//Incluimos as duas classes
require_once("Cheque.class.php");
require_once("ChequeEspecial.class.php");
// Criação dos cheques
$Cheques[1] = new Cheque(380.00);
$Cheques[2] = new ChequeEspecial(600.00);
$Cheques[3] = new Cheque(230.00);
// Percorrendo os Cheques
foreach ( $Cheques as $key => $Cheque )
{
echo "Cheque $key ( {$Cheque->TipoCheque()} )
com juros: R$ {$Cheque->CalcularJuros()} <br /> ";
}
class Pessoa{
public $Nome;
public $AnoDeNascimento;
public $Endereco;
public $Telefone;
/* Método Construtor
* Inicializa as propriedades
*/
function __construct($Nome, $AnoDeNascimento, $Endereco, $Telefone){
$this->Nome = $Nome;
$this->AnoDeNascimento = $AnoDeNascimento;
$this->Endereco = $Endereco;
$this->Telefone = $Telefone;
}
/* Método EscreveDados()
* Retorna os dados da Pessoa
*/
function EscreveDados(){
echo "Nome: {$this->Nome}
Ano de nascimento: {$this->AnoDeNascimento}
Endereço: {$this->Endereco}
Telefone: {$this->Telefone}";
}
/* Método ObterIdade()
* Retorna a idade
*/
function ObterIdade(){
$ano_atual = date("Y",time());
return $ano_atual - $this->AnoDeNascimento;
}
}
require_once("Pessoa.class.php");
class Funcionario extends Pessoa{
public $Salario;
public $Cargo;
public $DiaPagamento;
/* Método Construtor
* Inicializa as propriedades
*/
function __construct($Nome, $AnoDeNascimento, $Endereco, $Telefone, $Salario, $Cargo, $DiaPagamento){
// Chamada do método do construtor da classe-pai
parent::__construct($Nome, $AnoDeNascimento, $Endereco, $Telefone);
// Inicializa as variáveis/propriedades locais da Classe
$this->Salario = $Salario;
$this->Cargo = $Cargo;
$this->DiaPagamento = $DiaPagamento;
}
/* Método EscreverSalario
* Escreve o salário do funcionário
*/
function EscreverSalario(){
echo "Salário: {$this->$Salario}
";
}
/* Método EscreveDados()
* Este método sobrescreve o método EscreveDados() da classe-pai
*/
function EscreveDados(){
parent::EscreveDados();
echo "Salário: {$this->Salario}
Cargo: {$this->Cargo}
Dia de pagamento: {$this->DiaPagamento} ";
}
}
require_once("Funcionario.class.php");
$leandro = new Funcionario("Leandro Castro", 1985, "Rua das Flores 33 - Juiz de fora","(32) 3232-3535", 4.000, "Desenvolvedor Java/PHP", 8);
echo $leandro->ObterIdade();
$leandro->EscreveDados();
require_once("Pessoa.class.php");
class Funcionario extends Pessoa{
public $Salario; public $Cargo; public $DiaPagamento;
function __construct($Nome, $AnoDeNascimento, $Endereco, $Telefone, $Salario, $Cargo, $DiaPagamento){
// Chamada do método do construtor da classe-pai
parent::__construct($Nome, $AnoDeNascimento, $Endereco, $Telefone);
function EscreverSalario(){
echo "Salário: {$this->$Salario}
";
}
Se você esta estudando com atenção, percebeu que este método foi uma nova implementação, ele não exsite na classe pai, pois além de herdar, você pode criar novos métodos e propriedades.function EscreveDados(){
parent::EscreveDados();
echo "Salário: {$this->Salario}
Cargo: {$this->Cargo}
Dia de pagamento: {$this->DiaPagamento} ";
}
Class Pessoa{
public $nome;
public $altura;
public $nascimento;
public $salario;
}
$p1 = new Pessoa();
$p1->nome = "José da Silva"; $p1->altura = 1.82; $p1->nascimento = "1989-01-22" $p1->salario = 3600;
echo " Meu nome é: ".$p1->nome.", minha altura é ".$p1->altura.", nasci no dia ".$p1->nascimento." e hoje meu salário é de ".$p1->salario.".";
Class Pessoa{
public $nome;
public $altura;
public $nascimento;
public $salario;
public function MostrarPessoa(){
echo "Nome: ".$this->nome;
echo "Altura: ".$this->altura;
echo "Nascimento: ".$this->nascimento;
echo "Salario: ".$this->salario;
}
}
$p1 = new Pessoa(); $p1->nome = "José da Silva"; $p1->altura = 1.82; $p1->nascimento = "1989-01-22"; $p1->salario = 3600; //executando o método $p1->MostrarPessoa();
class Conta{
public $Cliente;
public $Agencia;
public $Conta;
public $Saldo;
public $Status;
/* Método Sacar()
* Diminui o saldo em quantia
*/
function Sacar($quantia){
if( $quantia > 0 ){
$this->Saldo -= $quantia;
}
}
/* Método Depositar()
* Deposita uma quantia, acrescendo o saldo
*/
function Depositar($quantia){
if ( $quantia > 0 ){
$this->Saldo += $quantia;
}
}
/* Método ObterSaldo()
* Retorna o saldo da conta
*/
function ObterSaldo(){
return $this->Saldo;
}
}
//criando o objeto conta $conta1 = new Conta(); //setando seus atributos $conta1->Cliente = "Jose da Silva"; $conta1->Agencia = 0196; $conta1->Conta = "07126934-24"; $conta1->Saldo = 5000; //executando os métodos $conta1->Depositar(500); $conta1->sacar(100); echo $conta1->ObterSaldo();
class Conta{
public $Cliente;
public $Agencia;
public $Conta;
public $Saldo;
public $Status;
/* Método Construtor
* Inicializa as propriedades
*/
function __construct($Titular,$Agencia,$Conta,$Saldo,$Status){
$this->Cliente = $Titular;
$this->Agencia = $Agencia;
$this->Conta = $Conta;
$this->Saldo = $Saldo;
$this->Cancelada = $Status;
}
/* Método Destrutor
* Finaliza os objetos
*/
function __destruct(){
echo "O Objeto foi destruído.
";
}
/* Método Sacar()
* Diminui o saldo em quantia
*/
function Sacar($quantia){
if( $quantia > 0 ){
$this->Saldo -= $quantia;
}
}
/* Método Despositar()
* Deposita uma quantia, acrescendo o saldo
*/
function Depositar($quantia){
if( $quantia > 0 ){
$this->Saldo += $quantia;
}
}
/* Método ObterSaldo()
* Retorna o saldo da conta
*/
function ObterSaldo(){
return $this->Saldo;
}
}
$conta1 = new conta("Jose da silva", "0144", "07126934-24", 5000, "ativa");
echo $conta1->ObterSaldo();
![]() |
| Construtor recebendo os parâmetros |
"A orientação a objetos é um paradigma que representa toda uma filosofia para construção de sistemas. Em vez de construir um sistema formado por um conjunto de procedimentos e variáveis nem sempre agrupadas de acordo com o contexto, como se fazia em linguagens estruturadas (Cobol, Clipper, Pascal), na orientação a objetos utilizamos uma ótica um pouco 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."
Class Carro{
public $ano;
public $modelo;
public $cor;
public $fabricante;
}
//incluindo a classe que criamos anteriormente
include("Carro.class.php")
//Instanciando (opa, palavrinha nova) um novo objeto
$carro = new Carro();
//Atribuindo valores aos atributos que criamos
$carro->ano = 2012;
$carro->modelo = "C4 VTR";
$carro->cor = "Preto";
$carro->fabricante = "Citroen";