SlideShare una empresa de Scribd logo
1 de 39
Programação para WEB
Regis Pires Magalhães
regispiresmag@gmail.com
Programação
Orientada a Objetos
em PHP
Classes e Objetos
<?php
class Pessoa {
private $nome;
function __construct($nome) {
$this->nome = $nome;
}
function getNome() {
return $this->nome;
}
function setNome($nome) {
$this->nome = $nome;
}
}
$p = new Pessoa('João');
$q = $p;
$p->setNome("Maria");
echo "{$p->getNome()}<br/>";
echo "{$q->getNome()}<br/>";
?>
Construtores
 No PHP 4, o construtor tinha o mesmo nome da
classe.
 No PHP 5, se não for encontrado o __construct(),
ele procurará o construtor com o mesmo nome da
classe.
Herança
<?php
require_once('pessoa.php');
class PessoaFisica extends Pessoa {
private $cpf;
function __construct($nome,$cpf) {
parent::__construct($nome);
$this->cpf = $cpf;
}
function getCpf() {
return $this->cpf;
}
function setCpf($cpf) {
$this->cpf = $cpf;
}
}
$pf = new PessoaFisica('Maria','123.456.789-00');
echo "Nome: {$pf->getNome()}<br/>";
echo "CPF: {$pf->getCpf()}<br/>";
?>
Sobrescrita de Métodos
<?php
class MinhaClasse {
protected function minhaFuncao() {
echo "MinhaClasse::minhaFuncao()n";
}
}
class OutraClasse extends MinhaClasse {
public function minhaFuncao() {
parent::minhaFuncao();
echo "OutraClasse::minhaFuncao()n";
}
}
$classe = new OutraClasse();
$classe->minhaFuncao();
?>
Sobrecarga de Construtores
 Em PHP cada classe somente pode ter um único
construtor.
 Assim, não há sobrecarga de construtores:
<?php
class Pessoa {
private $nome;
function __construct() {
}
function __construct($nome) {
$this->nome = $nome;
}
}
?>
Fatal error: Cannot redeclare Pessoa::__construct()
autoload
 Pode-se definir uma função __autoload que é
automaticamente chamada caso seja usada uma
classe que ainda não foi definida.
 Isso pode evitar a necessidade de escrever múltiplos
