SlideShare uma empresa Scribd logo
1 de 74
Baixar para ler offline
Curso de PHP – Objetos Fábio M. Pereira 
UNIVERSIDADE ESTADUAL DO SUDOESTE DA BAHIA – UESB 
UNIDADE ORGANIZACIONAL DE INFORMÁTICA - UINFOR
Roteiro 
•Criando um Objeto 
•Acessando Propriedades e Métodos 
•Declarando Uma Classe 
•Introspecção 
•Serialização
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
OBJETOS CRIANDO UM OBJETO
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);
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
OBJETOS ACESSANDO PROPRIEDADE E MÉTODOS
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");
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;
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
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.
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.
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
OBJETOS DECLARANDO UMA CLASSE
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
Declarando Uma Classe 
•Sintaxe: 
class classname [ extends baseclass ] [ implements interfacename , [interfacename, ... ] ] 
{ 
[ use traitname, [ traitname, ... ]; ] 
[ visibility $property [ = value ]; ... ] 
[ function functionname (args) { 
// code 
} 
... 
] 
}
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
Declarando Métodos 
•Exemplo: 
class Person 
{ 
public $name = ''; 
function getName() 
{ 
return $this->name; 
} 
function setName($newName) 
{ 
$this->name = $newName; 
} 
}
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();
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 
} 
}
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
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}"; 
} 
}
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
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"; 
} 
}
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; 
} 
}
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; 
}
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;
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
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
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 
}
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(); 
... 
] 
}
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..."; 
} 
}
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
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 
} 
... 
] 
}
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:
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; 
} 
}
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
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 "firstn"; 
} 
} 
trait Second { public doSecond() { echo "secondn"; } } 
trait Third { 
use First, Second; 
public doAll() { 
$this->doFirst(); 
$this->doSecond(); 
} 
} 
class Combined { 
use Third; 
} 
$object = new Combined; 
$object->doAll(); 
first 
second
Resolvendo Conflitos 
trait Command { 
function run() { 
echo "Executing a command"; 
} 
} 
trait Marathon { 
function run() { 
echo "Running a marathon"; 
} 
}
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
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
Métodos Abstratos 
abstract class Component { 
abstract function printOutput(); 
} 
class ImageComponent extends Component { 
function printOutput() { 
echo "Pretty picture"; 
} 
}
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
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}"; } }
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);
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; 
} 
}
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
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; 
} 
}
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!"; 
} 
}
OBJETOS INTROSPECÇÃO
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.
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);
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
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);
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 />"; } }
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 />"; 
} 
}
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
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);
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
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; 
}
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; }
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; 
}
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; 
}
OBJETOS SERIALIZAÇÃO
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
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
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
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"); 
}
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"); 
} 
}
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>"); 
}
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>
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>
Curso de PHP – Objetos Fábio M. Pereira 
UNIVERSIDADE ESTADUAL DO SUDOESTE DA BAHIA – UESB 
UNIDADE ORGANIZACIONAL DE INFORMÁTICA - UINFOR
Baseado em...

Mais conteúdo relacionado

Mais procurados

Programação Orientada a Objetos - Uso da O.O. em Java
Programação Orientada a Objetos - Uso da O.O. em JavaProgramação Orientada a Objetos - Uso da O.O. em Java
Programação Orientada a Objetos - Uso da O.O. em Java
Cristiano Almeida
 
Programando em python classes
Programando em python   classesProgramando em python   classes
Programando em python classes
samuelthiago
 
006 programando em python - dicionarios
006   programando em python - dicionarios006   programando em python - dicionarios
006 programando em python - dicionarios
Leandro Barbosa
 

Mais procurados (20)

Meta-programacao em python
Meta-programacao em pythonMeta-programacao em python
Meta-programacao em python
 
[CRASHCOURSE] Orientação a Objeto e UML
[CRASHCOURSE] Orientação a Objeto e UML[CRASHCOURSE] Orientação a Objeto e UML
[CRASHCOURSE] Orientação a Objeto e UML
 
