curso de php - objetos

74
Curso de PHP – Objetos Fábio M. Pereira UNIVERSIDADE ESTADUAL DO SUDOESTE DA BAHIA – UESB UNIDADE ORGANIZACIONAL DE INFORMÁTICA - UINFOR

Upload: fabio-moura-pereira

Post on 24-May-2015

119 views

Category:

Education


1 download

DESCRIPTION

Curso da Linguagem de Programação PHP da disciplina Desenvolvimento de Sistemas Web da Universidade Estadual do Sudoeste da Bahia - UESB.

TRANSCRIPT

Page 1: Curso de PHP - Objetos

Curso de PHP – Objetos Fábio M. Pereira

UNIVERSIDADE ESTADUAL DO SUDOESTE DA BAHIA – UESB

UNIDADE ORGANIZACIONAL DE INFORMÁTICA - UINFOR

Page 2: Curso de PHP - Objetos

Roteiro

• Criando um Objeto

• Acessando Propriedades e Métodos

• Declarando Uma Classe

• Introspecção

• Serialização

Page 3: Curso de PHP - Objetos

Objetos

• A Programação Orientada a Objetos (POO) abriu a porta para o design limpo, manutenção mais fácil e maior reuso de código

• O valor já provado da POO é tanto que poucos hoje em dia iriam desafiar ao introduzir uma linguagem que não fosse orientada a objetos

• PHP dá suporte a muitas características úteis da POO • POO reconhece a conexão fundamental entre os dados e o código

que manipula os dados e permite o projeto e implementação de programas em torno desta conexão

• Projetar sistemas orientados a objetos é um tópico complexo, existindo muitos livros escritos sobre isto

• A boa notícia é que não importa como projete o seu sistema, poderá implementá-lo em PHP

• Este tópico mostra como definir, criar e usar objetos em PHP, cobrindo desde os conceitos básicos até tópicos avançados como introspecção e serialização

Page 4: Curso de PHP - Objetos

OBJETOS CRIANDO UM OBJETO

Page 5: Curso de PHP - Objetos

Criando Um Objeto

• É muito mais fácil criar um objeto e utilizá-lo do que definir classes de objetos, então, antes de discutir como definir classes, veremos como criar objetos

• Para criar um objeto de uma data classe, usamos a palavra chave new:

$objeto = new Classe;

• Assumindo que uma classe Pessoa tenha sido definida, criamos um objeto Pessoa:

$rasmus = new Person;

• Podemos passar argumentos em algumas classes na chamada new:

$object = new Person("Fred", 35);

Page 6: Curso de PHP - Objetos

Criando Um Objeto

• O nome da classe não precisa ser diretamente inserido no programa, podemos fornecê-lo através de uma variável:

$class = "Person";

$object = new $class;

// é equivalente a

$object = new Person;

• Variáveis contendo referências a objetos são apenas variáveis normais, podendo ser tratadas da mesma maneira:

$account = new Account;

$object = "account";

${$object}->init(50000, 1.10);

// o mesmo que $account->init

Page 7: Curso de PHP - Objetos

OBJETOS ACESSANDO PROPRIEDADE E MÉTODOS

Page 8: Curso de PHP - Objetos

Acessando Propriedades e Métodos

• Uma vez que tenhamos um objeto, podemos usar a notação -> para acessar métodos e propriedades do objeto: $object->propertyname $object->methodname([arg, ... ])

• Por exemplo: echo "Rasmus is {$rasmus->age} years old.\n";

// acesso a propriedade

$rasmus->birthday(); // chamada do método

$rasmus->setAge(21); // chamada com argumento

• Métodos agem como funções, então eles podem receber argumentos e retornar um valor:

$clan = $rasmus->family("extended");

Page 9: Curso de PHP - Objetos

Acessando Propriedades e Métodos

• Dentro da definição da classe, podemos especificar métodos e propriedades publicamente acessíveis e acessíveis apenas dentro da própria classe, usando os modificadores de acesso public e private, permitindo o encapsulamento

• Podemos usar variáveis de variáveis com nomes de propriedades:

$prop = 'age';

echo $rasmus->$prop;

Page 10: Curso de PHP - Objetos

Acessando Propriedades e Métodos

• Um método estático é aquele que é chamado em uma classe, não em um objeto

– Estes métodos não podem acessar propriedades