includes ou requires.
<?php
function __autoload($class_name) {
require_once $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
autoload
<?php
class MinhaClasse {
function helloWorld() {
echo "Hello, Worldn";
}
}
?>
<?php
function __autoload($class_name) {
require_once($_SERVER["DOCUMENT_ROOT"] .
"/classes/$class_name.php");
}
?>
<?php
require_once "autoload.php";
$obj = new MinhaClasse();
$obj->helloWorld();
?> index.php
autoload.php
MinhaClasse.php
Classes e Objetos
<?php
class A {
private $nome;
function __construct($nome) {
$this->nome = $nome;
}
function oi() {
if (isset($this)) {
echo 'Oi, '.$this->nome.'. Este objeto é instância da classe ';
echo get_class($this).'<br/>';
} else {
echo 'Oi, não sei o seu nome, pois o método está sendo ';
echo 'executado estaticamente.<br/>';
}
}
}
class B {
function ola() {
A::oi();
}
}
$a = new A("Maria");
$a->oi();
A::oi();
$b = new B();
$b->ola();
B::ola();
?>
Construtores e Destrutores
 Construtores pais não são chamados implicitamente pelo
construtor da classe filha.
 Para executar o construtor da classe pai, é necessária
uma chamada a parent::__construct() no
construtor da classe filha.
 O método destrutor ou finalizador será chamado assim
que todas as referências a um objeto particular forem
removidas ou quando o objeto for explicitamente
destruído através da função unset() ou ainda quando o
programa é finalizado.
 Destrutores pais não serão chamados implicitamente.
Para executar o destrutor pai, deve-se fazer uma
chamada explicitamente a parent::__destruct() no
corpo do destrutor.
Construtores e Destrutores
<?php
class MinhaClasseDestruivel {
function __construct() {
print "No construtor<br/>";
$this->name = "MinhaClasseDestruivel";
}
function __destruct() {
print "Destruindo $this->name";
}
}
$obj = new MinhaClasseDestruivel();
?>
Visibilidade dos membros
<?php
class MinhaClasse {
public $publica = 'Public';
protected $protegida = 'Protected';
private $privada = 'Private';
function imprimeAlo() {
echo $this->publica;
echo $this->protegida;
echo $this->privada;
}
}
$obj = new MinhaClasse();
$obj->imprimeAlo();
echo $obj->publica; // Funciona
echo $obj->protegida; // Erro Fatal
echo $obj->privada; // Erro Fatal
?>
Visibilidade dos membros
<?php
class MinhaClasse {
public function __construct() { }
public function meuPublico() { }
protected function meuProtegido() { }
private function meuPrivado() { }
// Se nada for dito, é public
function foo() {
$this->meuPublico();
$this->meuProtegido();
$this->meuPrivado();
}
}
$minhaclasse = new MinhaClasse;
$minhaclasse->foo();
$minhaclasse->meuPublico(); // Funciona
$minhaclasse->meuProtegido(); // Erro Fatal
$minhaclasse->meuPrivado(); // Erro Fatal
?>
:: Operador de Resolução de Escopo
 Permite acesso a membros estáticos, constantes ou
sobrescritos de uma classe.
<?php
class MinhaClasse {
const VALOR_CONST = 'Um valor constante';
}
$classname = 'MinhaClasse';
echo $classname::VALOR_CONST;
echo MinhaClasse::VALOR_CONST;
?>
:: Operador de Resolução de Escopo
<?php
class OutraClasse extends MinhaClasse {
public static $meu_estatico = 'variável estática';
public static function doisPontosDuplo() {
echo parent::VALOR_CONST . "n";
echo self::$meu_estatico . "n";
}
}
$classname = 'OutraClasse';
echo $classname::doisPontosDuplo();
OutraClasse::doisPontosDuplo();
?>
 As palavras reservadas self e parent são
usadas para acessar membros de dentro da
definição da classe.
Inicializações inválidas
<?php
class SimpleClass {
// declarações de membro inválidas
public $var1 = 'olá '.'mundo';
public $var2 = <<<FIM
olá mundo
FIM;
public $var3 = 1+2;
public $var4 = self::myStaticMethod();
public $var5 = $myVar;
}
?>
 Variáveis , membros de classe ou chamada de
função não podem ser usados na inicialização
direta de atributos.
Inicializações válidas
<?php
class SimpleClass {
// declarações de membro válidas
public $var6 = myConstant;
public $var7 = self::classConstant;
public $var8 = array(true, false);
}
?>
Membros de Classe
<?php
error_reporting(E_STRICT);
class Foo {
public static function umMetodoEstatico() {
echo 'oi<br/>';
}
public function umMetodoNaoEstatico() {
echo 'olá<br/>';
}
}
Foo::umMetodoEstatico();
Foo::umMetodoNaoEstatico();
?>
 Chamar métodos não estáticos de maneira
estática gera um aviso de nível E_STRICT.
Constantes
 Constantes diferem de variáveis normais no não uso
do símbolo $ para declará-las ou usá-las.
<?php
class MinhaClasse {
const constante = 'valor constante';
function mostrarConstante() {
echo self::constante . "<br/>";
}
}
echo MinhaClasse::constante . "<br/>";
$classe = new MinhaClasse();
$classe->mostrarConstante();
?>
Classes Abstratas
<?php
abstract class ClasseAbstrata {
abstract protected function pegarValor();
abstract protected function valorComPrefixo( $prefixo );
public function imprimir() {
print $this->pegarValor() . '<br/>';
}
}
class ClasseConcreta1 extends ClasseAbstrata {
protected function pegarValor() {
return "ClasseConcreta1";
}
public function valorComPrefixo( $prefixo ) {
return "{$prefixo}ClasseConcreta1";
}
}
$classe1 = new ClasseConcreta1;
$classe1->imprimir();
echo $classe1->valorComPrefixo('FOO_') . '<br/>';
?>
Interfaces
<?php
interface Animal {
public function emiteSom();
}
class Gato implements Animal {
public function emiteSom() {
echo 'Miaaauhh';
}
}
class Cachorro implements Animal {
public function emiteSom() {
echo 'Au, Au';
}
}
$a = new Gato();
$b = new Cachorro();
echo "{$a->emiteSom()}<br/>";
echo "{$b->emiteSom()}<br/>";
?>
final
 Métodos final NÃO podem ser sobrescritos em classes
que o herdem.
 Classes final não podem ser herdadas por outras classes.
 O exemplo abaixo não funciona:
<?php
class ClasseBase {
protected $id = 0;
final function getId() {
return $this->id++;
}
}
class ClasseConcreta extends ClasseBase {
function getId() {
return $this->id += 2;
}
}
?>
final
 O exemplo abaixo também não funciona:
<?php
final class ClasseBase {
// ...
}
class ClasseConcreta extends ClasseBase {
// ...
}
?>
O método __toString()
 Retorna a representação de um objeto em
forma de string.
<?php
class Pessoa {
private $nome;
function __construct($nome) {
$this->nome = $nome;
}
function __toString() {
return $this->nome;
}
}
$obj = new Pessoa("Maria");
echo $obj;
?>
Clonagem de Objetos
 Uma cópia de objeto é criada usando o
comando 'clone'. Isso chama o método
__clone() do objeto.
 O método __clone() de um objeto não
pode ser executado diretamente.
Clonagem de Objetos
<?php
class Fone {
public $numero, $tipo;
public function __construct($numero,$tipo) {
$this->numero = $numero;
$this->tipo = $tipo;
}
}
class Pessoa {
public $nome, $fone;
public function __construct($nome,$num_fone,$tipo_fone) {
$this->nome = $nome;
$this->fone = new Fone($num_fone,$tipo_fone);
}
public function __clone() {
$this->fone = new Fone($this->fone->numero, $this->fone->tipo);
}
}
$p1 = new Pessoa('Maria','8633231845','RES');
$p2 = clone $p1;
echo('<p>Objeto Original:</p>'); print_r($p1);
echo('<p>Objeto Clonado:</p>'); print_r($p2);
$p2->nome = 'João';
$p2->fone->numero = '8699811234';
$p2->fone->tipo = 'CEL';
echo('<p>Objeto Original:</p>'); print_r($p1);
echo('<p>Objeto Clonado:</p>'); print_r($p2);
?>
Interceptação
 Chamada de métodos e acesso a membros podem
ser interceptados pelos métodos __set, __get e
__call.
 __set – intercepta a atribuição de valores a
propriedades do objeto (declaradas ou não).
 __get – intercepta requisições de propriedades do
objeto (declaradas ou não).
 __call – Intercepta chamadas a métodos. Executado
automaticamente quando um método inexistente for
chamado.
Interceptação
<?php
class Pessoa {
private $atributos;
function __set($nome,$valor) {
$this->atributos[$nome] = $valor;
}
function __get($nome) {
return $this->atributos[$nome];
}
function __call($nome,$params) {
echo "Método chamado: $nome<br/>";
echo 'Parâmetros: '; print_r($params);
}
}
$p1 = new Pessoa();
$p1->nome = 'Maria';
$p1->fone = '8633231234';
echo 'Nome: ' . $p1->nome . '<br/>';
echo 'Fone: ' . $p1->fone . '<br/>';
print_r($p1); echo '<br/>';
$p1->meuMetodo('PHP',123,'WEB');
?>
Instanciação Dinâmica
<?php
class MinhaClasse {
function exibe($a,$b) {
echo "Parâmetros: $a $b<br/>";
}
}
$classe = 'MinhaClasse';
$metodo = 'exibe';
$obj = new $classe;
call_user_func(array($obj, $metodo),'PHP','WEB');
?>
Tratamento de Erros
 A forma de manipulação de erro mais simples
é abortar a execução da aplicação através da
função die().
 Controlar erros assim é geralmente ruim, pois
abortar a execução do programa
normalmente não é o comportamento
desejado.
Geração e Tratamento de Erros
 A função trigger_error() gera um erro de um tipo
determinado.
 Tipos de erro:
 E_USER_ERROR Gera um erro fatal.
 E_USER_WARNING Gera uma advertência.
 E_USER_NOTICE Gera uma notificação.
 A função set_error_handler() define uma função
para tratamento de erros.
Geração e Tratamento de Erros
<?php
function trata_erros($tipo_erro,$msg,$arq,$linha) {
echo $msg . '<br/>';
if ($tipo_erro == E_USER_ERROR) {
die;
}
}
set_error_handler('trata_erros');
trigger_error('Ocorreu um erro!!!',E_USER_WARNING);
echo 'Código executado ou não';
?>
Exceções
 Uma exceção pode ser disparada (throw), ou capturada
(catch).
 Código rodeado de um bloco try/catch, permite a captura de
exceções em potencial.
 Vários blocos catch podem ser usados para pegar diferentes
classes de exceções.
 A execução normal continuará após o último bloco catch
definido na seqüência.
 Quando uma exceção é lançada, o fluxo normal de execução é
interrompido e o PHP tentará achar o primeiro bloco catch
correspondente à exceção disparada.
 Se uma exceção não for capturada, um Erro Fatal será
lançado com uma mensagem "Uncaught Exception ...", a não
ser que um tratador tenha sido definido com
set_exception_handler().
Exceções
 Uma exceção é um objeto da classe Exception que
contém os seguintes métodos:
 getMessage() - Retorna a mensagem de erro.
 getCode() - Retorna o código de erro.
 getFile() - Retorna o arquivo no qual ocorreu o erro.
 getLine() - Retorna a linha na qual ocorreu o erro.
 getTrace() - Retorna um array com as ações até o erro.
 getTraceAsString() - Retorna as ações em forma de
string.
Exceções
<?php
function inverso($x) {
if ($x == 0) {
throw new Exception('Divisão por zero.');
}
else return 1/$x;
}
try {
echo inverso(5) . '<br/>';
echo inverso(0) . '<br/>';
} catch (Exception $e) {
echo $e->getMessage(), '<br/>';
}
echo 'Fim.';
?>
Tratador de Exceções
 A função set_exception_handler() define uma função
de tratamento de exceção padrão se uma exceção não
for capturada em um bloco try/catch.
 A execução não parará depois que a função de
tratamento for chamada.
<?php
function trata_excecoes($ex) {
echo $ex->getMessage(),'<br/>';
}
set_exception_handler('trata_excecoes');
throw new Exception('Exceção ocorreu!!!');
echo 'Código não executado';
?>
Comparação de Objetos
 Operador de comparação (==)
 Objetos são iguais se possuírem o mesmo
conteúdo e forem instâncias da mesma classe.
 Operador de identidade (===)
 Objetos são idênticos se referenciam a mesma
instância de uma mesma classe.
Comparação de Objetos
<?php
class Pessoa {
private $nome;
function __construct($nome) {
$this->nome = $nome;
}
}
$p1 = new Pessoa('Maria');
$p2 = $p1;
$p3 = new Pessoa('Maria');
echo '$p1 == $p2 - ' . ($p1 == $p2) . '<br/>';
echo '$p1 == $p3 - ' . ($p1 == $p3) . '<br/>';
echo '$p1 === $p2 - ' . ($p1 === $p2) . '<br/>';
echo '$p1 === $p3 - ' . ($p1 === $p3) . '<br/>';
?>
Comparação de Tipo
<?php
class Pessoa { }
class PessoaFisica extends Pessoa { }
$p1 = new PessoaFisica();
var_dump($p1 instanceof Pessoa);
var_dump($p1 instanceof PessoaFisica);
var_dump($p1 instanceof PessoaJuridica);
?>
 instanceof é usado para determinar se um
objeto é de uma determinada classe:

Más contenido relacionado

La actualidad más candente

Injeção de Dependências com PHP
Injeção de Dependências com PHPInjeção de Dependências com PHP
Injeção de Dependências com PHPDanilo Godoy
 
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesOtávio Calaça Xavier
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.pptEmerson Cardoso
 
PHP robusto com Zend Framework
PHP robusto com Zend FrameworkPHP robusto com Zend Framework
PHP robusto com Zend FrameworkJaime Neto
 
Aula 3 - Java Prof.ª Cristiane Fidelix
Aula 3 -  Java Prof.ª Cristiane FidelixAula 3 -  Java Prof.ª Cristiane Fidelix
Aula 3 - Java Prof.ª Cristiane FidelixCris Fidelix
 
Javascript - Princípios da linguagem e utilização de frameworks
Javascript - Princípios da linguagem e utilização de frameworksJavascript - Princípios da linguagem e utilização de frameworks
Javascript - Princípios da linguagem e utilização de frameworksBruno Abrantes
 
Javascript para CSharpers - Append B - jQuery
Javascript para CSharpers - Append B - jQueryJavascript para CSharpers - Append B - jQuery
Javascript para CSharpers - Append B - jQueryWesley Lemos
 
Introducao a orientacao a objetos com PHP
Introducao a orientacao a objetos com PHPIntroducao a orientacao a objetos com PHP
Introducao a orientacao a objetos com PHPguilhermemar
 

La actualidad más candente (19)

Injeção de Dependências com PHP
Injeção de Dependências com PHPInjeção de Dependências com PHP
Injeção de Dependências com PHP
 
Poo
PooPoo
Poo
 
Meta-programacao em python
Meta-programacao em pythonMeta-programacao em python
Meta-programacao em python
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simples
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.ppt
 
Java 05 Oo Basica
Java 05 Oo BasicaJava 05 Oo Basica
Java 05 Oo Basica
 
PHP robusto com Zend Framework
PHP robusto com Zend FrameworkPHP robusto com Zend Framework
PHP robusto com Zend Framework
 
Curso de PHP - Objetos
Curso de PHP - ObjetosCurso de PHP - Objetos
Curso de PHP - Objetos
 
Java 06
Java 06Java 06
Java 06
 
Aula 3 - Java Prof.ª Cristiane Fidelix
Aula 3 -  Java Prof.ª Cristiane FidelixAula 3 -  Java Prof.ª Cristiane Fidelix
Aula 3 - Java Prof.ª Cristiane Fidelix
 
Javascript - Princípios da linguagem e utilização de frameworks
Javascript - Princípios da linguagem e utilização de frameworksJavascript - Princípios da linguagem e utilização de frameworks
Javascript - Princípios da linguagem e utilização de frameworks
 
Escrevendo plugins JQuery
Escrevendo plugins JQueryEscrevendo plugins JQuery
Escrevendo plugins JQuery
 
Javascript para CSharpers - Append B - jQuery
Javascript para CSharpers - Append B - jQueryJavascript para CSharpers - Append B - jQuery
Javascript para CSharpers - Append B - jQuery
 
Internacionalizacao
InternacionalizacaoInternacionalizacao
Internacionalizacao
 
Tutorial Java: Herança
Tutorial Java: HerançaTutorial Java: Herança
Tutorial Java: Herança
 
PHP MySQL Aula 03
PHP MySQL Aula 03PHP MySQL Aula 03
PHP MySQL Aula 03
 
Introducao a orientacao a objetos com PHP
Introducao a orientacao a objetos com PHPIntroducao a orientacao a objetos com PHP
Introducao a orientacao a objetos com PHP
 
Evento CODERS
Evento CODERSEvento CODERS
Evento CODERS
 

Destacado

Prog web 01-php-introducao
Prog web 01-php-introducaoProg web 01-php-introducao
Prog web 01-php-introducaoRegis Magalhães
 
Prog web 00-modelo-cliente_servidor_web
Prog web 00-modelo-cliente_servidor_webProg web 00-modelo-cliente_servidor_web
Prog web 00-modelo-cliente_servidor_webRegis Magalhães
 
Java 01 Java Visao Geral Detalhado
Java 01 Java Visao Geral DetalhadoJava 01 Java Visao Geral Detalhado
Java 01 Java Visao Geral DetalhadoRegis Magalhães
 
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosRegis Magalhães
 
Linked Data - Minicurso - SBBD 2011
Linked Data - Minicurso - SBBD 2011Linked Data - Minicurso - SBBD 2011
Linked Data - Minicurso - SBBD 2011Regis Magalhães
 
Linked Data Tutorial - Conferencia W3C Brasil 2011
Linked Data Tutorial - Conferencia W3C Brasil 2011Linked Data Tutorial - Conferencia W3C Brasil 2011
Linked Data Tutorial - Conferencia W3C Brasil 2011Regis Magalhães
 
Prog web 03-php-sessoes-cookies_cabecalhos
Prog web 03-php-sessoes-cookies_cabecalhosProg web 03-php-sessoes-cookies_cabecalhos
Prog web 03-php-sessoes-cookies_cabecalhosRegis Magalhães
 
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em JavaParadigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em JavaAdriano Teixeira de Souza
 
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)Adriano Teixeira de Souza
 
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks Adriano Teixeira de Souza
 

