You are on page 1of 50

<?

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

Functionario extends Pessoa


...
Estagiario extends Pessoa
...

$joao = new Funcionario;


$joao = new Pessoa;
?>

// ok
// no

<pablo@php.net>

Final
<?
final class Pessoa
{
final function GetSalario()
{
}
}

class Functionario extends Pessoa


{
// ...
}
# Classe final no pode ser herdada.
# Mtodo final no pode ser sobrecarregado.
?>

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

// instancia servidor SOAP


$server = new SoapServer("exemplo.wsdl");
$server->addFunction("getNome");
$server->handle();
<pablo@php.net>
?>

WebServices(cliente)
<?php
// instancia cliente SOAP
$client = new SoapClient("exemplo.wsdl");
try
{

// realiza chamada remota de mtodo


$retorno = $client->getNome(3);
echo $retorno['codigo'];
echo $retorno['nome'];
echo $retorno['telefone']

}
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

Estes slides esto disponveis sob a licena no comercial da


creative commons 1.0;
Voc pode distribuir, copiar, exibir e realizar outros trabalhos
seguindo estas condies:
Atribuio: Voc deve dar os crditos ao autor original;
No-Comercial: Voc no pode utilizar este trabalho para
propsitos comerciais;
No derivar trabalhos: Voc no pode alterar,
transformar, ou construir algo sobre este trabalho.
Para todo reuso ou distribuio, voc deve deixar explcito
para os outros, os termos da licena deste trabalho;
Estas condies podem ser alteradas se voc obter
permisso do autor;
O uso justo e outros direitos no so afetados pelas condies
acima.
<pablo@php.net>

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>

You might also like