• O nome de um método estático é o nome da classe seguido por dois pontos duas vezes e o nome da função

• Por exemplo, para chamar o método estático p() da classe HTML:

HTML::p("Hello, world");

• Quando declaramos uma classe, definimos quais propriedades e métodos são estáticos usando a propriedade static

Page 11: Curso de PHP - Objetos

Acessando Propriedades e Métodos

• Uma vez criados, objetos são passados por referência, por exemplo:

$f = new Person("Fred", 35);

$b = $f; // $b and $f point at same object

$b->setName("Barney");

printf("%s and %s are best friends.\n",

$b->getName(), $f->getName());

Barney and Barney are best friends.

Page 12: Curso de PHP - Objetos

Acessando Propriedades e Métodos

• Se quisermos criar uma cópia real do objeto, devemos utilizar o operador clone:

$f = new Person("Fred", 35);

$b = clone $f; // make a copy

$b->setName("Barney");// change the copy

printf("%s and %s are best friends.\n",

$b->getName(), $f->getName());

Fred and Barney are best friends.

Page 13: Curso de PHP - Objetos

Acessando Propriedades e Métodos

• Quando usamos o operador clone para criar uma cópia de um objeto e a classe declara o método __clone(), este método é chamado no novo objeto imediatamente após a cópia

• Podemos usar isto em casos quando um objeto guarda recursos externos (como em manipuladores de arquivos) para criar novos recursos, em vez de copiar os existentes

Page 14: Curso de PHP - Objetos

OBJETOS DECLARANDO UMA CLASSE

Page 15: Curso de PHP - Objetos

Declarando Uma Classe

• Para projetar um programa ou uma biblioteca de código de maneira orientada a objetos, precisamos definir nossas próprias classes, usando a palavra chave class

• Uma definição de classe inclui o nome da classe, suas propriedades e métodos

– Nomes de classe não são sensíveis à caixa e devem seguir as mesmas regras de identificadores PHP

– O nome de classe stdClass é reservado

Page 16: Curso de PHP - Objetos

Declarando Uma Classe

• Sintaxe: class classname [ extends baseclass ] [ implements

interfacename , [interfacename, ... ] ]

{

[ use traitname, [ traitname, ... ]; ]

[ visibility $property [ = value ]; ... ]

[ function functionname (args) {

// code

}

...

]

}

Page 17: Curso de PHP - Objetos

Declarando Métodos

• Um método é uma função definida dentro de uma classe

• Nomes de métodos que iniciam com dois sublinhados (__) podem ser usados no futuro por PHP (são atualmente usados pelos métodos de serialização de objetos __sleep() e __wakeup(), dentre outros), portanto não é recomendado iniciar os nomes de métodos com essa sequência

• Dentro do método, a variável $this contém uma referência ao objeto no qual o método foi chamado

– Por exemplo, se chamarmos $rasmus->birthday(), dentro do método birthday(), $this armazena o mesmo valor de $rasmus

Page 18: Curso de PHP - Objetos

Declarando Métodos

• Exemplo: class Person

{

public $name = '';

function getName()

{

return $this->name;

}

function setName($newName)

{

$this->name = $newName;

}

}

Page 19: Curso de PHP - Objetos

Declarando Métodos

• Para declarar um método estático, usamos a palavra chave static

• Dentro de métodos estáticos a variável $this não está definida

• Exemplo: class HTMLStuff

{

static function startTable() {

echo "<table border=\"1\">\n";

}

static function endTable() {

echo "</table>\n";

}

}

HTMLStuff::startTable();

// imprimir linhas e colunas de uma tabela HTML

HTMLStuff::endTable();

Page 20: Curso de PHP - Objetos

Declarando Métodos

• Se declararmos um método usando a palavra chave final, subclasses não podem sobrescrever o método

• Exemplo: class Person {

public $name;

final function getName() {

return $this->name;

}

}

class Child extends Person {

// erro de syntaxe

function getName() {

// faça alguma coisa

}

}

Page 21: Curso de PHP - Objetos

Declarando Métodos

• Usando modificadores de acesso podemos mudar a visibilidade dos métodos

• public – métodos podem ser acessados fora do objeto

• private – métodos podem ser acessados apenas por métodos dentro da mesma classe

• protected – métodos podem ser acessados por métodos dentro da mesma classe e métodos de classes que herdam da mesma

• Se a visibilidade não for especificada, um método é considerado público

Page 22: Curso de PHP - Objetos

Exemplo

class Person {

public $age;

public function __construct() {

$this->age = 0;

}

public function incrementAge() {

$this->age += 1;

$this->ageChanged();

}

protected function decrementAge() {

$this->age −= 1;

$this->ageChanged();

}

private function ageChanged() {

echo "Age changed to {$this->age}";

}

}

Page 23: Curso de PHP - Objetos

Exemplo

class SupernaturalPerson extends Person{

public function incrementAge() {

// idades em reverso

$this->decrementAge();

}

}

$person = new Person;

$person->incrementAge();

$person->decrementAge(); // não permitido

$person->ageChanged(); // também não permitido

$person = new SupernaturalPerson;

$person->incrementAge(); // chama decrementAge

Page 24: Curso de PHP - Objetos

Declarando Métodos

• Podemos usar sugestão de tipo quando declararmos um método de um objeto:

class Person {

function takeJob(Job $job) {

echo "Now employed as a {$job->title}\n";

}

}

Page 25: Curso de PHP - Objetos

Declarando Propriedades

• Na definição anterior da classe Person declaramos explicitamente a propriedade $name

• Declarações de propriedades são opcionais e são simplesmente uma cortesia para quem quer que faça a manutenção do programa

• Versão de Person sem declaração da propriedade $name: class Person {

function getName() {

return $this->name;

}

function setName($newName) {

$this->name = $newName;

}

}

Page 26: Curso de PHP - Objetos

Declarando Propriedades

• Podemos atribuir valores padrões a propriedades, mas estes valores devem ser constantes simples:

public $name = "J Doe"; // funciona

public $age = 0; // funciona

public $day = 60 * 60 * 24; // não funciona

• Usando modificadores de acesso, podemos mudar a visibilidade de propriedades: public, private e protected

• Exemplo: class Person {

protected $rowId = 0;

public $username = 'Anyone can see me';

private $hidden = true;

}

Page 27: Curso de PHP - Objetos

Declarando Propriedades

• Adicionalmente a propriedades de instâncias de objetos, PHP permite a definição de propriedades estáticas, que são variáveis de uma classe e podem ser acessadas referenciando a propriedade com o nome da classe

• Exemplo: class Person {

static $global = 23;

}

$localCopy = Person::$global;

• Podemos também referenciar propriedades estáticas de dentro da instância da classe através da palavra chave self, como em echo self::$global;

Page 28: Curso de PHP - Objetos

Declarando Constantes

• Da mesma forma que constantes globais, atribuídas através da função define(), PHP fornece uma maneira de atribuir constantes dentro de uma classe

• Assim como propriedades estáticas, constantes podem ser acessadas diretamente através da classe ou de métodos dentro do objeto usando a notação self

• Uma vez que o valor de uma constante é definido, não poderá mais ser mudado:

class PaymentMethod {

const TYPE_CREDITCARD = 0;

const TYPE_CASH = 1;

}

echo PaymentMethod::TYPE_CREDITCARD;

0

Page 29: Curso de PHP - Objetos

Herança

• Para herdar as propriedades e métodos de outra classe, use a palavra chave extends na definição da classe, seguida pelo nome da classe base:

class Person {

public $name, $address, $age;

}

class Employee extends Person {

public $position, $salary;

}

• Para acessar um método sobreposto em um objeto da classe pai, use a notação parent::method():

parent::birthday();

// chama o método birthday() da classe pai

Page 30: Curso de PHP - Objetos

Herança

• Para verificar se um objeto é uma instância de uma classe em particular ou se ele implementa uma determinada interface, podemos usar o operador instanceof:

if ($object instanceof Animal) {

// faça alguma coisa

}

Page 31: Curso de PHP - Objetos

Interfaces

• Interfaces fornecem uma maneira para definirmos contratos que uma classe adere

– A interface fornece protótipos de métodos e constantes

– Qualquer classe que implementa a interface deve fornecer implementação para todos os métodos da interface

• Sintaxe: interface interfacename

{

[ function functionname();

...

]

}

Page 32: Curso de PHP - Objetos

Interfaces

• Para declarar que uma classe implementa uma interface, devemos incluir a palavra chave implements seguida de qualquer número de interfaces, separadas por vírgulas:

interface Printable {

function printOutput();

}

class ImageComponent implements Printable {

function printOutput() {

echo "Printing an image...";

}

}

Page 33: Curso de PHP - Objetos

Interfaces

• Uma interface pode herdar de outras interfaces (incluindo múltiplas interfaces) desde que nenhuma das interfaces que ela herda declare métodos com o mesmo nome daqueles declarados na interface filha

Page 34: Curso de PHP - Objetos

Características

• Características fornecem um mecanismo para reuso de código fora de uma hierarquia de classes

• Características permitem que compartilhemos funcionalidade através de diferentes classes que não compartilham um ancestral em comum em uma hierarquia de classes

• Sintaxe: trait traitname [ extends baseclass ] {

[ use traitname, [ traitname, ... ]; ]

[ visibility $property [ = value ]; ... ]

[ function functionname (args) {

// code

}

...

]

}

Page 35: Curso de PHP - Objetos

Características

• Para declarar que uma classe deve incluir métodos trait, devemos incluir a palavra chave use e qualquer número de características, separados por vírgula:

Page 36: Curso de PHP - Objetos

Características trait Logger {

public log($logString) {

$className = __CLASS__;

echo date("Y-m-d h:i:s", time()) .

": [{$className}] {$logString}";

}

}

class User {

use Logger;

public $name;

function __construct($name = '') {

$this->name = $name;

$this->log("Created user '{$this->name}'");

}

function __toString() {

return $this->name;

}

}

Page 37: Curso de PHP - Objetos

Características

class UserGroup

{

use Logger;

public $users = array();

public addUser(User $user) {

if (!$this->includesUser($user)) {

$this->users[] = $user;

$this->log("Added user '{$user}' to group");

}

}

}

$group = new UserGroup;

$group->addUser(new User("Franklin"));

2012-03-09 07:12:58: [User] Created user 'Franklin'

2012-03-09 07:12:58: [UserGroup] Added user 'Franklin' to group

Page 38: Curso de PHP - Objetos

Características

• Características podem ser compostas por outras características pela inclusão da instrução use na declaração da característica, seguida por uma ou mais características separadas por vírgulas:

trait First {

public doFirst() {

echo "first\n";

}

}

trait Second {

public doSecond() {

echo "second\n";

}

}

trait Third {

use First, Second;

public doAll() {

$this->doFirst();

$this->doSecond();

}

}

class Combined {

use Third;

}

$object = new Combined;

$object->doAll();

first

second

Page 39: Curso de PHP - Objetos

Resolvendo Conflitos

trait Command {

function run() {

echo "Executing a command";

}

}

trait Marathon {

function run() {

echo "Running a marathon";

}

}

Page 40: Curso de PHP - Objetos

Resolvendo Conflitos

trait Command {

function run() {

echo "Executing a command";

}

}

trait Marathon {

function run() {

echo "Running a marathon";

}

}

class Person {

use Command, Marathon {

Command::run as runCommand;

Marathon::run insteadof Command;

}

}

$person = new Person;

$person->run();

$person->runCommand();

Running a marathon

Executing a command

Page 41: Curso de PHP - Objetos

Métodos Abstratos

• PHP também fornece um mecanismo para declaração de que certos métodos na classe devem ser implementados por subclasses

– A implementação desses métodos não está definida na classe pai

– Nesses casos, fornecemos um método abstrato

• Em adição, se uma classe possui qualquer método definido como abstrato, podemos também declarar a classe como abstrata

Page 42: Curso de PHP - Objetos

Métodos Abstratos

abstract class Component {

abstract function printOutput();

}

class ImageComponent extends Component {

function printOutput() {

echo "Pretty picture";

}

}

Page 43: Curso de PHP - Objetos

Métodos Abstratos

• Classes abstratas não podem ser instanciadas

• Diferentemente de algumas linguagens, também não podemos fornecer uma implementação padrão para métodos abstratos

• Características também podem declarar métodos abstratos

• Classes que incluem uma característica que define um método abstrato deverá implementá-lo

Page 44: Curso de PHP - Objetos

Métodos Abstratos

trait Sortable {

abstract function uniqueId();

function compareById($object) {

return ($object->uniqueId() < $this->uniqueId()) ? −1 : 1;

}

}

class Bird {

use Sortable;

function uniqueId() {

return __CLASS__ . ":{$this->id}";

}

}

Page 45: Curso de PHP - Objetos

Métodos Abstratos

trait Sortable {

abstract function uniqueId();

function compareById($object) {

return ($object->uniqueId() < $this->uniqueId()) ? −1 : 1;

}

}

class Bird {

use Sortable;

function uniqueId() {

return __CLASS__ . ":{$this->id}";

}

}

class Car {

use Sortable;

}

// fatal

$bird = new Bird;

$car = new Car;

$comparison = $bird->compareById($card);

Page 46: Curso de PHP - Objetos

Construtores

• Podemos fornecer uma lista de argumentos após o nome da classe quando instanciamos um objeto:

$person = new Person("Fred", 35);

• Estes argumentos são passados ao construtor da classe, uma função especial que inicializa as propriedades da classe

• Uma construtor é uma função da classe chamada __construct()

• Construtor da classe Person: class Person {

function __construct($name, $age) {

$this->name = $name;

$this->age = $age;

}

}

Page 47: Curso de PHP - Objetos

Construtores

• PHP não fornece encadeamento automático de construtores:

– Se iniciarmos um objeto de uma classe derivada, somente o construtor da classe derivada é automaticamente chamado

• Para que o construtor da classe pai seja chamado, o construtor da classe derivada deve explicitamente chamá-lo

Page 48: Curso de PHP - Objetos

Construtores

class Person {

public $name, $address, $age;

function __construct($name, $address, $age) {

$this->name = $name;

$this->address = $address;

$this->age = $age;

}

}

class Employee extends Person {

public $position, $salary;

function __construct($name, $address, $age,

$position, $salary) {

parent::__construct($name, $address, $age);

$this->position = $position;

$this->salary = $salary;

}

}

Page 49: Curso de PHP - Objetos

Destrutores

• Quando um objeto é destruído, como quando a última referência a um objeto é removida ou o fim do script é alcançado, o seu destrutor é chamado

• Uma vez que PHP automaticamente limpa todos os recursos quando eles saem do escopo e no fim da execução de um script, a sua aplicação é limitada

• O destrutor é um método chamado __destruct(): class Building {

function __destruct() {

echo "A Building is being destroyed!";

}

}

Page 50: Curso de PHP - Objetos

OBJETOS INTROSPECÇÃO

Page 51: Curso de PHP - Objetos

Introspecção

• Introspecção é a habilidade de um programa examinar as características de um objeto, como o seu nome, classe pai (se existir), propriedades e métodos

• Com introspecção, podemos escrever código que opere em qualquer classe ou objeto

• Não precisamos saber quais métodos ou propriedades estão definidas quando escrevemos o código, em vez disso, podemos descobrir esta informação em tempo real, o que torna possível escrever corretores de erro genéricos, serializadores, etc.

Page 52: Curso de PHP - Objetos

Examinando Classes

• Para determinar se uma classe existe, usamos a função class_exists(), que recebe uma string e retorna um valor booleano

• Alternativamente, podemos usar a função get_declared_classes(), que retorna um array de classes definidas e checar se nome da classe está no array retornado:

$doesClassExist = class_exists(classname);

$classes = get_declared_classes();

$doesClassExist = in_array(classname, $classes);

Page 53: Curso de PHP - Objetos

Examinando Classes

• Podemos descobrir os métodos e propriedades que existem em uma classe (incluindo os herdados de superclasses) usando as funções get_class_methods() e get_class_vars()

• Estas funções recebem o nome da classe e retornam um array:

$methods = get_class_methods(classname);

$properties = get_class_vars(classname);

• O nome da classe pode ser uma palavra, uma string ou uma variável:

$class = "Person";

$methods = get_class_methods($class);

$methods = get_class_methods(Person); // o mesmo

$methods = get_class_methods("Person"); // o mesmo

Page 54: Curso de PHP - Objetos

Examinando Classes

• O array retornado por get_class_methods() é uma lista simples de nomes de métodos

• O array associativo retornado por get_class_vars() mapeia nomes de propriedades em valores, incluindo propriedades herdadas

• Um truque de get_class_vars() é que ele retorna apenas propriedades que possuam valores padrões e estão visíveis no escopo atual, não há maneira de descobrir propriedades não inicializadas

• Utilize get_parent_class() para descobrir a classe pai de uma classe:

$superclass = get_parent_class(classname);

Page 55: Curso de PHP - Objetos

Exemplo

function displayClasses() {

$classes = get_declared_classes();

foreach ($classes as $class) {

echo "Showing information about {$class}<br />";

echo "Class methods:<br />";

$methods = get_class_methods($class);

if (!count($methods)) {

echo "<i>None</i><br />";

}

else {

foreach ($methods as $method) {

echo "<b>{$method}</b>()<br />";

}

}

Page 56: Curso de PHP - Objetos

Exemplo

function displayClasses() {

$classes = get_declared_classes();

foreach ($classes as $class) {

echo "Showing information about {$class}<br />";

echo "Class methods:<br />";

$methods = get_class_methods($class);

if (!count($methods)) {

echo "<i>None</i><br />";

}

else {

foreach ($methods as $method) {

echo "<b>{$method}</b>()<br />";

}

}

echo "Class properties:<br />";

$properties = get_class_vars($class);

if (!count($properties)) {

echo "<i>None</i><br />";

}

else {

foreach(array_keys($properties) as $property) {

echo "<b>\${$property}</b><br />";

}

}

echo "<hr />";

}

}

Page 57: Curso de PHP - Objetos

Examinando um Objeto

• Para descobrir a classe a qual um objeto pertence, primeiro devemos nos certificar que se trata de um objeto através da função is_object(), e então podemos descobrir a classe com a função get_class():

$isObject = is_object(var);

$classname = get_class(object);

• Antes de chamar um método de um objeto, podemos garantir que ele existe através da função method_exists():

$methodExists = method_exists(object, method);

• Chamar um método indefinido causa um erro de runtime

Page 58: Curso de PHP - Objetos

Examinando um Objeto

• A função get_object_vars() retorna um array com as propriedades atribuídas em um objeto:

$array = get_object_vars(object);

• Exemplo: class Person {

public $name;

public $age;

}

$fred = new Person;

$fred->name = "Fred";

$props = get_object_vars($fred);

// array('name' => "Fred", 'age' => NULL);

Page 59: Curso de PHP - Objetos

Examinando um Objeto

• A função get_parent_class() aceita tanto um objeto como um nome de classe, retornando o nome da classe pai ou FALSE, se não existir:

class A {}

class B extends A {}

$obj = new B;

echo get_parent_class($obj);

echo get_parent_class(B);

A

A

Page 60: Curso de PHP - Objetos

Funções de Exemplo

// retorna um array de métodos callable

// incluindo métodos herdados

function getCallableMethods($object) {

$methods = get_class_methods(get_class($object));

if (get_parent_class($object)) {

$parent_methods = get_class_methods(

get_parent_class($object));

$methods = array_diff($methods, $parent_methods);

}

return $methods;

}

Page 61: Curso de PHP - Objetos

Funções de Exemplo

// retorna um array de métodos herdados

function getInheritedMethods($object) {

$methods = get_class_methods(get_class($object));

if (get_parent_class($object)) {

$parentMethods = get_class_methods(

get_parent_class($object));

$methods = array_intersect($methods, $parentMethods);

}

return $methods;

}

Page 62: Curso de PHP - Objetos

Funções de Exemplo

// retorna um array de superclasses

function getLineage($object) {

if (get_parent_class($object)) {

$parent = get_parent_class($object);

$parentObject = new $parent;

$lineage = getLineage($parentObject);

$lineage[] = get_class($object);

}

else {

$lineage = array(get_class($object));

}

return $lineage;

}

Page 63: Curso de PHP - Objetos

Funções de Exemplo // retorna um array de subclasses

function getChildClasses($object) {

$classes = get_declared_classes();

$children = array();

foreach ($classes as $class) {

if (substr($class, 0, 2) == '__') {

continue;

}

$child = new $class;

if (get_parent_class($child) == get_class($object)) {

$children[] = $class;

}

}

return $children;

}

Page 64: Curso de PHP - Objetos

OBJETOS SERIALIZAÇÃO

Page 65: Curso de PHP - Objetos

Serialização

• Serialização de um objeto significa a sua conversão para uma representação bytestream que pode ser armazenada em um arquivo

• Isto é útil para dados persistentes, por exemplo, sessões PHP automaticamente armazenam e recuperam objetos

• Serialização em PHP é quase sempre automática, feita através das funções serialize() e unserialize():

$encoded = serialize(something);

$something = unserialize(encoded);

• Serialização é mais comumente utilizada em sessões PHP, que manipula a serialização automaticamente – Tudo que precisamos fazer é informar ao PHP quais variáveis

queremos rastrear e ele automaticamente irá preservá-las entre as visitas às páginas do site

Page 66: Curso de PHP - Objetos

Serialização

• PHP tem dois ganchos para objetos durante os processos de serialização e de-serialização: __sleep() e __wakeup()

– Esses métodos são usados para notificar os objetos

– Objetos podem ser serializados se não possuírem esses métodos, no entanto não serão notificados sobre o processo

• O método __sleep() é chamado em um objeto antes da serialização – Ele pode fazer qualquer limpeza necessária para preservar o

estado do objeto, como fechar conexão com banco de dados, escrever ou salvar dados persistentes, etc.

– Ele deve retornar um array contendo os nomes dos dados que precisam ser escritos no bytestream

– Se retornar um array vazio, nenhum dado é escrito

Page 67: Curso de PHP - Objetos

Serialização

• Contrariamente, o método __wakeup() é chamado em um objeto imediatamente após ele ser criado a partir de um bytestream

– Ele pode executar qualquer ação necessária, como reabrir a conexão com o banco de dados e outras tarefas de inicialização

• O exemplo a seguir mostra uma classe de objetos Log, que possui dois métodos úteis:

– write() para adicionar uma mensagem a um arquivo de log

– read() para buscar o conteúdo atual do arquivo de log

– Ela usa __wakeup() para reabrir o arquivo de log e __sleep() para fechar arquivo

Page 68: Curso de PHP - Objetos

Exemplo

class Log {

private $filename;

private $fh;

function __construct($filename) {

$this->filename = $filename;

$this->open();

}

function open() {

$this->fh = fopen($this->filename, 'a') or

die("Can't open {$this->filename}");

}

function write($note) {

fwrite($this->fh, "{$note}\n");

}

Page 69: Curso de PHP - Objetos

Exemplo

class Log {

private $filename;

private $fh;

function __construct($filename) {

$this->filename = $filename;

$this->open();

}

function open() {

$this->fh = fopen($this->filename, 'a') or

die("Can't open {$this->filename}");

}

function write($note) {

fwrite($this->fh, "{$note}\n");

}

function read() {

return join('', file($this->filename));

}

function __wakeup() {

$this->open();

}

function __sleep() {

// write information to the account file

fclose($this->fh);

return array("filename");

}

}

Page 70: Curso de PHP - Objetos

Usando Log.php em front.php

<?php

include_once "Log.php";

session_start();

?>

<html><head><title>Front Page</title></head>

<body>

<?php

$now = strftime("%c");

if (!session_is_registered('l')) {

$logger = new Log("/tmp/persistent_log");

session_register('l');

$logger->write("Created $now");

echo("<p>Created session and persistent log object.</p>");

}

Page 71: Curso de PHP - Objetos

Usando Log.php em front.php

<?php

include_once "Log.php";

session_start();

?>

<html><head><title>Front Page</title></head>

<body>

<?php

$now = strftime("%c");

if (!session_is_registered('l')) {

$logger = new Log("/tmp/persistent_log");

session_register('l');

$logger->write("Created $now");

echo("<p>Created session and persistent log object.</p>");

}

$logger->write("Viewed first page {$now}");

echo "<p>The log contains:</p>";

echo nl2br($logger->read());

?>

<a href="next.php">Move to the next page</a>

</body></html>

Page 72: Curso de PHP - Objetos

next.php

<?php

include_once "Log.php";

session_start();

?>

<html><head><title>Next Page</title></head>

<body>

<?php

$now = strftime("%c");

$logger->write("Viewed page 2 at {$now}");

echo "<p>The log contains:";

echo nl2br($logger->read());

echo "</p>";

?>

</body></html>

Page 73: Curso de PHP - Objetos

Curso de PHP – Objetos Fábio M. Pereira

UNIVERSIDADE ESTADUAL DO SUDOESTE DA BAHIA – UESB

UNIDADE ORGANIZACIONAL DE INFORMÁTICA - UINFOR

Page 74: Curso de PHP - Objetos

Baseado em...