Destacado (20)

Pascal Tipos
Pascal TiposPascal Tipos
Pascal Tipos
 
Java 14 Javadoc
Java 14 JavadocJava 14 Javadoc
Java 14 Javadoc
 
Prog web 01-php-introducao
Prog web 01-php-introducaoProg web 01-php-introducao
Prog web 01-php-introducao
 
Prog web 00-modelo-cliente_servidor_web
Prog web 00-modelo-cliente_servidor_webProg web 00-modelo-cliente_servidor_web
Prog web 00-modelo-cliente_servidor_web
 
Easy Rails
Easy RailsEasy Rails
Easy Rails
 
Web Scale Data Management
Web Scale Data ManagementWeb Scale Data Management
Web Scale Data Management
 
Java 01 Java Visao Geral Detalhado
Java 01 Java Visao Geral DetalhadoJava 01 Java Visao Geral Detalhado
Java 01 Java Visao Geral Detalhado
 
Prog web 07-pdo
Prog web 07-pdoProg web 07-pdo
Prog web 07-pdo
 
Java 15 Jar
Java 15 JarJava 15 Jar
Java 15 Jar
 
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
 
Linked Data - Minicurso - SBBD 2011
Linked Data - Minicurso - SBBD 2011Linked Data - Minicurso - SBBD 2011
Linked Data - Minicurso - SBBD 2011
 
