Você está na página 1de 45

Classes e Objetos

Funes anonimasPHP Manual


Referncia da Linguagem
Classes e Objetos

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

Classes e ObjetosPHP Manual


Classes e Objetos
Introduo

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();
?>

O exemplo acima ir imprimir:


$this est definida (A)
$this no est definida.

file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm

22/07/2016

Classes e Objetos

Pgina 3 de 45

$this est definida (B)


$this no est definida.

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;

$instance->var = '$assigned ter esse valor';


$instance = null; // $instance e $reference tornam-se nulos
var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>

O exemplo acima ir imprimir:


NULL
NULL
object(SimpleClass)#1 (1) {
["var"]=>
string(30) "$assigned ter esse valor"
}

O PHP 5.3.0 introduziu algumas novas formas de criar instncias de um objeto:


Exemplo #5 Criando novos objetos
<?php
class Test
{
static public function getNew()
{
return new static;
}
}
class Child extends Test
{}
$obj1 = new Test();

file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm

22/07/2016

Classes e Objetos

Pgina 4 de 45

$obj2 = new $obj1;


var_dump($obj1 !== $obj2);
$obj3 = Test::getNew();
var_dump($obj3 instanceof Test);
$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);
?>

O exemplo acima ir imprimir:


bool(true)
bool(true)
bool(true)

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;

O exemplo acima ir imprimir:


propriedade
mtodo

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;

public function __construct() {


$this->bar = function() {
return 42;
};
}

$obj = new Foo();


// a partir do PHP 5.3.0:
$func = $obj->bar;
echo $func(), PHP_EOL;
// alternativamente, a partir do PHP 7.0.0:
echo ($obj->bar)(), PHP_EOL;

O exemplo acima ir imprimir:


42

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();
?>

O exemplo acima ir imprimir:


Classe Herdeira
um valor padro

::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;
}
?>

O exemplo acima ir imprimir:


NS\ClassName

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
?>

Exemplo #2 Exemplo com informao esttica


<?php
class foo {
// A partir
const BAR =
bar
EOT;
// A partir
const BAZ =
baz
EOT;
}
?>

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 #2 Outro exemplo de Autoload


Este exemplo tenta carregar a interface ITest.
<?php
spl_autoload_register(function ($name) {
var_dump($name);
});
class Foo implements ITest {
}
/*
string(5) "ITest"
Fatal error: Interface 'ITest' not found in ...
*/
?>

Exemplo #3 Autoload com manipulao de excees no PHP 5.3.0+


Este exemplo lanar uma exceo e demonstrar o bloco try/catch.
<?php
spl_autoload_register(function ($name) {
echo "Want to load $name.\n";
throw new Exception("Unable to load $name.");
});
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>

O exemplo acima ir imprimir:


Want to load NonLoadableClass.
Unable to load NonLoadableClass.

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";
}
?>

O exemplo acima ir imprimir:


Want to load NonLoadableClass.
Want to load MissingException.
Fatal error: Class 'MissingException' not found in testMissingException.php on line 4

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

Exemplo #2 Construtores em classes dentro de namespace


<?php
namespace Foo;
class Bar {
public function Bar() {
// tratado como construtor no PHP 5.3.0-5.3.2
// tratado como mtodo comum a partir do PHP 5.3.3
}
}
?>

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

// Declara um mtodo public


public function MeuPublico() { }
// Declara um mtodo protected
protected function MeuProtegido() { }
// Declara um mtodo private
private function MeuPrivado() { }

// Esse public
function Foo()
{
$this->MeuPublico();
$this->MeuProtegido();
$this->MeuPrivado();
}

$minhaclasse = new MinhaClasse;


$minhaclasse->MeuPublico(); // Funciona
$minhaclasse->MeuProtegido(); // Erro Fatal
$minhaclasse->MeuPrivado(); // Erro Fatal
$minhaclasse->Foo(); // Public, Protected e Private funcionam
/**
* Define MinhaClasse2
*/
class MinhaClasse2 extends MinhaClasse
{
// Esse public
function Foo2()
{
$this->MeuPublico();
$this->MeuProtegido();
$this->MeuPrivado(); // Erro Fatal
}
}
$minhaclasse2 = new MinhaClasse2;
$minhaclasse2->MeuPublico(); // Funciona
$minhaclasse2->Foo2(); // Public e Protected funcionam, Private no
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>

file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm

22/07/2016

Classes e Objetos

