Professional Documents
Culture Documents
php5
AsnovidadesdoPHP5
PabloDall'Oglio
Solis
Cooperativadesolueslivres
www.solis.coop.br
ICISL,2003,CuribitaPR
IIISDSL,2004,Univates,LajeadoRS
OcaminhodoSWlivre,2005,CriscimaSC
VIFrumInt.SWLivre,2005,POARS
<pablo@php.net>
Histria
PHP/FI1PHP/FI2
1994RasmusLerdorf(PersonalHomePages);
PHP/FIFormInterpreter(CurriculumVitae);
Ferramentaparacriarpginasdinmicas;
PHP3PHP:HypertextPreprocessor
ZendEngine0.5:ZeevSuraskieAndiGutmans
Infraestrutura,Implementaasintxe;
Defineasregrasdeparse;
OO(arraysassociativos);
<pablo@php.net>
Histria
PHP4PHP:HypertextPreprocessor
ZendEngine1.0:ZeevSuraskieAndiGutmans
AbstraodoServidorWeb;
NovaAPI,extenses:PEAR,CLI,PHPGTK;
Cresimentorevolucionrio,mecanismolimitado;
ZendEngine2.0:
Muitotempoparaserescrito(escopogrande);
NovomodeloOO(private,public,abstract);
<pablo@php.net>
Consideraes
Extremamentefcildeutilizar;
Possivelmentealinguagemdescriptmaisutilizadanaweb;
VastaBibliografiaarespeito;
Muitasfunes(arquivos,arrays,strings,SimpleXML,DomXML,
Sax);
Muitasextenses(BD,FTP,LDAP,ZLIB,GD,PDF);
Pgsql,Ora,Mysql,Sqlserver,Sqlite,Firebird,Sybase,Frontbase,
Informix,ODBC,Dbase,SapDB,Adabas,DB2,dentreoutros.
Flexvel,norgida,permiteproceduraleOO;
<pablo@php.net>
ModelodeObjetos
Zend1.0:Objetostratadoscomovalores(int,str);
Ematribuies,parmetros,osobjetossocopiadosinteiramente;
Java:Omodelotrataoobjetocomoreferncia,novalor;
$objeto1 = $objeto2;
$objeto1
$objeto2
NovoModelo:Permitedestrutores,controlededuplicao,retornode
valoresreferncia;
NovoModelo:Quandosecriaumobjeto,seobtmumareferncia
(handler,ponteiro),enooobjetoemsi;
<pablo@php.net>
ModelodeObjetos
Parainstanciarobjetos:
<?php
// criar instancia
$objeto = new NomeDaClasse;
// chamada de mtodo
$objeto->NomeDoMetodo();
?>
<pablo@php.net>
ModelodeObjetos
<?php
# Classe
class Carro
{
// Mtodo
function setNome($valor)
{
$this->nome = $valor;
}
// Mtodo
function getNome()
{
return $this->nome;
}
}
# Funo
function trocaNome($obj)
{
$obj->setNome('plio');
}
?>
<pablo@php.net>
ModelodeObjetos
NovoModelo:Somenteoponteiroenviadoparafunes,atribuiesou
copiado,nuncaomesmoobjeto.Trabalhasobreoponteirodoobjeto(by
reference);
<?php
// criar instancia
$objeto = new Carro;
PHP4
// atribui nome
$objeto->setNome('gol');
PHP5
// chamada de funo
trocaNome($objeto);
// imprime propriedade
print $objeto->getNome();
?>
gol
plio
<pablo@php.net>
ModelodeObjetos
<?php
// Instancia a classe
$a = new Carro;
// Atribu um valor para $a
$a->Nome = 'Mille';
// Duplica o objeto
$b = $a;
$b->Nome = 'Plio';
// Exibe os objetos
echo $a->Nome;
echo $b->Nome;
// Verifica se so iguais
if ($a === $b)
echo 'So Iguais';
else
echo 'So Diferentes';
?>
PHP4
Mille
Plio
SoDiferentes
PHP5
Plio
Plio
SoIguais
<pablo@php.net>
Factory
Utilizar uma classe central para gerao de
objetos,novomodeloretornaexatamenteamesma
instnciaenoumarplica;
<?php
// Classe Factory
Class Factory
{
// Mtodos Factory
function CriarCliente($nome)
{
return new Cliente($nome);
}
}
// Instanciao
$Pedro = Factory::CriarCliente('Pedro');
$Maria = Factory::CriarCliente('Maria');
?>
<pablo@php.net>
Referenciandoobjetosretornados
Velhomodelo:
<?
$frame
= $botao->get_parent();
$janela = $frame->get_parent();
$janela->set_title('titulo');
?>
Novomodelo:
<?
$botao->get_parent()->get_parent()->set_title('titulo');
$obj->metodo()->metodo();
func()->metodo()->metodo();
$obj->metodo()->member->metodo();
?>
<pablo@php.net>
Referenciandoobjetosretornados
<?
# Classe Pessoa
Class Pessoa
{
function Pessoa($nome)
{
$this->nome = $nome;
}
function GetNome()
{
return $this->nome;
}
}
# Funo CriaPessoa
function CriaPessoa($nome)
{
return new Pessoa($nome);
}
?>
<pablo@php.net>
Referenciandoobjetosretornados
PHP4 :
$joao = CriaPessoa('Joao');
// Imprime o nome
echo $joao->GetNome();
PHP5 :
// Imprime o nome
echo CriaPessoa('Joao')->GetNome();
<pablo@php.net>
Clonagem
<pablo@php.net>
Clonagemdeobjetos
Velhomodelo:
Comoobjetotratadocomovalor,aduplicaofeitabitabit(cpia
idntica),nemsempreodesejvel(exemploGtkWindow>id);
$objetoB = $objetoA;
Seoobjetopaitiverumapropriedadequeumobjeto(composio),
duplicarofilhooufazeros2apontarparaomesmo?
Senoexistirafuno__clone(),usapadro:
Ou
$objetoB = clone $objetoA;
Pessoa<>Endereo
<pablo@php.net>
<?
// Classe Pessoa
Class Pessoa
{
static $codigo; // Propriedade esttica
// Mtodo de clonagem
function __clone()
{
$this->codigo = $this->codigo +1;
}
}
// Instanciar
$a = new Pessoa;
$a->codigo = 4;
// Clonar
$b = clone $a;
// Imprimir
echo $a->codigo; // 4
echo $b->codigo; // 5
?>
<pablo@php.net>
Construtores
PHP4
class Pessoa
{
function Pessoa($nome, $idade)
{
...
}
}
PHP5
class Pessoa
{
function __construct($nome, $idade)
{
...
}
}
$joao = new Pessoa('joaozinho', 11);
<pablo@php.net>
Destrutores
Utilidade:Debugmsg's,limpararquivostemporrios,chamadoantes
queoobjetosejaliberadodamemria;
<?
class ConexaoBancoDados
{
// Mtodo construtor
function __construct($host, $user, $pass)
{
$this->conn = mysql_connect($host, $user, $pass);
}
// Mtodo destrutor
function __destruct()
{
mysql_close($this->conn);
}
}
$a = new ConexaoBancoDados('127.0.0.1', 'eu', 'xyz');
?>
<pablo@php.net>
<?
class CestaDeCompras
{
function __construct()
{
echo "construindo...\n";
}
function __destruct()
{
echo "destruindo...\n";
}
}
class OutraCestaDeCompras extends CestaDeCompras
{
function __construct()
{
parent::__construct();
echo "construindo outra cesta\n";
}
}
Resultado
$a = new OutraCestaDeCompras;
?>
construindo...
construindooutracesta
destruindo...
<pablo@php.net>
Esquema de um Objeto
dados
mensagem
operaes
(mtodos)
que manipulam
os dados
<pablo@php.net>
<pablo@php.net>
Visibilidade
Novosconceitos,parapropriedadesemtodos:
private;
protected;
public;
<?
class Pessoa
{
protected $salario;
}
# Herana
class Empregado extends Pessoa
{
function GetSalario()
{
return $this->salario;
}
}
# Teste...
$joao = new Empregado;
echo $joao->GetSalario(); // ok
echo $joao->salario;
// no
?>
<pablo@php.net>
Propriedadesestticas
NoZE1.0,jexistiammtodosestticos,
PHP5instroduzaspropriedadesestticas:
<?
class Pessoa
{
// Propriedade esttica
static $qtde_instancias;
// Retorna Propriedade esttica
static function getQtde()
{
return self::$qtde_instancias;
}
}
?>
<pablo@php.net>
Propriedadesestticas
<?
// criar instancia
$joao = new Pessoa;
Pessoa::$qtde_instancias ++;
// criar instancia
$maria = new Pessoa;
Pessoa::$qtde_instancias ++;
// Imprime quantidade
print Pessoa::GetQtde();
Resultado
2
?>
<pablo@php.net>
Constantes
Constantes
<?
// Classe Pessoas
class Pessoas
{
const Numero = 5;
}
// imprime constante
echo Pessoas::Numero;
// Classe Maquinas
class Maquinas
{
const Numero = 5;
}
// imprime constante
echo Maquinas::Numero;
?>
<pablo@php.net>
Interceptadores
<pablo@php.net>
__set(),__get()e__call()
<?
class MinhaClasse
{
function __set($name, $value)
{
$this->$name = $value;
}
function __get($name)
{
return $this->$name;
}
function __call($metodo, $parametro)
{
// ...
}
}
?>
<pablo@php.net>
__set()
<?php
class Pessoa
{
private $Nascimento;
// Retorna a Data
function GetNascimento()
{
return $this->Nascimento;
}
// Intercepta a atribuio
function __set($nome, $valor)
{
if ($nome == 'Nascimento')
{
$partes = explode('/', $valor);
if (count($partes)==3)
$this->$nome = $valor;
}
}
}
?>
<pablo@php.net>
__set()
<?php
// Instancia Pessoa
$julia = new Pessoa;
// Atribui Nascimento
$julia->Nascimento = '04/03/1980';
echo $julia->GetNascimento() . "\n";
// Atribui Nascimento
$julia->Nascimento = '8 de maro';
echo $julia->GetNascimento() . "\n";
?>
Resultado
04/03/1980
04/03/1980
<pablo@php.net>
__get()
<?php
class Conta
{
private $Saldo;
private $Limite = 500;
// Altera o Saldo
function SetSaldo($valor)
{
return $this->Saldo = $valor;
}
}
?>
// Intercepta obteno
function __get($nome)
{
if ($nome == 'Saldo')
{
return $this->Saldo + $this->Limite;
}
}
<pablo@php.net>
__get()
<?php
// instancia
$contaCorrente = new Conta;
// altera saldo
$contaCorrente->SetSaldo(100);
echo $contaCorrente->Saldo;
// altera saldo
$contaCorrente->SetSaldo(260);
echo $contaCorrente->Saldo;
?>
Resultado
600
760
<pablo@php.net>
__call()
<?php
class Conta
{
private $Saldo;
private $Limite = 500;
// Altera o Saldo
function SetSaldo($valor)
{
return $this->Saldo = $valor;
}
// Intercepta obteno
function __call($nome, $parametros)
{
echo "Mtodo no existente\n";
echo $nome . ' - ' . $parametros[0];
}
}
?>
<pablo@php.net>
__call()
<?php
// instancia
$contaCorrente = new Conta;
// altera saldo
$contaCorrente->SetSaldo(100);
// altera conjugue
$contaCorrente->SetConjugue('Joana');
?>
Resultado
Mtodonoexistente
SetConjugueJoana
<pablo@php.net>
Abstract
<?
abstract class Pessoa
{
abstract function GetSalario();
// sobrecarga obrigatria
}
class
{
//
}
class
{
//
}
// ok
// no
<pablo@php.net>
Final
<?
final class Pessoa
{
final function GetSalario()
{
}
}
<pablo@php.net>
Interfaces
<?
interface IAutomovel
{
// class type hints
public function Ligar(motor $a);
}
class Palio implements IAutomovel
{
// public function Ligar(motor $a) { }
}
class Clio implements IAutomovel
{
// public function Ligar(motor $a) { }
}
?>
<pablo@php.net>
ManipulaodeErros
<?
// funo Hello
function Hello($nome = null)
{
if ($nome === null)
{
throw new Exception('falta parametro');
}
else
{
echo "Hello $nome\n";
}
}
Resultado
// TRY-CATCH
try
{
#1erro:faltaparam.
Hello();
Hello('John');
#2HelloJohn
}
catch(Exception $e)
{
echo "erro: " . $e->getMessage();
}
<pablo@php.net>
?>
SimpleXML
<pessoa>
<codigo> 5 </codigo>
<nome> Maria da Silva </nome>
<idade> 24 </idade>
</pessoa>
<?php
//carrega o arquivo
$xml = simplexml_load_file('teste.xml');
// acessa os dados XML
echo "Codigo: " . $xml->codigo . "\n";
echo "Nome:
" . $xml->nome . "\n";
echo "Idade: " . $xml->idade . "\n";
?>
Resultado
Codigo:5
Nome:MariadaSilva
Idade:25
<pablo@php.net>
SQLite
EmbutidonoPHP5;
Iniciadonoanode2000por
RichardHipp;
BancodeDadoscompostopor
simplesarquivos;
Subselect,triggers,transaes,
views,23xmaisrpidoque
MySQL,limitede2Terabytes,
viewssoreadonly,semforeign
keys;
<pablo@php.net>
SQLite
<?php
// Abre o BD (cria se no existir);
$db = sqlite_open("cidades.db");
// Consultas
$result = sqlite_query($db, "SELECT * from cidades");
// Retornando os dados
while ($row = sqlite_fetch_array($result))
{
print_r($row);
}
// Fecha a conexo
sqlite_close($db);
?>
<pablo@php.net>
WebServices
<pablo@php.net>
WebServices(exemplo.wsdl)
<?xml version ='1.0' encoding ='ISO-8859-1' ?>
<definitions name='Exemplo'>
<message name='getNomeRequest'>
<part name='codigo' type='xsd:string'/>
</message>
<message name='getNomeResponse'>
<part name='resultado' type='xsd:string[]'/>
</message>
<portType name='ExemploPortType'>
<operation name='getNome'>
<input message='tns:getNomeRequest'/>
<output message='tns:getNomeResponse'/>
</operation>
</portType>
... como o WebService ir ser codificado
... como o WebService ir ser transportado
</definitions>
<pablo@php.net>
WebServices(servidor)
<?php
function getNome($codigo)
{
// conecta ao Banco de Dados
$id = @pg_connect("dbname=samples user=postgres");
// realiza consulta ao Banco de Dados
$result = pg_query($id, "select * from clientes " .
"where codigo=$codigo");
$matriz = pg_fetch_all($result);
if ($matriz == null)
throw new SoapFault("Server",
"Cliente nao encontrado");
// retorna os dados.
return $matriz[0];
WebServices(cliente)
<?php
// instancia cliente SOAP
$client = new SoapClient("exemplo.wsdl");
try
{
}
catch (SoapFault $excecao) // ocorrncia de erro
{
echo "Erro: ";
echo $excecao->faultstring;
}
?>
<pablo@php.net>
PHPGTK2
<pablo@php.net>
Reuso
<pablo@php.net>
Ondeencontrar:
Novatec
TempoReal
LinuxMall
<pablo@php.net>
Creative Commons
Obrigado!
SebastianBergmann
WezFurlong
MarcusBoerger
?>
<pablo@php.net>
Referncias
URL
http://www.php.net
http://www.zend.com
http://www.solis.coop.br
http://www.phpgtk.org.br
http://www.varianet.com.br
EMail
pablo@php.net
pablo@dalloglio.net
pablo@solis.coop.br
<pablo@php.net>