Linked Data Tutorial - Conferencia W3C Brasil 2011
Linked Data Tutorial - Conferencia W3C Brasil 2011Linked Data Tutorial - Conferencia W3C Brasil 2011
Linked Data Tutorial - Conferencia W3C Brasil 2011
 
Coding Dojo
Coding DojoCoding Dojo
Coding Dojo
 
Prog web 03-php-sessoes-cookies_cabecalhos
Prog web 03-php-sessoes-cookies_cabecalhosProg web 03-php-sessoes-cookies_cabecalhos
Prog web 03-php-sessoes-cookies_cabecalhos
 
Curso Ruby
Curso RubyCurso Ruby
Curso Ruby
 
Responsive web design
Responsive web designResponsive web design
Responsive web design
 
Prog web 08-php-mvc
Prog web 08-php-mvcProg web 08-php-mvc
Prog web 08-php-mvc
 
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em JavaParadigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
 
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
 
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
 

Similar a Prog web 06-php-oo

Programação web ii aulas 06 e 07
Programação web ii   aulas 06 e 07Programação web ii   aulas 06 e 07
Programação web ii aulas 06 e 07Yuri Bispo
 
Clean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHPClean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHPRafael Neris
 
PHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosPHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosGeorge Mendonça
 
As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)Pablo Dall'Oglio
 