Minicurso de jQuery
Minicurso de jQueryMinicurso de jQuery
Minicurso de jQuery
 
Escrevendo plugins JQuery
Escrevendo plugins JQueryEscrevendo plugins JQuery
Escrevendo plugins JQuery
 
Poo
PooPoo
Poo
 
3- POO
3- POO3- POO
3- POO
 
POO - 13 - Arrays em Java
POO - 13 - Arrays em JavaPOO - 13 - Arrays em Java
POO - 13 - Arrays em Java
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para Webdesigners
 
Aula 3 - Java Prof.ª Cristiane Fidelix
Aula 3 -  Java Prof.ª Cristiane FidelixAula 3 -  Java Prof.ª Cristiane Fidelix
Aula 3 - Java Prof.ª Cristiane Fidelix
 
Jquery a technical overview
Jquery a technical overviewJquery a technical overview
Jquery a technical overview
 
Programação Orientada a Objetos - Uso da O.O. em Java
Programação Orientada a Objetos - Uso da O.O. em JavaProgramação Orientada a Objetos - Uso da O.O. em Java
Programação Orientada a Objetos - Uso da O.O. em Java
 
Programando em python classes
Programando em python   classesProgramando em python   classes
Programando em python classes
 
Java Básico :: Classe Vector
Java Básico :: Classe VectorJava Básico :: Classe Vector
Java Básico :: Classe Vector
 
Aula5
Aula5Aula5
Aula5
 
PHP robusto com Zend Framework
PHP robusto com Zend FrameworkPHP robusto com Zend Framework
PHP robusto com Zend Framework
 
POO - 23 - Coleções da API do Java
POO -  23 - Coleções da API do Java POO -  23 - Coleções da API do Java
POO - 23 - Coleções da API do Java
 
POO - 14 - Vetores
POO - 14 - VetoresPOO - 14 - Vetores
POO - 14 - Vetores
 
JAVA - Orientação a Objetos
JAVA - Orientação a ObjetosJAVA - Orientação a Objetos
JAVA - Orientação a Objetos
 
Aplicando OO no Saeo
Aplicando OO no SaeoAplicando OO no Saeo
Aplicando OO no Saeo
 
006 programando em python - dicionarios
006   programando em python - dicionarios006   programando em python - dicionarios
006 programando em python - dicionarios
 

Destaque

Destaque (20)

Aula de Prolog 07 - Estruturas de Dados
Aula de Prolog 07 - Estruturas de DadosAula de Prolog 07 - Estruturas de Dados
Aula de Prolog 07 - Estruturas de Dados
 
04 - Gerenciamento de Threads - II
04 -  Gerenciamento de Threads - II04 -  Gerenciamento de Threads - II
04 - Gerenciamento de Threads - II
 
Aula Prolog - 05
Aula Prolog - 05Aula Prolog - 05
Aula Prolog - 05
 
Desenvolvimento de Sistemas Web - HTML5 - Introdução
Desenvolvimento de Sistemas Web - HTML5 - IntroduçãoDesenvolvimento de Sistemas Web - HTML5 - Introdução
Desenvolvimento de Sistemas Web - HTML5 - Introdução
 
Haskell - Introdução
Haskell - IntroduçãoHaskell - Introdução
Haskell - Introdução
 
Aula 05 - Java Script Básico
Aula 05 -  Java Script BásicoAula 05 -  Java Script Básico
Aula 05 - Java Script Básico
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - I
 
Programação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte IIProgramação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte II
 
Curso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTMLCurso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTML
 
Aula de Desenvolvimento de Sistemas Web - CSS3
Aula de Desenvolvimento de Sistemas Web - CSS3Aula de Desenvolvimento de Sistemas Web - CSS3
Aula de Desenvolvimento de Sistemas Web - CSS3
 
Desenvolvimento de Sistemas Web - Conceitos Básicos
Desenvolvimento de Sistemas Web - Conceitos BásicosDesenvolvimento de Sistemas Web - Conceitos Básicos
Desenvolvimento de Sistemas Web - Conceitos Básicos
 
Web analitica orientada a usabilidade
Web analitica orientada a usabilidadeWeb analitica orientada a usabilidade
Web analitica orientada a usabilidade
 
02 conceitos iniciais
02   conceitos iniciais02   conceitos iniciais
02 conceitos iniciais
 
PHP - Strings
PHP - StringsPHP - Strings
PHP - Strings
 
Aula de Prolog 08 - Unificação
Aula de Prolog 08 - UnificaçãoAula de Prolog 08 - Unificação
Aula de Prolog 08 - Unificação
 
Aula Prolog 02
Aula Prolog 02Aula Prolog 02
Aula Prolog 02
 
Aula de Prolog 06 - Recursão
Aula de Prolog 06 - RecursãoAula de Prolog 06 - Recursão
Aula de Prolog 06 - Recursão
 
Prolog 04 - Regras
Prolog 04 - RegrasProlog 04 - Regras
Prolog 04 - Regras
 
Aula Prolog 01
Aula Prolog 01Aula Prolog 01
Aula Prolog 01
 
Aula Prolog 03
Aula Prolog 03Aula Prolog 03
Aula Prolog 03
 

Semelhante a Curso de PHP - Objetos

Asp.Net Módulo3
Asp.Net  Módulo3Asp.Net  Módulo3
Asp.Net Módulo3
michellobo
 

Semelhante a Curso de PHP - Objetos (20)

PHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosPHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e Objetos
 
Programação C - Aula 1
Programação C - Aula 1Programação C - Aula 1
Programação C - Aula 1
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetos
 
Programação orientada a objetos – II
Programação orientada a objetos – IIProgramação orientada a objetos – II
Programação orientada a objetos – II
 
Classes Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções JavaClasses Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções Java
 
Java Básico :: Orientação a objetos
Java Básico :: Orientação a objetosJava Básico :: Orientação a objetos
Java Básico :: Orientação a objetos
 
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
 
Aula orientação a objetos
Aula orientação a objetosAula orientação a objetos
Aula orientação a objetos
 
Poo padadigmas
Poo padadigmasPoo padadigmas
Poo padadigmas
 
Uma Abordagem Prática de Orientação a Objetos com PHP (FLISOL DF 2011)
Uma Abordagem Prática de Orientação a Objetos com PHP (FLISOL DF 2011)Uma Abordagem Prática de Orientação a Objetos com PHP (FLISOL DF 2011)
Uma Abordagem Prática de Orientação a Objetos com PHP (FLISOL DF 2011)
 
AULA 1 - Classes e Objetos com codigicação Java.ppt
AULA 1 - Classes e Objetos com codigicação Java.pptAULA 1 - Classes e Objetos com codigicação Java.ppt
AULA 1 - Classes e Objetos com codigicação Java.ppt
 
AULA 1 - Classes e Objetos.ppt
AULA 1 - Classes e Objetos.pptAULA 1 - Classes e Objetos.ppt
AULA 1 - Classes e Objetos.ppt
 
3 orientacao-objetos
3 orientacao-objetos3 orientacao-objetos
3 orientacao-objetos
 
Lp3
Lp3Lp3
Lp3
 
Poo
PooPoo
Poo
 
Aula 1 - Linguagem III
Aula 1 - Linguagem IIIAula 1 - Linguagem III
Aula 1 - Linguagem III
 
Orientação a Objetos
Orientação a ObjetosOrientação a Objetos
Orientação a Objetos
 
Classes e objetos
Classes e objetosClasses e objetos
Classes e objetos
 
Orientação à objetos conceituação
Orientação à objetos   conceituaçãoOrientação à objetos   conceituação
Orientação à objetos conceituação
 
Asp.Net Módulo3
Asp.Net  Módulo3Asp.Net  Módulo3
Asp.Net Módulo3
 

Mais de Fabio Moura Pereira

Mais de Fabio Moura Pereira (17)

Aula Prolog 09 - Listas
Aula Prolog 09 - ListasAula Prolog 09 - Listas
Aula Prolog 09 - Listas
 
Programação Concorrente - Gerenciamento de Threads - Parte I
Programação Concorrente - Gerenciamento de Threads - Parte IProgramação Concorrente - Gerenciamento de Threads - Parte I
Programação Concorrente - Gerenciamento de Threads - Parte I
 
Programação Concorrente - Objetos e Concorrência
Programação Concorrente - Objetos e ConcorrênciaProgramação Concorrente - Objetos e Concorrência
Programação Concorrente - Objetos e Concorrência
 
Programação Concorrente - Introdução
Programação Concorrente - IntroduçãoProgramação Concorrente - Introdução
Programação Concorrente - Introdução
 
Aula Persistência 01 (Java)
Aula Persistência 01 (Java)Aula Persistência 01 (Java)
Aula Persistência 01 (Java)
 
Aula Tratamento de Exceções
Aula Tratamento de ExceçõesAula Tratamento de Exceções
Aula Tratamento de Exceções
 
Aula Interface Gráfica do Usuário
Aula Interface Gráfica do UsuárioAula Interface Gráfica do Usuário
Aula Interface Gráfica do Usuário
 
Aula Java Swing
Aula Java SwingAula Java Swing
Aula Java Swing
 
Aula - Interfaces e Estilos de Interação
Aula - Interfaces e Estilos de InteraçãoAula - Interfaces e Estilos de Interação
Aula - Interfaces e Estilos de Interação
 
Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)
Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)
Aula Desenvolvimento de Jogos - Game Engine (Motor de Jogos)
 
Padrões de Projeto de Software
Padrões de Projeto de SoftwarePadrões de Projeto de Software
Padrões de Projeto de Software
 
Curso de PHP - Arrays
Curso de PHP - ArraysCurso de PHP - Arrays
Curso de PHP - Arrays
 
Desenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game DesignDesenvolvimento de Jogos - Game Design
Desenvolvimento de Jogos - Game Design
 
Desenvolvimento de Jogos - Mercado Parte 2
Desenvolvimento de Jogos - Mercado Parte 2Desenvolvimento de Jogos - Mercado Parte 2
Desenvolvimento de Jogos - Mercado Parte 2
 
Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1Desenvolvimento de Jogos - Mercado Parte 1
Desenvolvimento de Jogos - Mercado Parte 1
 
PHP - Funções
PHP - FunçõesPHP - Funções
PHP - Funções
 
PHP - Introdução
PHP - IntroduçãoPHP - Introdução
PHP - Introdução
 

Último

PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
azulassessoria9
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médio
rosenilrucks
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
azulassessoria9
 
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
LeloIurk1
 
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
LeloIurk1
 
Os editoriais, reportagens e entrevistas.pptx
Os editoriais, reportagens e entrevistas.pptxOs editoriais, reportagens e entrevistas.pptx
Os editoriais, reportagens e entrevistas.pptx
TailsonSantos1
 
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
azulassessoria9
 
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdfGEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
RavenaSales1
 
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdfReta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
WagnerCamposCEA
 
matematica aula didatica prática e tecni
matematica aula didatica prática e tecnimatematica aula didatica prática e tecni
matematica aula didatica prática e tecni
CleidianeCarvalhoPer
 
Apresentação em Powerpoint do Bioma Catinga.pptx
Apresentação em Powerpoint do Bioma Catinga.pptxApresentação em Powerpoint do Bioma Catinga.pptx
Apresentação em Powerpoint do Bioma Catinga.pptx
LusGlissonGud
 

Último (20)

PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdfPROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
 
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdfApresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
Apresentação ISBET Jovem Aprendiz e Estágio 2023.pdf
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médio
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
 
Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!
 
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
 
planejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdfplanejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdf
 
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
 
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMPRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
 
Os editoriais, reportagens e entrevistas.pptx
Os editoriais, reportagens e entrevistas.pptxOs editoriais, reportagens e entrevistas.pptx
Os editoriais, reportagens e entrevistas.pptx
 
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
 
Análise poema país de abril (Mauel alegre)
Análise poema país de abril (Mauel alegre)Análise poema país de abril (Mauel alegre)
Análise poema país de abril (Mauel alegre)
 
Slides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptx
Slides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptxSlides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptx
Slides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptx
 
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdfGEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
 
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdfReta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
 
matematica aula didatica prática e tecni
matematica aula didatica prática e tecnimatematica aula didatica prática e tecni
matematica aula didatica prática e tecni
 
PRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdf
PRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdfPRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdf
PRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdf
 
Apresentação em Powerpoint do Bioma Catinga.pptx
Apresentação em Powerpoint do Bioma Catinga.pptxApresentação em Powerpoint do Bioma Catinga.pptx
Apresentação em Powerpoint do Bioma Catinga.pptx
 
Historia da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfHistoria da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdf
 

Curso de PHP - Objetos

  • 1. Curso de PHP – Objetos Fábio M. Pereira UNIVERSIDADE ESTADUAL DO SUDOESTE DA BAHIA – UESB UNIDADE ORGANIZACIONAL DE INFORMÁTICA - UINFOR
  • 2. Roteiro •Criando um Objeto •Acessando Propriedades e Métodos •Declarando Uma Classe •Introspecção •Serialização
  • 3. 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
  • 5. 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);
  • 6. 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
  • 8. 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");
  • 9. 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;
  • 10. 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
  • 11. 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.
  • 12. 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.
  • 13. 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
  • 15. 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
  • 16. Declarando Uma Classe •Sintaxe: class classname [ extends baseclass ] [ implements interfacename , [interfacename, ... ] ] { [ use traitname, [ traitname, ... ]; ] [ visibility $property [ = value ]; ... ] [ function functionname (args) { // code } ... ] }
  • 17. 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
  • 18. Declarando Métodos •Exemplo: class Person { public $name = ''; function getName() { return $this->name; } function setName($newName) { $this->name = $newName; } }
  • 19. 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();
  • 20. 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 } }
  • 21. 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
  • 22. 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}"; } }
  • 23. 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
  • 24. 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"; } }
  • 25. 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; } }
  • 26. 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; }
  • 27. 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;
  • 28. 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
  • 29. 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
  • 30. 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 }
  • 31. 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(); ... ] }
  • 32. 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..."; } }
  • 33. 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
  • 34. 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 } ... ] }
  • 35. 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:
  • 36. 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; } }
  • 37. 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
  • 38. 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 "firstn"; } } trait Second { public doSecond() { echo "secondn"; } } trait Third { use First, Second; public doAll() { $this->doFirst(); $this->doSecond(); } } class Combined { use Third; } $object = new Combined; $object->doAll(); first second
  • 39. Resolvendo Conflitos trait Command { function run() { echo "Executing a command"; } } trait Marathon { function run() { echo "Running a marathon"; } }
  • 40. 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
  • 41. 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
  • 42. Métodos Abstratos abstract class Component { abstract function printOutput(); } class ImageComponent extends Component { function printOutput() { echo "Pretty picture"; } }
  • 43. 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
  • 44. 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}"; } }
  • 45. 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);
  • 46. 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; } }
  • 47. 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
  • 48. 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; } }
  • 49. 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!"; } }
  • 51. 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.
  • 52. 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);
  • 53. 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
  • 54. 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);
  • 55. 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 />"; } }
  • 56. 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 />"; } }
  • 57. 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
  • 58. 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);
  • 59. 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
  • 60. 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; }
  • 61. 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; }
  • 62. 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; }
  • 63. 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; }
  • 65. 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
  • 66. 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
  • 67. 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
  • 68. 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"); }
  • 69. 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"); } }
  • 70. 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>"); }
  • 71. 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>
  • 72. 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>
  • 73. Curso de PHP – Objetos Fábio M. Pereira UNIVERSIDADE ESTADUAL DO SUDOESTE DA BAHIA – UESB UNIDADE ORGANIZACIONAL DE INFORMÁTICA - UINFOR