Pgina 14 de 45

Visibilidade de outros objetos


Objetos do mesmo tipo tero acesso a outros mementos privados e protegidos mesmo que no sejam da mesma
instncia. Isso acontece por que os detalhes especficos de implementao j so conhecidos dentro destes objetos.
Exemplo #3 Acessando membros privados entre objetos do mesmo tipo
<?php
class Test
{
private $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
private function bar()
{
echo 'Acessou o mtodo privado.';
}
public function baz(Test $other)
{
// Pode-se alterar a propriedade privada:
$other->foo = 'hello';
var_dump($other->foo);
// Pode-se chamar mtodo privado:
$other->bar();
}

$test = new Test('test');


$test->baz(new Test('other'));
?>

O exemplo acima ir imprimir:


string(5) "hello"
Acessou o mtodo privado.

VisibilidadePHP Manual
Classes e Objetos
Herana de Objetos=

Operador de Resoluo de Escopo

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

public function printItem($string)


{
echo 'Foo: ' . $string . PHP_EOL;
}
public function printPHP()
{
echo 'PHP is great.' . PHP_EOL;
}
}
class Bar extends Foo
{
public function printItem($string)
{
echo 'Bar: ' . $string . PHP_EOL;
}
}
$foo = new Foo();
$bar = new Bar();
$foo->printItem('baz');
$foo->printPHP();
$bar->printItem('baz');
$bar->printPHP();

//
//
//
//

Output:
Output:
Output:
Output:

'Foo: baz'
'PHP is great'
'Bar: baz'
'PHP is great'

?>

Herana de Objetos=PHP Manual


Classes e Objetos
Operador de Resoluo de Escopo (::)

Palavra-Chave 'sta

Operador de Resoluo de Escopo (::)


O Operador de Resoluo de Escopo (tambm chamado de Paamayim Nekudotayim), ou em termos mais simples,
dois pontos duplo, um smbolo que permite acesso a mtodos ou propriedades estticas, constantes, e
sobrecarregadas de uma classe.
Ao referenciar estes itens fora da definio da classe, use o nome da classe.
A partir do PHP 5.3.0, possvel referenciar o nome da classe usando uma varivel. O valor da varivel no pode ser
uma palavra-chave (por exemplo, self, parent e static).
Paamayim Nekudotayim pode parecer, de incio, uma escolha estranha para chamar dois pontos duplo. No entanto, na
hora de escrever a Zend Engine 0.5 (que provia o PHP 3), foi o que a equipe da Zend decidiu. Realmente significa
dois pontos duplo - em Hebreu!
Exemplo #1 :: de fora da definio da classe
<?php
class MyClass {
const CONST_VALUE = 'Um valor constante';
}
$classname = 'MyClass';
echo $classname::CONST_VALUE; // A partir do PHP 5.3.0
echo MyClass::CONST_VALUE;
?>

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

echo parent::CONST_VALUE . "\n";


echo self::$my_static . "\n";

}
$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();
?>

Veja tambm outros exemplos de chamadas estticas mais complexas.


Operador de Resoluo de Escopo (::)PHP Manual
Classes e Objetos
Palavra-Chave 'static'

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';

public function valorEstatico() {


return self::$meu_estatico;
}

class Bar extends Foo


{
public function fooEstatico() {
return parent::$meu_estatico;
}
}
print Foo::$meu_estatico . "\n";
$foo = new Foo();
print $foo->valorEstatico() . "\n";
print $foo->$meu_estatico . "\n";

// "Propriedade" Indefinida $meu_estatico

print $foo::$meu_estatico . "\n";


$classname = 'Foo';
print $classname::$meu_estatico . "\n"; // No PHP 5.3.0
print Bar::$meu_estatico . "\n";
$bar = new Bar();
print $bar->fooEstatico() . "\n";
?>

Palavra-Chave 'static'PHP Manual


Classes e Objetos
Abstrao de Classes

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();
}

class ClasseConcreta1 extends ClasseAbstrata