Php5 e a orientação a objetos
Php5 e a orientação a objetosPhp5 e a orientação a objetos
Php5 e a orientação a objetosxbacon
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que pareceImpacta Eventos
 
Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3Douglas V. Pasqua
 
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...Manuel Menezes de Sequeira
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - FlisolLeonn Leite
 
Classes Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções JavaClasses Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções Javadanrleywillian1
 
Hooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressHooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressZé Fontainhas
 
Exercicios professor marcos monteiro (1)
Exercicios professor marcos monteiro (1)Exercicios professor marcos monteiro (1)
Exercicios professor marcos monteiro (1)jose-junior89
 
modernizando a arquitertura de sua aplicação
modernizando a arquitertura  de sua aplicaçãomodernizando a arquitertura  de sua aplicação
modernizando a arquitertura de sua aplicaçãoAntonio Spinelli
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5garux
 
Construtores_Sobrecarga.pptx
Construtores_Sobrecarga.pptxConstrutores_Sobrecarga.pptx
Construtores_Sobrecarga.pptxJoberthSilva
 

Similar a Prog web 06-php-oo (20)

Programação web ii aulas 06 e 07
Programação web ii   aulas 06 e 07Programação web ii   aulas 06 e 07
Programação web ii aulas 06 e 07
 
Clean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHPClean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHP
 
PHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosPHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e Objetos
 
As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)
 
Php5 e a orientação a objetos
Php5 e a orientação a objetosPhp5 e a orientação a objetos
Php5 e a orientação a objetos
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3
 
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
 
PHP ao Extremo
PHP ao ExtremoPHP ao Extremo
PHP ao Extremo
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - Flisol
 
Classes Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções JavaClasses Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções Java
 
Hooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressHooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPress
 
Exercicios professor marcos monteiro (1)
Exercicios professor marcos monteiro (1)Exercicios professor marcos monteiro (1)
Exercicios professor marcos monteiro (1)
 
Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2
 
Curso de Introdução - PHP
Curso de Introdução - PHPCurso de Introdução - PHP
Curso de Introdução - PHP
 
modernizando a arquitertura de sua aplicação
modernizando a arquitertura  de sua aplicaçãomodernizando a arquitertura  de sua aplicação
modernizando a arquitertura de sua aplicação
 
Classes Internas
Classes InternasClasses Internas
Classes Internas
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
 
Refactoring
RefactoringRefactoring
Refactoring
 
Construtores_Sobrecarga.pptx
Construtores_Sobrecarga.pptxConstrutores_Sobrecarga.pptx
Construtores_Sobrecarga.pptx
 

Más de Regis Magalhães

Más de Regis Magalhães (16)

High Dimensional Data
High Dimensional DataHigh Dimensional Data
High Dimensional Data
 
PHP 10 CodeIgniter
PHP 10 CodeIgniterPHP 10 CodeIgniter
PHP 10 CodeIgniter
 
Prog web 09-php-crud-mvc
Prog web 09-php-crud-mvcProg web 09-php-crud-mvc
Prog web 09-php-crud-mvc
 
Prog web 05-php-mysql
Prog web 05-php-mysqlProg web 05-php-mysql
Prog web 05-php-mysql
 
Prog web 04-php-gd
Prog web 04-php-gdProg web 04-php-gd
Prog web 04-php-gd
 
Prog web 03-php-sessoes-cookies_cabecalhos
Prog web 03-php-sessoes-cookies_cabecalhosProg web 03-php-sessoes-cookies_cabecalhos
Prog web 03-php-sessoes-cookies_cabecalhos
 
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
 
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
 
