Академический Документы
Профессиональный Документы
Культура Документы
Pgina 1 de 45
Introdu
Classes e Objetos
ndice
Introduo
O bsico
Propriedades
Constantes do Objeto
Autoloading Classes
Construtores e Destrutores
Visibilidade
Herana de Objetos=
Operador de Resoluo de Escopo (::)
Palavra-Chave 'static'
Abstrao de Classes
Interfaces de Objetos
Traits
Classes annimas
Sobrecarga
Iterao de Objetos
Mtodos Mgicos
final
Clonando objetos
Comparando objetos
Type Hinting
Late Static Bindings
Objetos e Referncias
Serializao de Objetos - objetos em sesso
Log de modificaes da POO
O bs
Introduo
Apartir do PHP 5, o modelo de objetos foi rescrito para permitir melhor performance e mais funcionalidades. Esta
uma grande modificao do PHP 4. PHP 5 tem um modelo de objetos completo.
Entre outras novidades do PHP 5 esto a incluso de visibility, classes e metodos abstract e final, additional metodos
mgicos, interfaces, clonagem e dica de tipo.
O PHP trata objetos da mesma maneira que referencias ou manipuladores, significando que cada varivel contm uma
referencia a um objeto ao invs de uma cpia de todo o objeto. Veja Objetos e Referencias
Dica
Veja tambm o Guia de nomenclatura em espao de usurio.
IntroduoPHP Manual
Classes e Objetos
O bsico
Propriedad
O bsico
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 2 de 45
class
A definio de uma classe comea com a palavra chave class, seguida do nome da classe, seguido de um par de
colchetes que englobam as definies de propriedades e mtodos pertecentes classe.
O nome de uma classe tem de ser vlido, que no seja uma palavra reservada do PHP. Um nome de classe vlido
comea com uma letra ou sublinhado, seguido de qualquer sequncia de letras, nmeros e sublinhados. Como uma
expresso regular, pode ser expressada assim: ^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$.
Uma classe pode conter suas prprias constantes, variveis (chamadas de "propriedades") e funes (chamadas de
"mtodos").
Exemplo #1 Definio Simples de uma Classe
<?php
class SimpleClass
{
// declarao de propriedade
public $var = 'um valor padro';
}
?>
// declarao de mtodo
public function displayVar() {
echo $this->var;
}
A pseudo-varivel $this est disponvel quando um mtodo chamado a partir de um contexto de objeto. $this uma
referncia ao objeto chamado (normalmente o objeto ao qual o mtodo pertence, mas possivelmente outro objeto, se o
mtodo chamado estaticamente a partir do contexto de um objeto secundrio).
Exemplo #2 Alguns exemplos da pseudo varivel $this
<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this est definida (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this no est definida.\n";
}
}
}
class B
{
function bar()
{
// Nota: a prxima linha pode lanar um warning E_STRICT.
A::foo();
}
}
$a = new A();
$a->foo();
// Nota: a prxima linha pode lanar um warning E_STRICT.
A::foo();
$b = new B();
$b->bar();
// Nota: a prxima linha pode lanar um warning E_STRICT.
B::bar();
?>
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 3 de 45
new
Para criar uma instncia de uma classe, a instruo new deve ser utilizada. Um objeto sempre ser criado a no ser
que a classe tenha um construtor definido que dispare uma exceo em caso de erro. Classes devem ser definidas
antes de instanciadas (e em alguns casos isso obrigatrio).
Se uma string contendo o nome da classe utilizado com new, uma nova instncia da classe ser criada. Se a classe
estiver dentro de um namespace, o nome completo e qualificado deve ser utilizado para fazer isso.
Exemplo #3 Criando uma instncia
<?php
$instance = new SimpleClass();
// Tambm pode ser feito com uma varivel:
$className = 'SimpleClass';
$instance = new $className(); // new SimpleClass()
?>
No contexto da classe, possvel criar um novo objeto com new self e new parent.
Ao atribuir uma instncia de uma classe j criada, a uma varivel nova, a varivel nova ir acessar a mesma instncia
do objeto que foi atribudo. Este comportamento se mantm ao se passar instncias a uma funo. Uma cpia de um
objeto criado pode ser feita clonando o mesmo.
Exemplo #4 Atribuio de Objetos
<?php
$instance = new SimpleClass();
$assigned
$reference
= $instance;
=& $instance;
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 4 de 45
Propriedades e mtodos
Propriedades e mtodos de classe vivem em "namespaces" separados, de forma que possvel ter uma propriedade e
mtodo com mesmos nomes. A referncia a propriedades e mtodos tem a mesma notao, e a deciso de se uma
propriedade ser acessada ou uma chamada a um mtodo feita, depende somente do contexto, ou seja, se est
tentando acessar uma varivel ou chamar um mtodo.
Exemplo #6 Acesso a propriedade vs. chamar um mtodo
class Foo
{
public $bar = 'propriedade';
public function bar() {
return 'mtod';
}
}
$obj = new Foo();
echo $obj->bar, PHP_EOL, $obj->bar(), PHP_EOL;
Isto significa que chamar diretamente uma funo annima atribuda a uma propriedade no possvel. Em vez disso,
por exemplo, a propriedade deve primeiro ser atribuda a uma varivel. A partir do PHP 7.0.0, possvel chamar uma
propriedade diretamente a colocando entre parnteses.
Exemplo #7 Chamando uma funo annima armazenada em uma propriedade
class Foo
{
public $bar;
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 5 de 45
extends
Uma classe pode herdar mtodos e propriedades de outra classe usando a palavra-chave extends na declarao da
classe. No possvel herdar mltiplas classes; uma classe s pode herdar uma classe base.
Os mtodos e propriedades herdados podem ser sobrescritos redeclarando-os com o mesmo nome definido na classe
base. Entretanto, se o mtodo foi definido na classe base como final esse mtodo no poder ser sobrescrito.
possvel acessar os mtodos sobrescritos ou propriedades estticas referenciado-os com parent::.
Ao sobrescrever mtodos, a assinatura de parmetros deve permanecer a mesma ou o PHP gerar um erro de nvel
E_STRICT. Isto no se aplica ao construtor, que permite a sobrescrita com parmetros diferentes.
Exemplo #8 Herana da Classe Simples
<?php
class ExtendClass extends SimpleClass
{
// Redefine o mtodo pai
function displayVar()
{
echo "Classe Herdeira\n";
parent::displayVar();
}
}
$extended = new ExtendClass();
$extended->displayVar();
?>
::class
Desde o PHP 5.5, a palavra-chave class tambm pode ser utilizada para resoluo de nome de classes. Pode-se obter
uma string contendo o nome completo e qualificado da classe ClassName utilizando ClassName::class. Isso
particularmente til em classes com namespaces.
Exemplo #9 Resoluo de nome da classe
<?php
namespace NS {
class ClassName {
}
echo ClassName::class;
}
?>
Nota:
A resoluo de nomes de classe atravs de ::class uma transformao em tempo de compilao.
Significando que a string com nome criada antes que o autoloading tenha acontecido. Como
consequncia, os nomes de classe so expandidos mesmo que a classe no exista. Neste caso, nenhum
erro ser emitido.
O bsicoPHP Manual
Classes e Objetos
Propriedades
Constantes do Obj
Propriedades
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 6 de 45
Variveis membros de uma classe so chamadas "propriedades". Pode-se tambm observar serem referidas utilizando
outros termos como "atributos" ou "campos", mas para o propsito desta referncia, usaremos "propriedades". So
definidas usando uma das palavras-chave public, protected, or private, seguidas de uma declarao normal de
varivel. Esta declarao pode incluir sua inicializao, porm esta inicializao deve ser um valor constante--isso ,
deve ser possvel avali-lo em tempo de compilao e no deve-se depender de informaes de tempo de execuo.
See Visibilidade for more information on the meanings of public, protected, and private.
Nota:
Para manter a retrocompatibilidade com o PHP 4, o PHP 5 continuar aceitando o uso da palavra-chave
var na declarao de propriedades ao invs de (ou em adio a) public, protected, ou private. Entretanto,
var no mais obrigatrio. Em verses entre o PHP 5.0 e 5.1.3, o uso de var era considerado obsoleto e
emitiria um aviso E_STRICT, mas desde o PHP 5.1.3, seu uso no mais obsoleto e no ser emitido um
aviso.
Caso declare uma propriedade usando var ao invs de public, protected, ou private, o PHP 5 tratar a
propriedade como se tivesse declarada como public.
Mtodos dentro de classes podem acessar propriedades no estticas usando -> (Operador de Objeto):
$this->property (onde property o nome da propriedade). Propriedades estticas so acessadas utilizando os :: (Dois
pontos dublo): self::$property. Veja Palavra-chave Static para mais informaes sobre a diferente entre propriedades
estticas e no estticas.
A pseudo-varivel $this est disponvel dentro de mtodos de qualquer classe quando o mtodo chamado dentro do
contexto do objeto. $this faz referncia ao objeto chamado (geralmente o objeto o qual o mtodo pertence, mas
possvel outro objeto, se o mtodo chamado estaticamente do contexto de um segundo objeto).
Exemplo #1 declarao de propriedades
<?php
class SimpleClass
{
// invalid property declarations:
public $var1 = 'hello ' . 'world';
public $var2 = <<<EOD
hello world
EOD;
public $var3 = 1+2;
public $var4 = self::myStaticMethod();
public $var5 = $myVar;
// valid property declarations:
public $var6 = myConstant;
public $var7 = array(true, false);
// This is allowed only in PHP 5.3.0 and later.
public $var8 = <<<'EOD'
hello world
EOD;
}
?>
Nota:
Existem algumas funes interessantes para manipular classes e objetos. Se desejar d uma olhada nas
funes de Classes/Objetos.
Diferentemente, heredocs, nowdocs podem ser utilizados em qualquer contexto de dados estticos, incluindo assim,
declarao de propriedades.
Exemplo #2 Exemplo de uso do nowdoc para inicializar uma propriedade
<?php
class foo {
// As of PHP 5.3.0
public $bar = <<<'EOT'
bar
EOT;
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 7 de 45
}
?>
Nota:
O suporte ao nowdoc foi adicionado no PHP 5.3.0.
PropriedadesPHP Manual
Classes e Objetos
Constantes do Objeto
Autoloading Clas
Constantes do Objeto
possvel definir valores constantes em cada classe permanecendo a mesma e imutvel. Constantes diferem de
variveis normais, ao no usar o smbolo $ para declar-las ou us-las.
O valor deve ser uma expresso constante, no podendo ser (por exemplo) uma varivel, uma propriedade, ou uma
chamada a uma funo.
Tambm possvel que interfaces tenham constantes. Veja na documentao de interface os exemplos.
A partir do PHP 5.3.0, possvel referenciar a classe usando uma varivel. O valor da varivel no pode ser uma
palavra-chave (e.g. self, parent e static).
Exemplo #1 Definindo e usando uma constante
<?php
class MinhaClasse
{
const constante = 'valor constante';
function mostrarConstante() {
echo self::constante . "\n";
}
}
echo MinhaClasse::constante . "\n";
$classname = "MinhaClasse";
echo $classname::constante; // A partir do PHP 5.3.0
$classe = new MinhaClasse();
$classe->mostrarConstante();
echo $classe::constante; // A partir do PHP 5.3.0
?>
do PHP 5.3.0
<<<'EOT'
do 5.3.0
<<<EOT
Nota:
O suporte para inicializao de constantes com Heredoc e Nowdoc foi adicionado no PHP 5.3.0.
Exemplo #3 Exemplo de expresso constante
<?php
const ONE = 1;
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 8 de 45
class foo {
// A partir do 5.6.0
const TWO = ONE * 2;
const THREE = ONE + self::TWO;
const SENTENCE = 'O valor de THREE '.self::THREE;
}
?>
possvel fornecer uma expresso escalar envolvendo strings e numricos literais e/ou constantes no contexto de
uma constante de classe.
Nota:
Expresses constantes foram adicionados no PHP 5.6.0.
Constantes do ObjetoPHP Manual
Classes e Objetos
Autoloading Classes
Construtores e Destruto
Autoloading Classes
Muitos desenvolvedores ao desenvolver aplicaes orientadas a objeto criam um arquivo PHP para cada definio de
classe. Um dos maiores contratempos ter de escrever uma longa lista de includes no incio de cada script(um para
cada classe).
No PHP 5 isso no mais necessrio. A funo spl_autoload_register() registra qualquer nmero de autoloaders,
permitindo que classes e interfaces sejam automaticamente carregadas se elas no ainda no foram definidas. Ao
registrar autoloaders, o PHP tm uma ltima chance de carregar classes e interfaces antes que falhem com um erro.
Dica
Embora a funo __autoload() tambm pode ser utilizada para carregar automaticamente classes e interfaces,
prefervel a utilizao da funo spl_autoload_register(). Por que uma alternativa mais flexvel (permitindo que
vrios autoloaders sejam especificados na aplicao, assim como bibliotecas de terceiros). Por esta razo, o uso da
funo __autoload() desencorajado e pode se tornar obsoleta em verses futuras.
Nota:
Antes do PHP 5.3.0 excees disparadas na funo __autoload() no eram capturadas no bloco catch e
resultavam em um erro fatal. Do PHP 5.3.0 em diante, isso possvel sendo que se uma exceo
customizada disparada, ento a classe da exceo customizada se tornar disponvel. A funo
__autoload() deve ser usada recursivamente para carregar a classe de exceo customizada.
Nota:
Autoloading no disponvel usando PHP em modo interativo CLI.
Nota:
Se o nome da classe usado por exemplo em call_user_func() ento ela pode conter alguns caracteres
perigosos como ../. recomendado no usar entrada de usurio nestas funes ou pelo menos verificar a
entrada em __autoload().
Exemplo #1 Exemplo de Autoload
Esse exemplo tenta carregar as classes MyClass1 e MyClass2 dos arquivos MyClass1.php e MyClass2.php
respectivamente.
<?php
spl_autoload_register(function ($class_name) {
include $class_name . '.php';
});
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 9 de 45
Exemplo #4 Autoload com manipulao de excees no PHP 5.3.0+ - Faltando exceo customizada.
Este exemplo dispara uma exceo para uma exceo customizada no carregvel.
<?php
spl_autoload_register(function ($name) {
echo "Want to load $name.\n";
throw new MissingException("Unable to load $name.");
});
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
Veja Tambm
unserialize()
unserialize_callback_func
spl_autoload_register()
spl_autoload()
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 10 de 45
__autoload()
Autoloading ClassesPHP Manual
Classes e Objetos
Construtores e Destrutores
Visibilida
Construtores e Destrutores
Construtores
void __construct ([ mixed $args [, $... ]] )
O PHP 5 permite aos desenvolvedores declararem mtodos construtores para as classes. Classes que tem um mtodo
construtor, chamam o mtodo a cada objeto recm criado, sendo apropriado para qualquer inicializao que o objeto
necessite antes de ser utilizado.
Nota: Construtores pais no so chamados implicitamente se a classe filha define um construtor. Para
executar o construtor da classe pai, uma chamada a parent::__construct() dentro do construtor da classe
filha necessria. Se a classe filha no definir um construtor, ser herdado da classe pai como um
mtodo normal (se no foi declarado como privado).
Exemplo #1 Usando novos construtores unificados
<?php
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
class OtherSubClass extends BaseClass {
// inherits BaseClass's constructor
}
// In BaseClass constructor
$obj = new BaseClass();
// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();
// In BaseClass constructor
$obj = new OtherSubClass();
?>
Para retrocompatibilidade com as verses do PHP 3 e 4, se o PHP no encontrar um __construct() para uma
determinada classe, e a classe no herda um da classe, ele procurar pela funo construtora moda-antiga, que tenha
o mesmo nome da classe. Efetivamente, isso significa que o nico caso que pode gerar problemas de compatibilidade
ser quando a classe tiver um mtodo chamado __construct() usado em semntica diferente.
Aviso
Construtores no estilo antigo se tornaram OBSOLETOS no PHP 7.0, e sero removidos em uma verso futura. Devese sempre utilizar __construct() em novos cdigos.
Diferente de outros mtodos, o PHP no ir gerar uma mensagem de erro de nvel E_STRICT quando __construct()
sobrescrito com parmetros diferentes do mtodo __construct()da classe pai possuir.
A partir do PHP 5.3.3, mtodos com o mesmo nome que o ltimo elemento de uma classe com namespace no sero
tratados como construtor. Esta modificao no afeta classe sem namespace.
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 11 de 45
Destrutor
void __destruct ( void )
O PHP 5 introduz um conceito de destrutor similar ao de outras linguagens orientadas a objeto, como C++. O mtodo
destrutor ser chamado assim que todas as referncias a um objeto particular forem removidas ou quando o objeto for
explicitamente destrudo ou qualquer ordem na sequncia de encerramento.
Exemplo #3 Exemplo de Destrutor
<?php
class MinhaClasseDestruivel {
function __construct() {
print "No construtor\n";
$this->name = "MinhaClasseDestruivel";
}
function __destruct() {
print "Destruindo " . $this->name . "\n";
}
}
$obj = new MinhaClasseDestruivel();
?>
Como os construtores, destrutores da classe pai no sero chamados implicitamente pelo motor. Para executar o
destrutor pai, deve-se fazer uma chamada explicita a parent::__destruct() no corpo do destrutor. Assim como
construtores, uma classe filha pode herdar o destrutor pai caso no implemente um.
O destrutor ser chamado mesmo se o script for terminado utilizando-se exit(). Chamar exit() em um destrutor ir
impedir que as demais rotinas de encerramento executem.
Nota:
Destrutores chamados durante o encerramento da execuo do script tem os cabealhos HTTP enviados.
O diretrio atual na fase de encerramento do script pode ser diferente em alguns SAPIs (e.g. Apache).
Nota:
Tentar disparar uma exceo em um destrutor (chamado no trmino do script), causar um erro fatal.
Construtores e DestrutoresPHP Manual
Classes e Objetos
Visibilidade
Herana de Objeto
Visibilidade
A visibilidade de uma propriedade ou mtodo pode ser definida prefixando a declarao com as palavras-chave:
public, protected or private. Itens declarados como pblicos podem ser acessados de qualquer lugar. Membros
declarados como protegidos s podem ser acessados na classe declarante e suas classes herdeiras. Membros
declarados como privados s podem ser acessados na classe que define o membro privado.
Visibilidade de propriedades
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 12 de 45
Propriedades de classes devem ser declarados como pblicas, privadas ou protegidas. Se declarado com var a
propriedade ser definida como pblica.
Exemplo #1 Declarao de propriedade
<?php
/**
* Define MinhaClasse
*/
class MinhaClasse
{
public $publica = 'Public';
protected $protegida = 'Protected';
private $privada = 'Private';
function
{
echo
echo
echo
}
imprimeAlo()
$this->publica;
$this->protegida;
$this->privada;
}
$obj = new MinhaClasse();
echo $obj->publica; // Funciona
echo $obj->protegida; // Erro Fatal
echo $obj->privada; // Erro Fatal
$obj->imprimeAlo(); // Mostra Public, Protected e Private
/**
* Define MinhaClasse2
*/
class MinhaClasse2 extends MinhaClasse
{
// Ns podemos redeclarar as propriedades pblicas e protegidas mas no as privadas
protected $protegida = 'Protected2';
function
{
echo
echo
echo
}
imprimeAlo()
$this->publica;
$this->protegida;
$this->privada;
}
$obj2 = new MinhaClasse2();
echo $obj2->publica; // Works
echo $obj2->privada; // Undefined
echo $obj2->protegida; // Fatal Error
$obj2->imprimeAlo(); // Mostra Public, Protected2, Undefined
?>
Nota: O uso da declarao de varivel com a palavra-chave var ainda suportada por razes de
compatibilidade (como um sinnimo para a palavra-chave public). Em verses do PHP anteriores ao
5.1.3, isso gerar um aviso do tipo E_STRICT.
Visibilidades de mtodos
Mtodos de classe podem ser definidos como pblico, privado ou protegido. Mtodos sem qualquer declarao
explcita sero definidos como pblico.
Exemplo #2 Declarao de mtodo
<?php
/**
* Define MinhaClasse
*/
class MinhaClasse
{
// Declara um construtor pblico
public function __construct() { }
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 13 de 45
// Esse public
function Foo()
{
$this->MeuPublico();
$this->MeuProtegido();
$this->MeuPrivado();
}
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 14 de 45
VisibilidadePHP Manual
Classes e Objetos
Herana de Objetos=
Herana de Objetos=
Herana um conceito de programao estabelecido, e o PHP PHP faz use deste em seu modelo de objetos. Este
princpio afeta a forma com que classes e objetos se relacionam com outras.
Por exemplo, ao se estender uma classe, a subclasse herda todos os mtodos pblicos e protegidos da classe pai. A
no que uma classe sobrescreva estes mtodos, eles mantero sua funcionalidade original.
Isto til para definir uma funcionalidade abstrata, e permitir a implementao de uma funcionalidade adicional em
objetos similares sem a necessidade de reimplementar todas as funcionalidades compartilhadas.
Nota:
A no ser que o autoload seja usado, as classes devem ser definidas antes de utilizadas. Se uma classe
estende outra, a classe pai deve ser declarada antes da estrutura da classe filha. Esta regra se aplica a
classes que herdam outras classes e interfaces.
Exemplo #1 Exemplo de herana
<?php
class Foo
{
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 15 de 45
//
//
//
//
Output:
Output:
Output:
Output:
'Foo: baz'
'PHP is great'
'Bar: baz'
'PHP is great'
?>
Palavra-Chave 'sta
Trs palavras-chave especiais self, parent e static, so utilizadas para acessar propriedades e mtodos dentro de uma
definio de classe.
Exemplo #2 :: de dentro da definio da classe
<?php
class OtherClass extends MyClass
{
public static $my_static = 'varivel esttica';
public static function doubleColon() {
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 16 de 45
}
$classname = 'OtherClass';
echo $classname::doubleColon(); // A partir do PHP 5.3.0
OtherClass::doubleColon();
?>
Quando uma subclasse sobrecarrega a definio de um mtodo do pai, o PHP no chamar o mtodo pai. Fica a cargo
da subclasse chamar o mtodo pai ou no. Isso tambm se aplica a definies de mtodos Construtores e Destrutores,
de Sobrecarga e Mgicos.
Exemplo #3 Chamando um mtodo pai
<?php
class MyClass
{
protected function myFunc() {
echo "MyClass::myFunc()\n";
}
}
class OtherClass extends MyClass
{
// Sobrescreve e definio da classe estendida
public function myFunc()
{
// Mas ainda consegue chamar o mtodo na classe herdada
parent::myFunc();
echo "OtherClass::myFunc()\n";
}
}
$class = new OtherClass();
$class->myFunc();
?>
Abstrao de Clas
Palavra-Chave 'static'
Dica
Esta pgina descreve o uso da palavra-chave static na definio de mtodos e propriedades estticas. A palavra-chave
static tambm pode ser utilizada para definir variveis estticas e em late static bindings. Veja essas pginas para
informaes desses outros usos de static.
Declarar propriedades ou mtodos de uma classe como estticos faz deles acessveis sem a necessidade de instanciar
a classe. Um membro declarados como esttico no pode ser acessado com um objeto instanciado da classe (embora
mtodos estticos podem).
Por compatibilidade com o PHP 4, se nenhuma declarao de visibilidade for utilizada, a propriedade ou mtodo ser
tratado como se declarado como public.
Mtodos estticos
Como mtodos estticos podem ser chamados sem uma instancia do objeto criada, a pseudo-varivel $this no est
disponvel dentro de um mtodo declarado como esttico.
Cuidado
No PHP 5, chamar mtodos no estticos estaticamente gerar um alerta de nvel E_STRICT.
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 17 de 45
Aviso
No PHP 7, chamar mtodos no estticos estaticamente foi depreciado, e gerar um alerta de nvel E_DEPRECATED. O
suporte a chamada de mtodos no estticos estaticamente pode ser removido no futuro.
Exemplo #1 Exemplo de mtodo esttico
<?php
class Foo {
public static function aStaticMethod() {
// ...
}
}
Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // As of PHP 5.3.0
?>
Propriedades estticas
Propriedades estticas no podem ser acessadas atravs do operador ->.
Como qualquer outra varivel esttica do PHP, propriedades estticas podem ser inicializadas, at o PHP 5.6,
somente usando um valor literal ou constante; expresses no so permitidas. No PHP 5.6 e em verses superiores, as
mesmas regras aplicadas a expresses const: algumas expresses limitadas so possveis, se fornecidas sero
avaliadas em tempo de compilao.
A partir do 5.3.0, possvel referenciar a classe usando uma varivel. O valor da varivel no pode ser uma palavra
chave (por exemplo, self, parent e static).
Exemplo #2 Exemplo de propriedade esttica
<?php
class Foo
{
public static $meu_estatico = 'foo';
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
Interfaces de Obje
22/07/2016
Classes e Objetos
Pgina 18 de 45
Abstrao de Classes
O PHP 5 introduz mtodos e classes abstratas. Classes definidas como abstratas no podem ser instanciadas, e
qualquer classe que contenha ao menos um mtodo abstrato tambm deve ser abstrata. Mtodos so definidos como
abstratos declarando a inteno em sua assinatura - no podem definir a implementao.
Ao herdar uma classe abstrata, todos os mtodos marcados como abstratos na na declarao da classe pai devem ser
implementados na classe filha; adicionalmente, estes mtodos devem ser definidos com a mesma (ou menos restrita)
visibilidade. Por exemplo, se um mtodo abstrato for definido como protegido, a implementao da funo deve ser
definida como protegida ou pblica, mas no privada. Alm disso, a assina dos mtodos devem coincidir, isso , as
indues de tipo e o nmero de argumentos exigidos devem ser os mesmos. Por exemplo, se a classe filha define um
argumento opcional, e a assinatura do mtodo abstrato no, h um conflito na assinatura. Tambm se aplica a
construtores desde o PHP 5.4. Em verses anteriores a 5.4, as assinaturas dos construtores poderiam ser diferentes.
Exemplo #1 Exemplo de classe abstrata
<?php
abstract class ClasseAbstrata
{
// Fora a classe que estende ClasseAbstrata a definir esse mtodo
abstract protected function pegarValor();
abstract protected function valorComPrefixo( $prefixo );
// Mtodo comum
public function imprimir() {
print $this->pegarValor();
}
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 19 de 45
Cdigos antigos que no possuem classes e funes com nome 'abstract' podem ser executados sem modificaes.
Abstrao de ClassesPHP Manual
Classes e Objetos
Interfaces de Objetos
Tra
Interfaces de Objetos
Interfaces de objetos permitem a criao de cdigos que especificam quais mtodos uma classe deve implementar,
sem definir como esses mtodos sero tratados.
Interfaces so definidas usando a palavra-chave interface, da mesma maneira que uma classe comum, mas sem
nenhum dos mtodos tendo seu contedo definido.
Todos os mtodos declarados em uma interface devem ser pblicos, essa a natureza de uma interface.
implements
Para implementar uma interface, o operador implements utilizado. Todos os mtodos na interface devem ser
implementados na classe; no faz-lo resultar em um erro fatal. Classes podem implementar mais de uma interface
se assim for desejado, separando cada interface com uma vrgula.
Nota:
Em verses anteriores ao PHP 5.3.9, uma classe no poderia implementar duas interfaces que
especificassem um mtodo com o mesmo nome, pois causaria ambiguidade. Verses mais recentes do
PHP, isso permitido, desde que os mtodos duplicados tenham a mesma assinatura.
Nota:
Interfaces podem ser estendidas como as classes, usando o operador extends.
Nota:
A classe que implementa a interface precisa ter as mesmas assinaturas de mtodo como definidas na
interface. No faz-lo resultar em um erro fatal
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 20 de 45
Constantes
possvel ter constantes em interfaces. Constantes de interfaces funcionam exatamente como constantes de classes,
com exceo de no poderem ser sobrescritas por uma classe/interface herdeira.
Exemplos
Exemplo #1 Exemplo de Interface
<?php
// Declara a interface 'iTemplate'
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// Implementa a interface
// Isso funcionar
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
}
return $template;
}
// Isso NO funcionar
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
private $vars = array();
}
?>
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 21 de 45
{
}
Uma interface, juntamente com a declarao de tipo, fornecem uma boa maneira de garantir que um objeto em
particular possua determinados mtodos. Veja o operador instanceof e declarao de tipo.
Interfaces de ObjetosPHP Manual
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
Classes annim
22/07/2016
Classes e Objetos
Pgina 22 de 45
Classes e Objetos
Traits
Traits
As of PHP 5.4.0, PHP implements a method of code reuse called Traits.
Traits are a mechanism for code reuse in single inheritance languages such as PHP. A Trait is intended to reduce
some limitations of single inheritance by enabling a developer to reuse sets of methods freely in several independent
classes living in different class hierarchies. The semantics of the combination of Traits and classes is defined in a way
which reduces complexity, and avoids the typical problems associated with multiple inheritance and Mixins.
A Trait is similar to a class, but only intended to group functionality in a fine-grained and consistent way. It is not
possible to instantiate a Trait on its own. It is an addition to traditional inheritance and enables horizontal composition
of behavior; that is, the application of class members without requiring inheritance.
Exemplo #1 Trait example
<?php
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}
class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
?>
Precedence
An inherited member from a base class is overridden by a member inserted by a Trait. The precedence order is that
members from the current class override Trait methods, which in turn override inherited methods.
Exemplo #2 Precedence Order Example
An inherited method from a base class is overridden by the method inserted into MyHelloWorld from the SayWorld
Trait. The behavior is the same for methods defined in the MyHelloWorld class. The precedence order is that
methods from the current class override Trait methods, which in turn override methods from the base class.
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 23 de 45
Hello World!
Multiple Traits
Multiple Traits can be inserted into a class by listing them in the use statement, separated by commas.
Exemplo #4 Multiple Traits Usage
<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
}
trait World {
public function sayWorld() {
echo 'World';
}
}
class MyHelloWorld {
use Hello, World;
public function sayExclamationMark() {
echo '!';
}
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>
Conflict Resolution
If two Traits insert a method with the same name, a fatal error is produced, if the conflict is not explicitly resolved.
To resolve naming conflicts between Traits used in the same class, the insteadof operator needs to be used to choose
exactly one of the conflicting methods.
Since this only allows one to exclude methods, the as operator can be used to allow the inclusion of one of the
conflicting methods under another name.
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 24 de 45
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 25 de 45
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 26 de 45
class C1 {
use Counter;
}
class C2 {
use Counter;
}
$o = new C1(); $o->inc(); // echo 1
$p = new C2(); $p->inc(); // echo 1
?>
Properties
Traits can also define properties.
Exemplo #11 Defining Properties
<?php
trait PropertiesTrait {
public $x = 1;
}
class PropertiesExample {
use PropertiesTrait;
}
$example = new PropertiesExample;
$example->x;
?>
If a trait defines a property then a class can not define a property with the same name, otherwise an error is issued. It
is an E_STRICT if the class definition is compatible (same visibility and initial value) or fatal error otherwise.
Exemplo #12 Conflict Resolution
<?php
trait PropertiesTrait {
public $same = true;
public $different = false;
}
class PropertiesExample {
use PropertiesTrait;
public $same = true; // Strict Standards
public $different = true; // Fatal error
}
?>
TraitsPHP Manual
Classes e Objetos
Classes annimas
Sobrecar
Classes annimas
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 27 de 45
O suporte a classes annimas foi adicionado no PHP 7. Classes annimas so teis quando objetos descartveis
precisarem ser criados.
<?php
// Pre PHP 7 code
class Logger
{
public function log($msg)
{
echo $msg;
}
}
$util->setLogger(new Logger());
// PHP 7+ code
$util->setLogger(new class {
public function log($msg)
{
echo $msg;
}
});
Podem passar argumentos atravs de seus construtores, estender outras classes, implementar interfaces, e usar traits
como uma classe normal faz:
<?php
class SomeClass {}
interface SomeInterface {}
trait SomeTrait {}
var_dump(new class(10) extends SomeClass implements SomeInterface {
private $num;
public function __construct($num)
{
$this->num = $num;
}
});
use SomeTrait;
Aninhar uma classe annima dentro de outra classe no d acesso a nenhum mtodo privado ou protegido, ou
propriedades da classe externa. Para utilizar os mtodos e propriedades protegidas da classe externa, a classe annima
pode estender a classe externa. Para utilizar as propriedades privadas da classe externa na classe annima, elas devem
ser passadas atravs do construtor:
<?php
class Outer
{
private $prop = 1;
protected $prop2 = 2;
protected function func1()
{
return 3;
}
public function func2()
{
return new class($this->prop) extends Outer {
private $prop3;
public function __construct($prop)
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 28 de 45
{
}
};
}
$this->prop3 = $prop;
Iterao de Obje
Sobrecarga
Sobrecarga em PHP prov recursos para "criar" dinamicamente propriedades e mtodos. Estas entidades dinmicas
so processadas por mtodos mgicos fornecendo a uma classe vrios tipos de aes.
Os mtodos de sobrecarga so invocados ao interagir com propriedades ou mtodos que no foram declarados ou no
so visveis no escopo corrente. O resto desta seo usar os termos "propriedades inacessveis" e "mtodos
inacessveis" para referir-se a esta combinao de declarao e visibilidade.
Todos os mtodos de sobrecarga devem ser definidos como pblicos.
Nota:
Nenhum dos argumentos dos mtodos mgicos podem ser passados por referncia.
Nota:
A interpretao do PHP de "sobrecarga" diferente da maioria das linguagens orientadas a objeto.
Sobrecarga, tradicionalmente, prov a habilidade de ter mltiplos mtodos com o mesmo nome, mas com
quantidades e tipos de argumentos diferentes.
Changelog
Verso
5.3.0
5.1.0
5.0.0
Descrio
Adicionado __callStatic(). Adicionado um aviso para reforar a visibilidade pblica e a declarao no
esttica.
Adicionados os mtodos de sobrecarga __isset() e __unset(). Adicionado o suporte ao mtodo __get()
sobrecarregar propriedades privadas.
Adicionado o mtodo __get().
Sobrecarga de propriedades
public void __set ( string $name , mixed $value )
public mixed __get ( string $name )
public bool __isset ( string $name )
public void __unset ( string $name )
__set() executado ao escrever dados em propriedades inacessveis.
__get() utilizado para ler dados de propriedades inacessveis.
__isset() disparado ao chamar a funo isset() ou empty() em propriedades inacessveis.
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 29 de 45
*/
*/
/** Overloading only used on this when accessed outside the class.
private $hidden = 2;
*/
*/
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 30 de 45
echo "<pre>\n";
$obj = new PropertyTest;
$obj->a = 1;
echo $obj->a . "\n\n";
var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n";
echo $obj->declared . "\n\n";
echo
echo
echo
echo
echo
?>
Sobrecarga de mtodo
public mixed __call ( string $name , array $arguments )
public static mixed __callStatic ( string $name , array $arguments )
__call() disparado ao invocar mtodos inacessveis em um contexto de objeto.
__callStatic() disparado quando invocando mtodos inacessveis em um contexto esttico.
O argumento $name o nome do mtodo sendo chamado. O argumento $arguments um array enumerado contendo
os parmetros passados para o mtodo $name.
Exemplo #2 Sobrecarga de mtodos instanciados com __call() e __callStatic()
<?php
class MethodTest
{
public function __call($name, $arguments)
{
// Note: value of $name is case sensitive.
echo "Calling object method '$name' "
. implode(', ', $arguments). "\n";
}
/** As of PHP 5.3.0 */
public static function __callStatic($name, $arguments)
{
// Note: value of $name is case sensitive.
echo "Calling static method '$name' "
. implode(', ', $arguments). "\n";
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 31 de 45
}
}
$obj = new MethodTest;
$obj->runTest('in object context');
MethodTest::runTest('in static context');
?>
// As of PHP 5.3.0
SobrecargaPHP Manual
Classes e Objetos
Iterao de Objetos
Mtodos Mgic
Iterao de Objetos
O PHP 5 fornece uma maneira de definir objetos para que seja possvel iterar por uma lista de items, como, por
exemplo, a instruo foreach. Por padro, todas as propriedades visveis sero utilizadas para a iterao.
Exemplo #1 Iterao simples de objetos
<?php
class MyClass
{
public $var1 = 'value 1';
public $var2 = 'value 2';
public $var3 = 'value 3';
protected $protected = 'protected var';
private
$private
= 'private var';
function iterateVisible() {
echo "MyClass::iterateVisible:\n";
foreach ($this as $key => $value) {
print "$key => $value\n";
}
}
}
$class = new MyClass();
foreach($class as $key => $value) {
print "$key => $value\n";
}
echo "\n";
$class->iterateVisible();
?>
Como a sada mostra, o foreach passou por cada uma das variveis visveis que podem ser acessadas.
Indo um pouco alm, pode-se implementar a interface Iterator. Isso permite que o objeto decida como ser iterado e
quais valores estaro disponveis em cada iterao.
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 32 de 45
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 33 de 45
next:
valid:
A interface IteratorAggregate pode ser utilizada como uma alternativa em vez de implementar todos os mtodos de
Iterator. IteratorAggregate somente exige a implementao de um nico mtodo, IteratorAggregate::getIterator(), que
deve retornar uma instncia de uma classe que implementa a interface Iterator.
Exemplo #3 Iterao de Objeto implementado IteratorAggregate
<?php
class MyCollection implements IteratorAggregate
{
private $items = array();
private $count = 0;
// Required definition of interface IteratorAggregate
public function getIterator() {
return new MyIterator($this->items);
}
Nota:
Para mais exemplos de iterao, veja a Extenso SPL.
Nota:
Usurio das verses 5.5, e superiores do PHP tambm podem dar uma olhada nos geradores, que
fornecem uma alternativa ao uso de iteradores.
Iterao de ObjetosPHP Manual
Classes e Objetos
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
fi
22/07/2016
Classes e Objetos
Pgina 34 de 45
Mtodos Mgicos
Mtodos Mgicos
Os nomes de funo __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep
(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() e __debugInfo() so mgicos nas classes do PHP.
No deve-se ter funes com esses nomes em nenhuma de suas classes a no ser que queira a funcionalidade mgica
associada a eles.
Cuidado
O PHP reserva todas as funes com nomes iniciadas com __ como mgicas. recomendado que no se utilize
funes com nomes com __ no PHP, a no ser que deseje-se alguma funcionalidade mgica documentada.
__sleep() e __wakeup()
public array __sleep ( void )
void __wakeup ( void )
serialize() checa se sua classe tem uma funo com o nome mgico __sleep(). Se houver, a funo executa antes de
qualquer serializao. Ela pode limpar o objeto e deve retornar um array com os nomes de todas as variveis do
objeto que devem ser serializadas. Se o mtodo no retornar nada, ento NULL serializado e um E_NOTICE disparado.
Nota:
No possvel que __sleep() retorne nomes de propriedades privadas da classe pai. Fazer isso causar
um erro de nvel E_NOTICE. Ao invs disso, pode-se utilizar a interface Serializable.
O intuito do mtodo __sleep() enviar dados pendentes ou realizar tarefas de limpeza. Alm disso, a funo til se
tiver objetos muito grandes que no precisem ser completamente salvos.
Ao mesmo tempo, unserialize() checa pela presena da funo com o nome mgico __wakeup(). Se presente, essa
funo pode reconstruir qualquer recurso que o objeto possa ter.
O intuito do mtodo __wakeup() reestabelecer qualquer conexo com banco de dados que podem ter sido perdidas
durante a serializao, e realizar outras tarefas de reinicializao.
Exemplo #1 Sleep e wakeup
<?php
class Connection
{
protected $link;
private $dsn, $username, $password;
public function __construct($dsn, $username, $password)
{
$this->dsn = $dsn;
$this->username = $username;
$this->password = $password;
$this->connect();
}
private function connect()
{
$this->link = new PDO($this->dsn, $this->username, $this->password);
}
public function __sleep()
{
return array('dsn', 'username', 'password');
}
}?>
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 35 de 45
__toString()
public string __toString ( void )
O mtodo __toString() permite que uma classe decida como se comportar quando convertida para uma string. Por
exemplo, o que echo $obj; ir imprimir. Este mtodo precisa retornar uma string, seno um erro nvel
E_RECOVERABLE_ERROR gerado.
Aviso
Voc no pode lanar uma exceo de dentro do mtodo __toString(). Fazer isso resultar em um erro fatal.
Exemplo #2 Exemplo Simples
<?php
// Declare a simple class
class TestClass
{
public $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
public function __toString()
{
return $this->foo;
}
}
$class = new TestClass('Hello');
echo $class;
?>
Vale lembrar que antes do PHP 5.2.0 o mtodo __toString() s era chamado quando combinado diretamente com
echo ou print. Desde o PHP 5.2.0, ele chamado no contexto de string (e.g. em printf() com modificador %s) mas
no em outros tipos de contextos (e.g. como modificador %d). Desde o PHP 5.2.0, converter objetos sem o mtodo
__toString() para string causar E_RECOVERABLE_ERROR.
__invoke()
mixed __invoke ([ $... ] )
O mtodo __invoke() chamado quando um script tenta chamar um objeto como uma funo.
Nota:
Esta funcionalidade esta disponvel desde o PHP 5.3.0.
Exemplo #3 Usando __invoke()
<?php
class CallableClass
{
public function __invoke($x)
{
var_dump($x);
}
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 36 de 45
int(5)
bool(true)
__set_state()
static object __set_state ( array $properties )
Esse mtodo esttico chamado em classes exportadas por var_export() desde PHP 5.1.0.
O nico parmetro deste mtodo um array contendo propriedades exportadas no formato array('property' => value,
...).
Exemplo #4 Usando __set_state() (desde o PHP 5.1.0)
<?php
class A
{
public $var1;
public $var2;
public static function __set_state($an_array) // As of PHP 5.1.0
{
$obj = new A;
$obj->var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
}
}
$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';
eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array(
//
'var1' => 5,
//
'var2' => 'foo',
// ));
var_dump($b);
?>
__debugInfo()
array __debugInfo ( void )
Este mtodo chamado pela funo var_dump() ao despejar um objeto para obter as propriedades que devem ser
exibidas. Se este mtodo no for definido em um objeto, todos as propriedades pblicas, protegidas e provadas sero
exibidas.
Este recurso foi adicionado no 5.6.0.
Exemplo #5 Utilizando o __debugInfo()
<?php
class C {
private $prop;
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 37 de 45
var_dump(new C(42));
?>
Clonando obje
final
O PHP 5 introduz a palavra-chave final, que previne que classes filhas sobrescrevam um mtodo que esteja prefixado
sua definio com final. Se a prpria classe estiver definida como final, ela no pode ser estendida.
Exemplo #1 Exemplo de mtodos final
<?php
class ClasseBase {
public function teste() {
echo "ClasseBase::teste() chamado\n";
}
Nota: Propriedades no podem ser declaradas como finais, apenas classes e mtodos.
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
finalPHP Manual
Classes e Objetos
Clonando objetos
Pgina 38 de 45
Comparando obje
Clonando objetos
Criar uma cpia de um objeto com propriedades totalmente replicadas nem sempre o comportamento desejado. Um
bom exemplo da necessidade para cpia de construtores, e quando possuir um objeto que representa uma janela do
GTK e o objeto guarda o recurso dessa janela GTK. ao criar uma duplicata, pode-se desejar a criao de uma nova
janela com as mesmas propriedades e fazer o novo objeto guardar o recurso da nova janela. Outro exemplo se seu
objeto guarda uma referncia a outro objeto que usa e ao replicar o objeto pai, deseja-se que seja criada uma nova
instncia desse outro objeto para que a rplica tenha sua prpria cpia separada.
Uma cpia de objeto criada usando a palavra-chave clone (que, se possvel, chama o mtodo __clone() do objeto).
O mtodo __clone() de um objeto no pode ser chamado diretamente.
$copia_do_objeto = clone $objeto;
Ao se clonar um objeto, o PHP 5 far uma cpia superficial de todas as propriedades do objeto. Qualquer propriedade
que seja referncia a outra varivel, permanecer como referncia.
void __clone ( void )
Depois que a clonagem se completa, se um mtodo __clone() estiver definido, o objeto recm criado ter seu mtodo
__clone() chamado, permitindo que qualquer propriedade seja alterada.
Exemplo #1 Clonando um objeto
<?php
class SubObject
{
static $instances = 0;
public $instance;
public function __construct() {
$this->instance = ++self::$instances;
}
class MyCloneable
{
public $object1;
public $object2;
function __clone()
{
// Force a copy of this->object, otherwise
// it will point to same object.
$this->object1 = clone $this->object1;
}
}
$obj = new MyCloneable();
$obj->object1 = new SubObject();
$obj->object2 = new SubObject();
$obj2 = clone $obj;
print("Original Object:\n");
print_r($obj);
print("Cloned Object:\n");
print_r($obj2);
?>
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 39 de 45
Type Hinti
Comparando objetos
Ao usar o operador de comparao (==), as variveis dos objetos so comparadas de maneira simples, nominalmente:
Duas instncias de objetos so iguais se possuem os mesmos atributos e valores, e so instncias da mesma classe.
Ao usar o operador de identidade (===), as variveis dos objetos sero idnticas, se e somente se, referirem a mesma
instncia da mesma classe.
Um exemplo evidenciar essas regras.
Exemplo #1 Exemplo de comparao de objetos no PHP 5
<?php
function bool2str($bool)
{
if ($bool === false) {
return 'FALSO';
} else {
return 'VERDADEIRO';
}
}
function
{
echo
echo
echo
echo
}
compareObjects(&$o1, &$o2)
'o1
'o1
'o1
'o1
"\n";
"\n";
. "\n";
. "\n";
class Flag
{
public $flag;
function Flag($flag = true) {
$this->flag = $flag;
}
}
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 40 de 45
class OtherFlag
{
public $flag;
}
$o
$p
$q
$r
new Flag();
new Flag();
$o;
new OtherFlag();
Nota:
Extenses podem definir suas prprias regras para comparar de objetos (==).
Comparando objetosPHP Manual
Classes e Objetos
Type Hinting
Type Hinting
Esta documentao foi movida para a referncia de funes.
Type HintingPHP Manual
Classes e Objetos
Late Static Bindings
Objetos e Refernc
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 41 de 45
hierarquia de classes, forward_static_call(). A funo get_called_class() pode ser utilizada para recuperar uma string
com o nome da classe chamada e static:: introduz seu escopo.
Esse recurso foi chamado de "late static bindings" de uma perspectiva interna em mente. "Late binding" vem do fato
que static:: no ser resolvido usando a classe onde o mtodo foi definido, mas computada utilizando informaes em
tempo de execuo. tambm chamado "static binding" pois pode ser utilizado em (mas no limitado a) chamadas de
mtodos estticos.
Limitaes do self::
Referncias estticas para a atual classe como self:: ou __CLASS__ so resolvidas usando a classe na qual a funo
pertence, como onde ele foi definido:
Exemplo #1 Uso do self::
<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
self::who();
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();
?>
Nota:
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 42 de 45
Em contextos no estticos a classe chamada ser a classe da instncia do objeto. Assim como $this->
chamar mtodos privados do mesmo escopo, utilizar static:: pode ter resultados diferentes. Outra
diferena que static:: s pode referenciar propriedades estticas.
Exemplo #3 Uso do static:: em um contexto no-esttico
<?php
class A {
private function foo() {
echo "success!\n";
}
public function test() {
$this->foo();
static::foo();
}
}
class B extends A {
/* foo() ser copiado para B, assim seu escopo ainda ser A e
* e a chamada funcionar */
}
class C extends A {
private function foo() {
/* mtodo original foi substitudo, escopo agora C */
}
}
$b = new B();
$b->test();
$c = new C();
$c->test();
//fails
?>
Nota:
As resolues de Late static bindings terminaro quando a chamada realizada sem retorno. Por outro
lado chamadas estticas utilizando instrues como parent:: ou self:: iro repassar a informao do
chamador.
Exemplo #4 Chamadas repassadas e no repassadas
<?php
class A {
public static function foo() {
static::who();
}
public static function who() {
echo __CLASS__."\n";
}
}
class B extends A {
public static function test() {
A::foo();
parent::foo();
self::foo();
}
public static function who() {
echo __CLASS__."\n";
}
}
class C extends B {
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 43 de 45
Objetos e Referncias
Um dos pontos fortes frequentemente mencionado da POO no PHP 5, que "objetos so passados por referncias por
padro". Isto no completamente verdade. Esta seo retifica esse pensamento comum usando alguns exemplos.
Uma referncia do PHP um sinnimo, que permite duas variveis diferentes escreverem para o mesmo valor. A
partir do PHP 5, uma varivel objeto no contm mais o prprio objeto como valor. Ela contm um identificador do
objeto que permite que os acessadores do objeto encontrem o objeto real. Quando um objeto enviado por
argumento, retornado ou atribudo a outra varivel, as variveis diferentes no so sinnimos: elas armazenam uma
cpia do identificador, que aponta para o mesmo objeto.
Exemplo #1 Referncias e Objetos
<?php
class A {
public $foo = 1;
}
$a = new A;
$b = $a;
$b->foo = 2;
echo $a->foo."\n";
$c = new A;
$d = &$c;
// $c e $d so referncias
// ($c,$d) = <id>
$d->foo = 2;
echo $c->foo."\n";
$e = new A;
function foo($obj) {
// ($obj) = ($e) = <id>
$obj->foo = 2;
}
foo($e);
echo $e->foo."\n";
?>
Log de modificaes da PO
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016
Classes e Objetos
Pgina 44 de 45
// page1.php:
include("classa.inc");
$a = new A;
$s = serialize($a);
// store $s somewhere where page2.php can find it.
file_put_contents('store', $s);
// page2.php:
// this is needed for the unserialize to work properly.
include("classa.inc");
$s = file_get_contents('store');
$a = unserialize($s);
// now use the function show_one() of the $a object.
$a->show_one();
?>
Se uma aplicao estiver usando sesses e usar a funo session_register() para registrar objetos, estes sero
serializados automaticamente ao fim de cada pgina PHP, e sero deserializados automaticamente em cada uma das
pginas seguintes. Isso significa que estes objetos podem aparecer em qualquer uma das pginas da aplicao, j que
fazem parte da sesso. Entretanto, a funo session_register() foi removida no PHP 5.4.0.
fortemente recomendado que, quando uma aplicao serializa seus objetos, para uso posterior na aplicao, esta
inclua a definio da classe do objeto em questo ao longo de toda aplicao. No fazer isso pode resultar em objetos
serem deserializados sem a definio da classe, que acarretar no PHP entregar um objeto da classe
__PHP_Incomplete_Class_Name, que no possui mtodos, tornando o objeto intil.
Ento, se, no exemplo anterior, $a se tornou parte da sesso ao executar session_register("a"), deve-se incluir o
arquivo classa.inc em todas suas pginas, e no somente em page1.php e page2.php.
Alm dos conselhos acima, note que pode-se capturar os eventos de serializao e deserializao de um objeto usando
os mtodos __sleep() e __wakeup(). Usar o mtodo __sleep() tambm lhe permitir serializar somente subconjuntos
de propriedades de um objeto.
Serializao de Objetos - objetos em sessoPHP Manual
Classes e Objetos
Log de modificaes da POO
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
Namespac
22/07/2016
Classes e Objetos
Pgina 45 de 45
5.3.0
5.3.0
5.3.0
5.3.0
5.3.0
5.2.0
5.1.3
5.1.0
5.1.0
Descrio
Adicionado: finally para manipular excees.
Adicionado: traits.
Modificado: Se uma classe abstrata define uma assinatura para o construtor, agora se tornar obrigatrio.
Modificado: Mtodos com o mesmo nome que o ltimo elemento de uma classe com namespace no sero
mais tratados como um construtor. Esta modificao no afeta classes sem namespace.
Modificado: Classes que implementam interfaces com mtodos que possuem valores padres em seus
prottipos, no so mais obrigadas a seguir os valores padres das interfaces.
Modificado: possvel agora referenciar classes utilizando uma varivel (por exemplo, echo
$classname::constant;). O valor da varivel no pode ser uma palavra-chave (por exemplo, self, parent or
static).
Modificado: Um erro de nvel E_WARNING ser emitido se os mtodos mgicos de sobrecarga forem
declarados como estticos. Tambm fora a exigncia da visibilidade pblica.
Modificado: Em verses anteriores ao PHP 5.3.0, excees disparadas na funo __autoload() no podem
ser capturadas no bloco catch, e resultaro em um erro fatal. Agora, excees lanadas na funo __autoload
podem ser capturadas no bloco catch, com uma condio. Se estiver disparando uma exceo customizada, a
classe de customizao da exceo deve estar disponvel. A funo __autoload pode ser usado
recursivamente para carregar automaticamente a classe de customizao de exceo.
Adicionado: O mtodo __callStatic.
Adicionado: Suporte ao heredoc e nowdoc nas definies de constantes e propriedades. Nota: valores
heredoc devem seguir a mesma regra que strings com aspas duplas (e.g., sem variveis dentro).
Adicionado: Late Static Bindings.
Adicionado: O mtodo __invoke().
Modificado: O mtodo __toString() era chamado somente quando combinada diretamente com echo or print.
Agora, chamado em qualquer contexto de string (isto , na funo ) printf() com o modificador %s) Desde
o PHP 5.2.0, converter objetos que no possuem o mtodo __toString para string emitir um erro de nvel
E_RECOVERABLE_ERROR.
Modificado: Em verses anteriores do PHP 5, o uso de var era considerado obsoleto e emitir um erro de
nvel E_STRICT. No mais obsoleto, portanto no emite o erro.
Modificado: O mtodo esttico __set_state() agora chamado por classes exportadas com a funo
var_export().
Adicionado: Os mtodos __isset() e __unset().
file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm
22/07/2016