{
protected function pegarValor() {
return "ClasseConcreta1";
}

public function valorComPrefixo( $prefixo ) {


return "{$prefixo}ClasseConcreta1";
}

class ClasseConcreta2 extends ClasseAbstrata


{
protected function pegarValor() {
return "ClasseConcreta2";
}

public function valorComPrefixo( $prefixo ) {


return "{$prefixo}ClasseConcreta2";
}

$classe1 = new ClasseConcreta1;


$classe1->imprimir();
echo $classe1->valorComPrefixo('FOO_') ."\n";
$classe2 = new ClasseConcreta2;
$classe2->imprimir();
echo $classe2->valorComPrefixo('FOO_') ."\n";
?>

O exemplo acima ir imprimir:


ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2

Exemplo #2 Exemplo de classe abstrata


<?php
abstract class ClasseAbstrata
{

file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm

22/07/2016

Classes e Objetos

Pgina 19 de 45

// Esse mtodo abstrato apenas define os argumentos requeridos


abstract protected function prefixName($name);
}
class ClasseConcreta extends ClasseAbstrata
{

// O mtodo filho pode definir argumentos opcionais no presentes na assitura abstrata


public function prefixName($name, $separator = ".") {
if ($name == "Pacman") {
$prefix = "Mr";
} elseif ($name == "Pacwoman") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return "{$prefix}{$separator} {$name}";
}

$class = new ClasseConcreta;


echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>

O exemplo acima ir imprimir:


Mr. Pacman
Mrs. Pacwoman

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();

}
?>

public function setVariable($name, $var)


{
$this->vars[$name] = $var;
}

Exemplo #2 Interfaces estendveis


<?php
interface a
{
public function foo();
}
interface b extends a
{
public function baz(Baz $baz);
}
// Isto ir funcionar
class c implements b
{
public function foo()
{
}
public function baz(Baz $baz)

file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm

22/07/2016

Classes e Objetos

Pgina 21 de 45

{
}

// Isto no ir funcionar e resultar em um erro fatal


class d implements b
{
public function foo()
{
}
public function baz(Foo $foo)
{
}
}
?>

Exemplo #3 Interface com herana mltipla


<?php
interface a
{
public function foo();
}
interface b
{
public function bar();
}
interface c extends a, b
{
public function baz();
}
class d implements c
{
public function foo()
{
}
public function bar()
{
}
public function baz()
{
}
}
?>

Exemplo #4 Interfaces com constantes


<?php
interface a
{
const b = 'Interface constant';
}
// Imprime: Interface constant
echo a::b;
// Isto no funcionar porque no permitido
// sobreescrever constantes.
class b implements a
{
const b = 'Class constant';
}
?>

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();
?>

O exemplo acima ir imprimir:

file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm

22/07/2016

Classes e Objetos

Pgina 23 de 45

Hello World!

Exemplo #3 Alternate Precedence Order Example


<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}
class TheWorldIsNotEnough {
use HelloWorld;
public function sayHello() {
echo 'Hello Universe!';
}
}
$o = new TheWorldIsNotEnough();
$o->sayHello();
?>

O exemplo acima ir imprimir:


Hello Universe!

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();
?>

O exemplo acima ir imprimir:


Hello World!

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

Exemplo #5 Conflict Resolution


In this example, Talker uses the traits A and B. Since A and B have conflicting methods, it defines to use the variant
of smallTalk from trait B, and the variant of bigTalk from trait A.
The Aliased_Talker makes use of the as operator to be able to use B's bigTalk implementation under an additional
alias talk.
<?php
trait A {
public function smallTalk() {
echo 'a';
}
public function bigTalk() {
echo 'A';
}
}
trait B {
public function smallTalk() {
echo 'b';
}
public function bigTalk() {
echo 'B';
}
}
class Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
}
}
class Aliased_Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
B::bigTalk as talk;
}
}
?>

Changing Method Visibility


Using the as syntax, one can also adjust the visibility of the method in the exhibiting class.
Exemplo #6 Changing Method Visibility
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}
// Change visibility of sayHello
class MyClass1 {
use HelloWorld { sayHello as protected; }
}
// Alias method with changed visibility
// sayHello visibility not changed
class MyClass2 {
use HelloWorld { sayHello as private myPrivateHello; }
}
?>

Traits Composed from Traits


Just as classes can make use of traits, so can other traits. By using one or more traits in a trait definition, it can be
composed partially or entirely of the members defined in those other traits.

file:///C:/Users/william.carriello.INTRANET/AppData/Local/Temp/~hh3D9C.htm

22/07/2016

Classes e Objetos

Pgina 25 de 45

Exemplo #7 Traits Composed from Traits


<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
}
trait World {
public function sayWorld() {
echo 'World!';
}
}
trait HelloWorld {
use Hello, World;
}
class MyHelloWorld {
use HelloWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
?>

O exemplo acima ir imprimir:


Hello World!

Abstract Trait Members


Traits support the use of abstract methods in order to impose requirements upon the exhibiting class.
Exemplo #8 Express Requirements by Abstract Methods
<?php
trait Hello {
public function sayHelloWorld() {
echo 'Hello'.$this->getWorld();
}
abstract public function getWorld();
}
class MyHelloWorld {
private $world;
use Hello;
public function getWorld() {
return $this->world;
}
public function setWorld($val) {
$this->world = $val;
}
}
?>

Static Trait Members


Traits can define both static members and static methods.
Exemplo #9 Static Variables
<?php
trait Counter {
public function inc() {
static $c = 0;
$c = $c + 1;
echo "$c\n";
}
}

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
?>

Exemplo #10 Static Methods


<?php
trait StaticExample {
public static function doSomething() {
return 'Doing something';
}
}
class Example {
use StaticExample;
}
Example::doSomething();
?>

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;

O exemplo acima ir imprimir:


object(class@anonymous)#1 (1) {
["Command line code0x104c5b612":"class@anonymous":private]=>
int(10)
}

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;

public function func3()


{
return $this->prop2 + $this->prop3 + $this->func1();
}

echo (new Outer)->func2()->func3();

O exemplo acima ir imprimir:


6

Classes annimasPHP Manual


Classes e Objetos
Sobrecarga

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

__unset() invocado ao usar o construtor unset() em propriedades inacessveis.


O argumento $name o nome da propriedade com o qual se est interagindo. O argumento $value do mtodo __set()
especifica o valor para o qual a propriedade $name deveria ser definida.
A sobrecarga de propriedades funciona somente no contexto de objeto. Estes mtodos mgicos no so disparados em
contexto esttico. Portanto estes mtodos no podem ser declarados como static. A partir do PHP 5.3.0, um aviso
emitido se algum mtodo mgico de sobrecarga declarado como static.
Nota:
O valor de retorno de __set() ignorado por causa da forma que o PHP processa o operador de
atribuio. Similarmente, o mtodo __get() nunca chamado em atribuies encadeadas como essa:
$a = $obj->b = 8;

Exemplo #1 Sobrecarregando propriedades com __get(), __set(), __isset() and __unset()


<?php
class PropertyTest
{
/** Location for overloaded data.
private $data = array();

*/

/** Overloading not used on declared properties.


public $declared = 1;

*/

/** Overloading only used on this when accessed outside the class.
private $hidden = 2;

*/

public function __set($name, $value)


{
echo "Setting '$name' to '$value'\n";
$this->data[$name] = $value;
}
public function __get($name)
{
echo "Getting '$name'\n";
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
$trace = debug_backtrace();
trigger_error(
'Undefined property via __get(): ' . $name .
' in ' . $trace[0]['file'] .
' on line ' . $trace[0]['line'],
E_USER_NOTICE);
return null;
}
/** As of PHP 5.1.0 */
public function __isset($name)
{
echo "Is '$name' set?\n";
return isset($this->data[$name]);
}
/** As of PHP 5.1.0 */
public function __unset($name)
{
echo "Unsetting '$name'\n";
unset($this->data[$name]);
}

/** Not a magic method, just here for example.


public function getHidden()
{
return $this->hidden;
}

*/

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
?>

"Let's experiment with the private property named 'hidden':\n";


"Privates are visible inside the class, so __get() not used...\n";
$obj->getHidden() . "\n";
"Privates not visible outside of class, so __get() is used...\n";
$obj->hidden . "\n";

O exemplo acima ir imprimir:


Setting 'a' to '1'
Getting 'a'
1
Is 'a' set?
bool(true)
Unsetting 'a'
Is 'a' set?
bool(false)
1
Let's experiment with the private property named 'hidden':
Privates are visible inside the class, so __get() not used...
2
Privates not visible outside of class, so __get() is used...
Getting 'hidden'
Notice:

Undefined property via __get(): hidden in <file> on line 70 in <file> on line 29

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

O exemplo acima ir imprimir:


Calling object method 'runTest' in object context
Calling static method 'runTest' in static context

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();
?>

O exemplo acima ir imprimir:


var1 => value 1
var2 => value 2
var3 => value 3
MyClass::iterateVisible:
var1 => value 1
var2 => value 2
var3 => value 3
protected => protected var
private => private var

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

Exemplo #2 Iterao de Objeto implementando Iterator


<?php
class MyIterator implements Iterator
{
private $var = array();
public function __construct($array)
{
if (is_array($array)) {
$this->var = $array;
}
}
public function rewind()
{
echo "rewinding\n";
reset($this->var);
}
public function current()
{
$var = current($this->var);
echo "current: $var\n";
return $var;
}
public function key()
{
$var = key($this->var);
echo "key: $var\n";
return $var;
}
public function next()
{
$var = next($this->var);
echo "next: $var\n";
return $var;
}
public function valid()
{
$key = key($this->var);
$var = ($key !== NULL && $key !== FALSE);
echo "valid: $var\n";
return $var;
}
}
$values = array(1,2,3);
$it = new MyIterator($values);
foreach ($it as $a => $b) {
print "$a: $b\n";
}
?>

O exemplo acima ir imprimir:


rewinding
valid: 1
current: 1
key: 0
0: 1
next: 2
valid: 1
current: 2
key: 1
1: 2
next: 3
valid: 1
current: 3
key: 2
2: 3

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);
}

public function add($value) {


$this->items[$this->count++] = $value;
}

$coll = new MyCollection();


$coll->add('value 1');
$coll->add('value 2');
$coll->add('value 3');
foreach ($coll as $key => $val) {
echo "key/value: [$key -> $val]\n\n";
}
?>

O exemplo acima ir imprimir:


rewinding
current: value 1
valid: 1
current: value 1
key: 0
key/value: [0 -> value 1]
next: value 2
current: value 2
valid: 1
current: value 2
key: 1
key/value: [1 -> value 2]
next: value 3
current: value 3
valid: 1
current: value 3
key: 2
key/value: [2 -> value 3]
next:
current:
valid:

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');
}

}?>

public function __wakeup()


{
$this->connect();
}

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;
?>

O exemplo acima ir imprimir:


Hello

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));
?>

O exemplo acima ir imprimir:

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);
?>

O exemplo acima ir imprimir:


object(A)#2 (2) {
["var1"]=>
int(5)
["var2"]=>
string(3) "foo"
}

Nota: Quando exportando um objeto, var_export() no verifica se __set_state() est implementado na


classe do objeto, de forma que re-importar esses objetos falham na ausncia de __set_state(). Isto afeta
particularmente algumas classes internas. responsabilidade do programador verificar se todos os
objetos podem ser re-importados, ou seja, que todas as classes implementem __set_state().

__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

public function __construct($val) {


$this->prop = $val;
}

public function __debugInfo() {


return [
'propSquared' => $this->prop ** 2,
];
}

var_dump(new C(42));
?>

O exemplo acima ir imprimir:


object(C)#1 (1) {
["propSquared"]=>
int(1764)
}

Mtodos MgicosPHP Manual


Classes e Objetos
final

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";
}

final public function maisTeste() {


echo "ClasseBase::maisTeste() chamado\n";
}

class ClasseFilha extends ClasseBase {


public function maisTeste() {
echo "ClasseFilha::maisTeste() called\n";
}
}
// Resulta em erro Fatal: No pode sobrescrever mtodo final ClasseBase::maisTeste()
?>

Exemplo #2 Exemplo de classe Final


<?php
final class ClasseBase {
public function teste() {
echo "Mtodo ClasseBase::teste() chamado\n";
}
// Aqui no importa se voc especificar a funo como Final ou no
final public function maisTeste() {
echo "Mtodo ClasseBase::maisTeste() chamado\n";
}
}
class ClasseFilha extends ClasseBase {
}
// Resulta em erro Fatal: A classe ClasseFilha no pode herdar de uma classe Final (ClasseBase)
?>

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;
}

public function __clone() {


$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

O exemplo acima ir imprimir:


Original Object:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 1
)
[object2] => SubObject Object
(
[instance] => 2
)
)
Cloned Object:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 3
)
[object2] => SubObject Object
(
[instance] => 2
)
)

Clonando objetosPHP Manual


Classes e Objetos
Comparando objetos

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

== o2 : ' . bool2str($o1 == $o2) .


!= o2 : ' . bool2str($o1 != $o2) .
=== o2 : ' . bool2str($o1 === $o2)
!== o2 : ' . bool2str($o1 !== $o2)

"\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

function OtherFlag($flag = true) {


$this->flag = $flag;
}
=
=
=
=

new Flag();
new Flag();
$o;
new OtherFlag();

echo "Duas instncias da mesma classe\n";


compareObjects($o, $p);
echo "\nDuas referncias para a mesma instncia\n";
compareObjects($o, $q);
echo "\nInstncias de duas classes diferentes\n";
compareObjects($o, $r);
?>

O exemplo acima ir imprimir:


Duas instncias da mesma classe
o1 == o2 : VERDADEIRO
o1 != o2 : FALSO
o1 === o2 : FALSO
o1 !== o2 : VERDADEIRO
Duas referncias para a mesma instncia
o1 == o2 : VERDADEIRO
o1 != o2 : FALSO
o1 === o2 : VERDADEIRO
o1 !== o2 : FALSO
Instncias de duas classes diferentes
o1 == o2 : FALSO
o1 != o2 : VERDADEIRO
o1 === o2 : FALSO
o1 !== o2 : VERDADEIRO

Nota:
Extenses podem definir suas prprias regras para comparar de objetos (==).
Comparando objetosPHP Manual
Classes e Objetos
Type Hinting

Late Static Bindin

Type Hinting
Esta documentao foi movida para a referncia de funes.
Type HintingPHP Manual
Classes e Objetos
Late Static Bindings

Objetos e Refernc

Late Static Bindings


A partir do PHP 5.3.0, o PHP implementa um recurso chamado late static bindings que pode ser usado para
referenciar a classe chamada no contexto de herana esttica.
Mais precisamente, late static bindings funcionam atravs do armazenamento do nome da classe na ltima "chamada
no encaminhadas". No caso de chamadas a mtodos estticos, a classe explicitamente chamada (normalmente o
nome a esquerda do operador ::); no caso de chamadas a mtodos no estticos, o nome da classe do objeto. Uma
"chamada encaminhada" quela esttica, realizada pelos prefixos self::, parent::, static::, ou, se subindo na

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();
?>

O exemplo acima ir imprimir:


A

Uso de Late Static Bindings


Late static bindings tenta resolver a limitao introduzindo uma palavra-chave que referencia a classe que foi
inicialmente chamada em tempo de execuo. Basicamente, uma palavra-chave que permite referenciar B em test(),
no exemplo anterior. Foi decidido no introduzir uma nova palavra-chave, mas usar static, j reservada.
Exemplo #2 Simples uso do static::
<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who(); // Here comes Late Static Bindings
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();
?>

O exemplo acima ir imprimir:


B

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
?>

O exemplo acima ir imprimir:


success!
success!
success!
Fatal error:

Call to private method C::foo() from context 'A' in /tmp/test.php on line 9

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

public static function who() {


echo __CLASS__."\n";
}
}
C::test();
?>

O exemplo acima ir imprimir:


A
C
C

Late Static BindingsPHP Manual


Classes e Objetos
Objetos e Referncias

Serializao de Objetos - objetos em sess

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;

// $a e $b so cpias do mesmo identificador


// ($a) = ($b) = <id>

$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";
?>

O exemplo acima ir imprimir:


2
2
2

Objetos e RefernciasPHP Manual


Classes e Objetos

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

Serializao de Objetos - objetos em sesso

Serializao de Objetos - objetos em sesso


A funo serialize() retorna uma string contendo uma representao byte-stream de qualquer valor que pode ser
armazenado pelo PHP. A funo unserialize() pode utilizar essa string para recriar os valores originais da varivel.
Utilizar a serializao para salvar um objeto, salvar todas as variveis de um objeto. Os mtodos de um objeto no
sero salvos, apenas o nome da classe.
Para deserializar um objeto com a funo unserialize(), a classe deste objeto precisar estar definida. Isto , se possuir
um objeto da classe A e serializ-lo, voc obter uma string que referencia a classe A e contm todos os valores de
variveis contidas nele. Se deseja-se deserializar este em outro arquivo, um objeto da classe A, a definio da classe
A deve estar presente neste arquivo. Isso pode ser feito, por exemplo, armazenando a definio da classe A em um
arquivo, e inclu-lo, fazendo uso da funo spl_autoload_register().
<?php
// classa.inc:
class A {
public $one = 1;

public function show_one() {


echo $this->one;
}

// 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

Log de modificaes da POO


As Modificaes ao modelo de POO do PHP 5 so logados aqui. Descries e outras notas sobre estes recursos so
documentados na documentao da POO 5.
Verso
5.5.0
5.4.0
5.4.0
5.3.3
5.3.0
5.3.0
5.3.0

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