Prog web 00-modelo-cliente_servidor_web
Prog web 00-modelo-cliente_servidor_webProg web 00-modelo-cliente_servidor_web
Prog web 00-modelo-cliente_servidor_web
 
Prog web 01-php-introducao
Prog web 01-php-introducaoProg web 01-php-introducao
Prog web 01-php-introducao
 
Java 01 Java Visao Geral Resumo
Java 01 Java Visao Geral ResumoJava 01 Java Visao Geral Resumo
Java 01 Java Visao Geral Resumo
 
Merci 10 Completo
Merci 10 CompletoMerci 10 Completo
Merci 10 Completo
 
php 01 introducao
php 01 introducaophp 01 introducao
php 01 introducao
 
java 00 Introducao
java 00 Introducaojava 00 Introducao
java 00 Introducao
 
POO Plano de Curso
POO Plano de CursoPOO Plano de Curso
POO Plano de Curso
 
Php 04 Mysql
Php 04 MysqlPhp 04 Mysql
Php 04 Mysql
 

Prog web 06-php-oo

  • 1. Programação para WEB Regis Pires Magalhães regispiresmag@gmail.com Programação Orientada a Objetos em PHP
  • 2. Classes e Objetos <?php class Pessoa { private $nome; function __construct($nome) { $this->nome = $nome; } function getNome() { return $this->nome; } function setNome($nome) { $this->nome = $nome; } } $p = new Pessoa('João'); $q = $p; $p->setNome("Maria"); echo "{$p->getNome()}<br/>"; echo "{$q->getNome()}<br/>"; ?>
  • 3. Construtores  No PHP 4, o construtor tinha o mesmo nome da classe.  No PHP 5, se não for encontrado o __construct(), ele procurará o construtor com o mesmo nome da classe.
  • 4. Herança <?php require_once('pessoa.php'); class PessoaFisica extends Pessoa { private $cpf; function __construct($nome,$cpf) { parent::__construct($nome); $this->cpf = $cpf; } function getCpf() { return $this->cpf; } function setCpf($cpf) { $this->cpf = $cpf; } } $pf = new PessoaFisica('Maria','123.456.789-00'); echo "Nome: {$pf->getNome()}<br/>"; echo "CPF: {$pf->getCpf()}<br/>"; ?>
  • 5. Sobrescrita de Métodos <?php class MinhaClasse { protected function minhaFuncao() { echo "MinhaClasse::minhaFuncao()n"; } } class OutraClasse extends MinhaClasse { public function minhaFuncao() { parent::minhaFuncao(); echo "OutraClasse::minhaFuncao()n"; } } $classe = new OutraClasse(); $classe->minhaFuncao(); ?>
  • 6. Sobrecarga de Construtores  Em PHP cada classe somente pode ter um único construtor.  Assim, não há sobrecarga de construtores: <?php class Pessoa { private $nome; function __construct() { } function __construct($nome) { $this->nome = $nome; } } ?> Fatal error: Cannot redeclare Pessoa::__construct()
  • 7. autoload  Pode-se definir uma função __autoload que é automaticamente chamada caso seja usada uma classe que ainda não foi definida.  Isso pode evitar a necessidade de escrever múltiplos includes ou requires. <?php function __autoload($class_name) { require_once $class_name . '.php'; } $obj = new MyClass1(); $obj2 = new MyClass2(); ?>
  • 8. autoload <?php class MinhaClasse { function helloWorld() { echo "Hello, Worldn"; } } ?> <?php function __autoload($class_name) { require_once($_SERVER["DOCUMENT_ROOT"] . "/classes/$class_name.php"); } ?> <?php require_once "autoload.php"; $obj = new MinhaClasse(); $obj->helloWorld(); ?> index.php autoload.php MinhaClasse.php
  • 9. Classes e Objetos <?php class A { private $nome; function __construct($nome) { $this->nome = $nome; } function oi() { if (isset($this)) { echo 'Oi, '.$this->nome.'. Este objeto é instância da classe '; echo get_class($this).'<br/>'; } else { echo 'Oi, não sei o seu nome, pois o método está sendo '; echo 'executado estaticamente.<br/>'; } } } class B { function ola() { A::oi(); } } $a = new A("Maria"); $a->oi(); A::oi(); $b = new B(); $b->ola(); B::ola(); ?>
  • 10. Construtores e Destrutores  Construtores pais não são chamados implicitamente pelo construtor da classe filha.  Para executar o construtor da classe pai, é necessária uma chamada a parent::__construct() no construtor da classe filha.  O método destrutor ou finalizador será chamado assim que todas as referências a um objeto particular forem removidas ou quando o objeto for explicitamente destruído através da função unset() ou ainda quando o programa é finalizado.  Destrutores pais não serão chamados implicitamente. Para executar o destrutor pai, deve-se fazer uma chamada explicitamente a parent::__destruct() no corpo do destrutor.
  • 11. Construtores e Destrutores <?php class MinhaClasseDestruivel { function __construct() { print "No construtor<br/>"; $this->name = "MinhaClasseDestruivel"; } function __destruct() { print "Destruindo $this->name"; } } $obj = new MinhaClasseDestruivel(); ?>
  • 12. Visibilidade dos membros <?php class MinhaClasse { public $publica = 'Public'; protected $protegida = 'Protected'; private $privada = 'Private'; function imprimeAlo() { echo $this->publica; echo $this->protegida; echo $this->privada; } } $obj = new MinhaClasse(); $obj->imprimeAlo(); echo $obj->publica; // Funciona echo $obj->protegida; // Erro Fatal echo $obj->privada; // Erro Fatal ?>
  • 13. Visibilidade dos membros <?php class MinhaClasse { public function __construct() { } public function meuPublico() { } protected function meuProtegido() { } private function meuPrivado() { } // Se nada for dito, é public function foo() { $this->meuPublico(); $this->meuProtegido(); $this->meuPrivado(); } } $minhaclasse = new MinhaClasse; $minhaclasse->foo(); $minhaclasse->meuPublico(); // Funciona $minhaclasse->meuProtegido(); // Erro Fatal $minhaclasse->meuPrivado(); // Erro Fatal ?>
  • 14. :: Operador de Resolução de Escopo  Permite acesso a membros estáticos, constantes ou sobrescritos de uma classe. <?php class MinhaClasse { const VALOR_CONST = 'Um valor constante'; } $classname = 'MinhaClasse'; echo $classname::VALOR_CONST; echo MinhaClasse::VALOR_CONST; ?>
  • 15. :: Operador de Resolução de Escopo <?php class OutraClasse extends MinhaClasse { public static $meu_estatico = 'variável estática'; public static function doisPontosDuplo() { echo parent::VALOR_CONST . "n"; echo self::$meu_estatico . "n"; } } $classname = 'OutraClasse'; echo $classname::doisPontosDuplo(); OutraClasse::doisPontosDuplo(); ?>  As palavras reservadas self e parent são usadas para acessar membros de dentro da definição da classe.
  • 16. Inicializações inválidas <?php class SimpleClass { // declarações de membro inválidas public $var1 = 'olá '.'mundo'; public $var2 = <<<FIM olá mundo FIM; public $var3 = 1+2; public $var4 = self::myStaticMethod(); public $var5 = $myVar; } ?>  Variáveis , membros de classe ou chamada de função não podem ser usados na inicialização direta de atributos.
  • 17. Inicializações válidas <?php class SimpleClass { // declarações de membro válidas public $var6 = myConstant; public $var7 = self::classConstant; public $var8 = array(true, false); } ?>
  • 18. Membros de Classe <?php error_reporting(E_STRICT); class Foo { public static function umMetodoEstatico() { echo 'oi<br/>'; } public function umMetodoNaoEstatico() { echo 'olá<br/>'; } } Foo::umMetodoEstatico(); Foo::umMetodoNaoEstatico(); ?>  Chamar métodos não estáticos de maneira estática gera um aviso de nível E_STRICT.
  • 19. Constantes  Constantes diferem de variáveis normais no não uso do símbolo $ para declará-las ou usá-las. <?php class MinhaClasse { const constante = 'valor constante'; function mostrarConstante() { echo self::constante . "<br/>"; } } echo MinhaClasse::constante . "<br/>"; $classe = new MinhaClasse(); $classe->mostrarConstante(); ?>
  • 20. Classes Abstratas <?php abstract class ClasseAbstrata { abstract protected function pegarValor(); abstract protected function valorComPrefixo( $prefixo ); public function imprimir() { print $this->pegarValor() . '<br/>'; } } class ClasseConcreta1 extends ClasseAbstrata { protected function pegarValor() { return "ClasseConcreta1"; } public function valorComPrefixo( $prefixo ) { return "{$prefixo}ClasseConcreta1"; } } $classe1 = new ClasseConcreta1; $classe1->imprimir(); echo $classe1->valorComPrefixo('FOO_') . '<br/>'; ?>
  • 21. Interfaces <?php interface Animal { public function emiteSom(); } class Gato implements Animal { public function emiteSom() { echo 'Miaaauhh'; } } class Cachorro implements Animal { public function emiteSom() { echo 'Au, Au'; } } $a = new Gato(); $b = new Cachorro(); echo "{$a->emiteSom()}<br/>"; echo "{$b->emiteSom()}<br/>"; ?>
  • 22. final  Métodos final NÃO podem ser sobrescritos em classes que o herdem.  Classes final não podem ser herdadas por outras classes.  O exemplo abaixo não funciona: <?php class ClasseBase { protected $id = 0; final function getId() { return $this->id++; } } class ClasseConcreta extends ClasseBase { function getId() { return $this->id += 2; } } ?>
  • 23. final  O exemplo abaixo também não funciona: <?php final class ClasseBase { // ... } class ClasseConcreta extends ClasseBase { // ... } ?>
  • 24. O método __toString()  Retorna a representação de um objeto em forma de string. <?php class Pessoa { private $nome; function __construct($nome) { $this->nome = $nome; } function __toString() { return $this->nome; } } $obj = new Pessoa("Maria"); echo $obj; ?>
  • 25. Clonagem de Objetos  Uma cópia de objeto é criada usando o comando 'clone'. Isso chama o método __clone() do objeto.  O método __clone() de um objeto não pode ser executado diretamente.
  • 26. Clonagem de Objetos <?php class Fone { public $numero, $tipo; public function __construct($numero,$tipo) { $this->numero = $numero; $this->tipo = $tipo; } } class Pessoa { public $nome, $fone; public function __construct($nome,$num_fone,$tipo_fone) { $this->nome = $nome; $this->fone = new Fone($num_fone,$tipo_fone); } public function __clone() { $this->fone = new Fone($this->fone->numero, $this->fone->tipo); } } $p1 = new Pessoa('Maria','8633231845','RES'); $p2 = clone $p1; echo('<p>Objeto Original:</p>'); print_r($p1); echo('<p>Objeto Clonado:</p>'); print_r($p2); $p2->nome = 'João'; $p2->fone->numero = '8699811234'; $p2->fone->tipo = 'CEL'; echo('<p>Objeto Original:</p>'); print_r($p1); echo('<p>Objeto Clonado:</p>'); print_r($p2); ?>
  • 27. Interceptação  Chamada de métodos e acesso a membros podem ser interceptados pelos métodos __set, __get e __call.  __set – intercepta a atribuição de valores a propriedades do objeto (declaradas ou não).  __get – intercepta requisições de propriedades do objeto (declaradas ou não).  __call – Intercepta chamadas a métodos. Executado automaticamente quando um método inexistente for chamado.
  • 28. Interceptação <?php class Pessoa { private $atributos; function __set($nome,$valor) { $this->atributos[$nome] = $valor; } function __get($nome) { return $this->atributos[$nome]; } function __call($nome,$params) { echo "Método chamado: $nome<br/>"; echo 'Parâmetros: '; print_r($params); } } $p1 = new Pessoa(); $p1->nome = 'Maria'; $p1->fone = '8633231234'; echo 'Nome: ' . $p1->nome . '<br/>'; echo 'Fone: ' . $p1->fone . '<br/>'; print_r($p1); echo '<br/>'; $p1->meuMetodo('PHP',123,'WEB'); ?>
  • 29. Instanciação Dinâmica <?php class MinhaClasse { function exibe($a,$b) { echo "Parâmetros: $a $b<br/>"; } } $classe = 'MinhaClasse'; $metodo = 'exibe'; $obj = new $classe; call_user_func(array($obj, $metodo),'PHP','WEB'); ?>
  • 30. Tratamento de Erros  A forma de manipulação de erro mais simples é abortar a execução da aplicação através da função die().  Controlar erros assim é geralmente ruim, pois abortar a execução do programa normalmente não é o comportamento desejado.
  • 31. Geração e Tratamento de Erros  A função trigger_error() gera um erro de um tipo determinado.  Tipos de erro:  E_USER_ERROR Gera um erro fatal.  E_USER_WARNING Gera uma advertência.  E_USER_NOTICE Gera uma notificação.  A função set_error_handler() define uma função para tratamento de erros.
  • 32. Geração e Tratamento de Erros <?php function trata_erros($tipo_erro,$msg,$arq,$linha) { echo $msg . '<br/>'; if ($tipo_erro == E_USER_ERROR) { die; } } set_error_handler('trata_erros'); trigger_error('Ocorreu um erro!!!',E_USER_WARNING); echo 'Código executado ou não'; ?>
  • 33. Exceções  Uma exceção pode ser disparada (throw), ou capturada (catch).  Código rodeado de um bloco try/catch, permite a captura de exceções em potencial.  Vários blocos catch podem ser usados para pegar diferentes classes de exceções.  A execução normal continuará após o último bloco catch definido na seqüência.  Quando uma exceção é lançada, o fluxo normal de execução é interrompido e o PHP tentará achar o primeiro bloco catch correspondente à exceção disparada.  Se uma exceção não for capturada, um Erro Fatal será lançado com uma mensagem "Uncaught Exception ...", a não ser que um tratador tenha sido definido com set_exception_handler().
  • 34. Exceções  Uma exceção é um objeto da classe Exception que contém os seguintes métodos:  getMessage() - Retorna a mensagem de erro.  getCode() - Retorna o código de erro.  getFile() - Retorna o arquivo no qual ocorreu o erro.  getLine() - Retorna a linha na qual ocorreu o erro.  getTrace() - Retorna um array com as ações até o erro.  getTraceAsString() - Retorna as ações em forma de string.
  • 35. Exceções <?php function inverso($x) { if ($x == 0) { throw new Exception('Divisão por zero.'); } else return 1/$x; } try { echo inverso(5) . '<br/>'; echo inverso(0) . '<br/>'; } catch (Exception $e) { echo $e->getMessage(), '<br/>'; } echo 'Fim.'; ?>
  • 36. Tratador de Exceções  A função set_exception_handler() define uma função de tratamento de exceção padrão se uma exceção não for capturada em um bloco try/catch.  A execução não parará depois que a função de tratamento for chamada. <?php function trata_excecoes($ex) { echo $ex->getMessage(),'<br/>'; } set_exception_handler('trata_excecoes'); throw new Exception('Exceção ocorreu!!!'); echo 'Código não executado'; ?>
  • 37. Comparação de Objetos  Operador de comparação (==)  Objetos são iguais se possuírem o mesmo conteúdo e forem instâncias da mesma classe.  Operador de identidade (===)  Objetos são idênticos se referenciam a mesma instância de uma mesma classe.
  • 38. Comparação de Objetos <?php class Pessoa { private $nome; function __construct($nome) { $this->nome = $nome; } } $p1 = new Pessoa('Maria'); $p2 = $p1; $p3 = new Pessoa('Maria'); echo '$p1 == $p2 - ' . ($p1 == $p2) . '<br/>'; echo '$p1 == $p3 - ' . ($p1 == $p3) . '<br/>'; echo '$p1 === $p2 - ' . ($p1 === $p2) . '<br/>'; echo '$p1 === $p3 - ' . ($p1 === $p3) . '<br/>'; ?>
  • 39. Comparação de Tipo <?php class Pessoa { } class PessoaFisica extends Pessoa { } $p1 = new PessoaFisica(); var_dump($p1 instanceof Pessoa); var_dump($p1 instanceof PessoaFisica); var_dump($p1 instanceof PessoaJuridica); ?>  instanceof é usado para determinar se um objeto é de uma determinada classe: