SlideShare ist ein Scribd-Unternehmen logo
1 von 49
As Novidades do PHP5
Pablo Dall'Oglio
Adianti Solutions
www.adianti.com.br

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2
TalkLog
I CISL, 2003, Curibita-PR;
●
III SDSL, 2004, Univates, Lajeado-RS;
●O caminho do SW livre, 2005, Crisciúma-SC;
●
VI Fórum Int. SW Livre, 2005, POA-RS;
●

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
História
PHP/FI 1 PHP/FI 2
▪ 1994 Rasmus Lerdorf (Personal Home Pages);
▪ PHP/FI Form Interpreter (Curriculum Vitae);
▪ Ferramenta para criar páginas dinâmicas;
PHP 3 PHP: Hypertext Preprocessor
Zend Engine 0.5: Zeev Suraski e Andi Gutmans
▫ Infraestrutura, Implementa a sintáxe;
▫ Define as regras de parse;
▫ OO (arrays associativos);

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
História
PHP 4 PHP: Hypertext Preprocessor
▪ Zend Engine 1.0: Zeev Suraski e Andi Gutmans
▪ Abstração do Servidor Web;
▪ Nova API, extensões: PEAR, CLI, PHP-GTK;
▪ Cresimento revolucionário, mecanismo limitado;
Zend Engine 2.0:
▪ Muito tempo para ser escrito (escopo grande);
▪ Novo modelo OO (private, public, abstract);

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Considerações
• Extremamente fácil de utilizar;
• Possivelmente a linguagem de script mais utilizada na
web;
• Vasta Bibliografia a respeito;
• Muitas funções (arquivos, arrays, strings, SimpleXML,
DomXML, Sax);
• Muitas extensões (BD, FTP, LDAP, ZLIB, GD, PDF);
▪ Pgsql, Ora, Mysql, Sqlserver, Sqlite, Firebird, Sybase,
Frontbase, Informix, ODBC, Dbase, SapDB, Adabas,
DB2, dentre outros.
• Flexível, não-rígida, permite procedural e OO;

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Modelo de Objetos
Zend 1.0: Objetos tratados como valores (int, str);
Em atribuições, parâmetros, os objetos são copiados
inteiramente;
Java: O modelo trata o objeto como referência, não valor;
$objeto1 = $objeto2;

$objeto1
$objeto2
Novo Modelo: Permite destrutores, controle de duplicação,
retorno de valores referência;
Novo Modelo: Quando se cria um objeto, se obtém uma
referência (handler, ponteiro), e não o objeto em si;
Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Modelo de Objetos

Para instanciar objetos:
<?php
// criar instancia
$objeto = new NomeDaClasse;
// chamada de método
$objeto->NomeDoMetodo();
?>

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Modelo de Objetos
<?php
# Classe
class Carro
{
// Método
function setNome($valor)
{
$this->nome = $valor;
}
// Método
function getNome()
{
return $this->nome;
}
}
# Função
function trocaNome($obj)
{
$obj->setNome('pálio');
}
?>
Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Modelo de Objetos
Novo Modelo: Somente o ponteiro é enviado para funções,
atribuições ou copiado, nunca o mesmo objeto. Trabalha
sobre o ponteiro do objeto (by reference);

PHP4

<?php
// criar instancia
$objeto = new Carro;

gol

// atribui nome
$objeto->setNome('gol');

PHP5

// chamada de função

pálio

trocaNome($objeto);
// imprime propriedade
print $objeto->getNome();
?>
// PHP4 com & = mesmo resultado
Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Modelo de Objetos
<?php
// Instancia a classe
$a = new Carro;
// Atribu um valor para $a
$a->Nome  = 'Mille';

PHP4

// Duplica o objeto
$b = $a;

Mille
Pálio
São Diferentes

$b->Nome = 'Pálio';
// Exibe os objetos
echo $a->Nome;
echo $b->Nome;

PHP5

// Verifica se são iguais
if ($a === $b)
echo 'São Iguais';
else
echo 'São Diferentes';

Pálio
Pálio
São Iguais

?>

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Factory
Utilizar uma classe central para
geração de objetos, novo modelo retorna
exatamente a mesma instância e não
uma réplica;
<?php
// Classe Factory
Class Factory
{

}

// Métodos Factory
function CriarCliente($nome)
{
return new Cliente($nome);
}

// Instanciação
$Pedro = Factory::CriarCliente('Pedro');
$Maria = Factory::CriarCliente('Maria');
?>

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Referenciando objetos retornados

Velho modelo:
<?
$frame

= $botao->get_parent();

$janela = $frame->get_parent();
$janela->set_title('titulo');
?>

Novo modelo:
<?
$botao->get_parent()->get_parent()->set_title('titulo');
$obj->metodo()->metodo();
func()->metodo()->metodo();
$obj->metodo()->member->metodo();
?>

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Referenciando objetos retornados
<?
# Classe Pessoa
Class Pessoa
{
function Pessoa($nome)
{
$this->nome = $nome;
}
function GetNome()
{
return $this->nome;
}
}
# Função CriaPessoa
function CriaPessoa($nome)
{
return new Pessoa($nome);
}
?>
Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Referenciando objetos retornados

PHP4 :
$joao = CriaPessoa('Joao');
// Imprime o nome
echo $joao->GetNome();

PHP5 :
// Imprime o nome
echo CriaPessoa('Joao')->GetNome();

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Clonagem

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Clonagem
Velho modelo:
Como objeto é tratado como valor, a duplicação é feita bit-a-bit
(cópia idêntica), nem sempre o desejável (GtkWindow->id);
$objetoB = $objetoA;
Se o objeto pai tiver uma propriedade que é um objeto
(composição), duplicar o filho ou fazer os 2 apontar para o
mesmo ?
Se não existir a função __clone(), usa padrão:
Ou

$objetoB = clone $objetoA;
Pessoa--<>------Endereço

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Clonagem
<?
// Classe Pessoa
Class Pessoa
{
static $codigo; // Propriedade estática

}

// Método 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 Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Construtores

PHP4
class Pessoa
{
function Pessoa($nome, $idade)
{
...
}

}

PHP5
class Pessoa
{
function __construct($nome, $idade)
{
...
}

}

$joao = new Pessoa('joaozinho', 11);

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Destrutores
Utilidade: Debug msg's, limpar arquivos temporários, é chamado
antes que o objeto seja liberado da memória;
<?
class ConexaoBancoDados
{
// Método construtor
function __construct($host, $user, $pass)
{
$this->conn = mysql_connect($host, $user, $pass);
}
// Método destrutor
function __destruct()
{
mysql_close($this->conn);
}
}
$a = new ConexaoBancoDados('127.0.0.1', 'eu', 'xyz');
?>

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Destrutores
<?
class CestaDeCompras
{
function __construct()
{
echo "construindo...n";
}
function __destruct()
{
echo "destruindo...n";
}
}
class OutraCestaDeCompras extends CestaDeCompras
{
function __construct()
{
parent::__construct();
echo "construindo outra cestan";
}
construindo...
}

Resultado

construindo outra cesta
destruindo...

$a = new OutraCestaDeCompras;
?>
Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Esquema de um Objeto

dados

mensagem

operações
(métodos)
que manipulam
os dados
Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Visibilidade
Novos conceitos, para propriedades e métodos:
• private;
<?
class Pessoa
• protected;
{
protected $salario;
• public;
}

# Herança
class Empregado extends Pessoa
{
function GetSalario()
{
return $this->salario;
}
}
# Teste...
$joao = new Empregado;
echo $joao->GetSalario(); // ok
echo $joao->salario;      // não
?>
Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Propriedades Estáticas
No ZE 1.0, já existiam métodos estáticos,
PHP5 instroduz as propriedades estáticas:
<?
class Pessoa
{
// Propriedade estática
static $qtde_instancias;

}
?>

// Retorna Propriedade estática
static function getQtde()
{
return self::$qtde_instancias;
}

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Propriedades Estáticas
<?
// criar instancia
$joao = new Pessoa;
Pessoa::$qtde_instancias ++;
// criar instancia
$maria = new Pessoa;
Pessoa::$qtde_instancias ++;

Resultado

// Imprime quantidade
print Pessoa::GetQtde();

2

?>

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Cosntantes
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 Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Interceptadores

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
__set(), __get() e __call()
<?
class MinhaClasse
{
function __set($name, $value)
{
$this->$name = $value;
}
function __get($name)
{
return $this->$name;
}

}
?>

function __call($metodo, $parametro)
{
// ...
}

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
__set()
<?php
class Pessoa
{
private $Nascimento;
// Retorna a Data
function GetNascimento()
{
return $this->Nascimento;
}
// Intercepta a atribuição
function __set($nome, $valor)
{
if ($nome == 'Nascimento')
{
$partes = explode('/', $valor);
if (count($partes)==3)
$this->$nome = $valor;
}
}
}
?>

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
__set()
<?php
// Instancia Pessoa
$julia = new Pessoa;
// Atribui Nascimento
$julia->Nascimento = '04/03/1980';
echo $julia->GetNascimento() . "n";
// Atribui Nascimento
$julia->Nascimento = '8 de março';
echo $julia->GetNascimento() . "n";
?>
Resultado

04/03/1980
04/03/1980
Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
__get()
<?php
class Conta
{
private $Saldo;
private $Limite = 500;
// Altera o Saldo
function SetSaldo($valor)
{
return $this->Saldo = $valor;
}

}
?>

// Intercepta obtenção
function __get($nome)
{
if ($nome == 'Saldo')
{
return $this->Saldo + $this->Limite;
}
}

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
__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 Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
__call()
<?php
class Conta
{
private $Saldo;
private $Limite = 500;
// Altera o Saldo
function SetSaldo($valor)
{
return $this->Saldo = $valor;
}
// Intercepta obtenção
function __call($nome, $parametros)
{
echo "Método não existenten";
echo $nome . ' - ' . $parametros[0];
}
}
?>
Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
__call()
<?php
// instancia
$contaCorrente = new Conta;
// altera saldo
$contaCorrente->SetSaldo(100);
// altera conjugue
$contaCorrente->SetConjugue('Joana');
?>

Resultado

Método não existente
SetConjugue - Joana

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Abstract
<?
abstract class Pessoa
{
abstract function GetSalario();
// sobrecarga obrigatória
}
class Functionario extends Pessoa
{
// ...
}
class Estagiario extends Pessoa
{
// ...
}
$joao = new Funcionario;
$joao = new Pessoa;        
?>

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

// ok
// não

+

=
Final
<?
final class Pessoa
{
final function GetSalario()
{
}
}
class Functionario extends Pessoa
{
   // ...
}
# Classe final não pode ser herdada.
# Método final não pode ser sobrecarregado.
?>

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
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 Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Manipulação de Erros
<?
// função Hello
function Hello($nome = null)
{
if ($nome === null)
{
throw new Exception('falta parametro');
}
else
{
echo "Hello $nomen";
}
}
// TRY-CATCH
try
{
Hello();
Hello('John');
}
catch(Exception $e)
{
echo "erro: " . $e->getMessage();
}
?>
Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

Resultado

#1 erro: falta param.
#2 “Hello John”

=
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 : Maria da Silva
Idade : 25
Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
SQLite
• Embutido no PHP5;
• Iniciado no ano de 2000 por
Richard Hipp;
• Banco de Dados composto
por simples arquivos;
• Subselect, triggers,
transações, views, 2-3x
mais rápido que MySQL,
limite de 2 Terabytes,
views são read-only, sem
foreign keys;

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
SQLite
<?php
// Abre o BD (cria se não 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 conexão
sqlite_close($db);
?>

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Web Services

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Web Services
<?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 Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Web Services
<?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 Dall'Oglio [pablo@php.net]
PHP-GTK2

+

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

// realiza chamada remota de método
$retorno = $client->getNome(3);
echo $retorno['codigo'];
echo $retorno['nome'];
echo $retorno['telefone']

}
catch (SoapFault $excecao) // ocorrência de erro
{
echo "Erro: ";
echo $excecao->faultstring;
}
?>

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Reuso

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Referências

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Obrigado!

E-Mail
pablo@php.net
pablo@dalloglio.net

URL
http://www.php-gtk.com.br
http://www.adianti.com.br
http://www.pablo.blog.br

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=
Creative Commons

Estes slides estão disponíveis sob a licença não comercial da
creative commons 1.0;
• Você pode distribuir, copiar, exibir e realizar outros trabalhos
seguindo estas condições:
▪ Atribuição: Você deve dar os créditos ao autor original;
▪ Não-Comercial: Você não pode utilizar este trabalho para
propósitos comerciais;
▪ Não derivar trabalhos: Você não pode alterar, transformar, ou
construir algo sobre este trabalho.
▪ Para todo reuso ou distribuição, você deve deixar explícito para
os outros, os termos da licença deste trabalho;
▪ Estas condições podem ser alteradas se você obter permissão do
autor;
• O uso justo e outros direitos não são afetados pelas condições
acima.
•

Pablo Dall'Oglio [pablo@php.net]
PHP-GTK2

+

=

Weitere ähnliche Inhalte

Was ist angesagt?

Implementando enterprise patterns com PHP
Implementando enterprise patterns com PHPImplementando enterprise patterns com PHP
Implementando enterprise patterns com PHPPablo Dall'Oglio
 
Clean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHPClean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHPRafael Neris
 
(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota(Portuguese) Java EE Poliglota
(Portuguese) Java EE PoliglotaPhil Calçado
 
Web2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com PythonWeb2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com Pythonchackero
 
Treinamento Básico de Django
Treinamento Básico de DjangoTreinamento Básico de Django
Treinamento Básico de DjangoLeandro Zanuz
 
Técnicas de Refactorización (EN ESPANOL)
Técnicas de Refactorización (EN ESPANOL)Técnicas de Refactorización (EN ESPANOL)
Técnicas de Refactorización (EN ESPANOL)Rodrigo Branas
 
Desenvolvendo mvp com python
Desenvolvendo mvp com pythonDesenvolvendo mvp com python
Desenvolvendo mvp com pythonBruno Rocha
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosRodrigo Nossal
 
Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014Paulo Victor Gomes
 
(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol Gyn(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol GynLuís Cobucci
 
Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de RefactoringRodrigo Branas
 
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação WebDjango Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação Webantonio sérgio nogueira
 
Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01joaocarlobarros
 

Was ist angesagt? (20)

Implementando enterprise patterns com PHP
Implementando enterprise patterns com PHPImplementando enterprise patterns com PHP
Implementando enterprise patterns com PHP
 
Solid
SolidSolid
Solid
 
Clean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHPClean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHP
 
(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota
 
Trabalhando com as views do Web2Py
Trabalhando com as views do Web2PyTrabalhando com as views do Web2Py
Trabalhando com as views do Web2Py
 
Web2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com PythonWeb2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com Python
 
PHP e Redis
PHP e RedisPHP e Redis
PHP e Redis
 
Treinamento Básico de Django
Treinamento Básico de DjangoTreinamento Básico de Django
Treinamento Básico de Django
 
Técnicas de Refactorización (EN ESPANOL)
Técnicas de Refactorización (EN ESPANOL)Técnicas de Refactorización (EN ESPANOL)
Técnicas de Refactorización (EN ESPANOL)
 
Desenvolvendo mvp com python
Desenvolvendo mvp com pythonDesenvolvendo mvp com python
Desenvolvendo mvp com python
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutos
 
Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014
 
Django
DjangoDjango
Django
 
Aula javascript
Aula  javascriptAula  javascript
Aula javascript
 
(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol Gyn(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol Gyn
 
Javascript aula 01 - visão geral
Javascript   aula 01 - visão geralJavascript   aula 01 - visão geral
Javascript aula 01 - visão geral
 
Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2
 
Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de Refactoring
 
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação WebDjango Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
 
Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01
 

Ähnlich wie As novidades do PHP5 (2005)

Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1Israel Messias
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Michael Castillo Granados
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - FlisolLeonn Leite
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5garux
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que pareceImpacta Eventos
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkMarcelo Rodrigo
 
PHP robusto com Zend Framework
PHP robusto com Zend FrameworkPHP robusto com Zend Framework
PHP robusto com Zend FrameworkJaime Neto
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 
Introducao a orientacao a objetos com PHP
Introducao a orientacao a objetos com PHPIntroducao a orientacao a objetos com PHP
Introducao a orientacao a objetos com PHPguilhermemar
 
ReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPLuis Gustavo Almeida
 
5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHPAugusto das Neves
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7iMasters
 
PHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosPHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosGeorge Mendonça
 

Ähnlich wie As novidades do PHP5 (2005) (20)

Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - Flisol
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
 
PHP ao Extremo
PHP ao ExtremoPHP ao Extremo
PHP ao Extremo
 
Prog web 06-php-oo
Prog web 06-php-ooProg web 06-php-oo
Prog web 06-php-oo
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 
PHP robusto com Zend Framework
PHP robusto com Zend FrameworkPHP robusto com Zend Framework
PHP robusto com Zend Framework
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Introducao a orientacao a objetos com PHP
Introducao a orientacao a objetos com PHPIntroducao a orientacao a objetos com PHP
Introducao a orientacao a objetos com PHP
 
Migrando para o PHP 5
Migrando para o PHP 5Migrando para o PHP 5
Migrando para o PHP 5
 
PHP GERAL
PHP GERALPHP GERAL
PHP GERAL
 
ReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHP
 
5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP
 
PHP 7
PHP 7PHP 7
PHP 7
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7
 
Dev Ext PHP
Dev Ext PHPDev Ext PHP
Dev Ext PHP
 
PHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosPHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e Objetos
 

As novidades do PHP5 (2005)

  • 1. As Novidades do PHP5 Pablo Dall'Oglio Adianti Solutions www.adianti.com.br Pablo Dall'Oglio [pablo@php.net] PHP-GTK2
  • 2. TalkLog I CISL, 2003, Curibita-PR; ● III SDSL, 2004, Univates, Lajeado-RS; ●O caminho do SW livre, 2005, Crisciúma-SC; ● VI Fórum Int. SW Livre, 2005, POA-RS; ● Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 3. História PHP/FI 1 PHP/FI 2 ▪ 1994 Rasmus Lerdorf (Personal Home Pages); ▪ PHP/FI Form Interpreter (Curriculum Vitae); ▪ Ferramenta para criar páginas dinâmicas; PHP 3 PHP: Hypertext Preprocessor Zend Engine 0.5: Zeev Suraski e Andi Gutmans ▫ Infraestrutura, Implementa a sintáxe; ▫ Define as regras de parse; ▫ OO (arrays associativos); Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 4. História PHP 4 PHP: Hypertext Preprocessor ▪ Zend Engine 1.0: Zeev Suraski e Andi Gutmans ▪ Abstração do Servidor Web; ▪ Nova API, extensões: PEAR, CLI, PHP-GTK; ▪ Cresimento revolucionário, mecanismo limitado; Zend Engine 2.0: ▪ Muito tempo para ser escrito (escopo grande); ▪ Novo modelo OO (private, public, abstract); Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 5. Considerações • Extremamente fácil de utilizar; • Possivelmente a linguagem de script mais utilizada na web; • Vasta Bibliografia a respeito; • Muitas funções (arquivos, arrays, strings, SimpleXML, DomXML, Sax); • Muitas extensões (BD, FTP, LDAP, ZLIB, GD, PDF); ▪ Pgsql, Ora, Mysql, Sqlserver, Sqlite, Firebird, Sybase, Frontbase, Informix, ODBC, Dbase, SapDB, Adabas, DB2, dentre outros. • Flexível, não-rígida, permite procedural e OO; Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 6. Modelo de Objetos Zend 1.0: Objetos tratados como valores (int, str); Em atribuições, parâmetros, os objetos são copiados inteiramente; Java: O modelo trata o objeto como referência, não valor; $objeto1 = $objeto2; $objeto1 $objeto2 Novo Modelo: Permite destrutores, controle de duplicação, retorno de valores referência; Novo Modelo: Quando se cria um objeto, se obtém uma referência (handler, ponteiro), e não o objeto em si; Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 7. Modelo de Objetos Para instanciar objetos: <?php // criar instancia $objeto = new NomeDaClasse; // chamada de método $objeto->NomeDoMetodo(); ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 8. Modelo de Objetos <?php # Classe class Carro { // Método function setNome($valor) { $this->nome = $valor; } // Método function getNome() { return $this->nome; } } # Função function trocaNome($obj) { $obj->setNome('pálio'); } ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 9. Modelo de Objetos Novo Modelo: Somente o ponteiro é enviado para funções, atribuições ou copiado, nunca o mesmo objeto. Trabalha sobre o ponteiro do objeto (by reference); PHP4 <?php // criar instancia $objeto = new Carro; gol // atribui nome $objeto->setNome('gol'); PHP5 // chamada de função pálio trocaNome($objeto); // imprime propriedade print $objeto->getNome(); ?> // PHP4 com & = mesmo resultado Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 10. Modelo de Objetos <?php // Instancia a classe $a = new Carro; // Atribu um valor para $a $a->Nome  = 'Mille'; PHP4 // Duplica o objeto $b = $a; Mille Pálio São Diferentes $b->Nome = 'Pálio'; // Exibe os objetos echo $a->Nome; echo $b->Nome; PHP5 // Verifica se são iguais if ($a === $b) echo 'São Iguais'; else echo 'São Diferentes'; Pálio Pálio São Iguais ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 11. Factory Utilizar uma classe central para geração de objetos, novo modelo retorna exatamente a mesma instância e não uma réplica; <?php // Classe Factory Class Factory { } // Métodos Factory function CriarCliente($nome) { return new Cliente($nome); } // Instanciação $Pedro = Factory::CriarCliente('Pedro'); $Maria = Factory::CriarCliente('Maria'); ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 12. Referenciando objetos retornados Velho modelo: <? $frame = $botao->get_parent(); $janela = $frame->get_parent(); $janela->set_title('titulo'); ?> Novo modelo: <? $botao->get_parent()->get_parent()->set_title('titulo'); $obj->metodo()->metodo(); func()->metodo()->metodo(); $obj->metodo()->member->metodo(); ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 13. Referenciando objetos retornados <? # Classe Pessoa Class Pessoa { function Pessoa($nome) { $this->nome = $nome; } function GetNome() { return $this->nome; } } # Função CriaPessoa function CriaPessoa($nome) { return new Pessoa($nome); } ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 14. Referenciando objetos retornados PHP4 : $joao = CriaPessoa('Joao'); // Imprime o nome echo $joao->GetNome(); PHP5 : // Imprime o nome echo CriaPessoa('Joao')->GetNome(); Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 16. Clonagem Velho modelo: Como objeto é tratado como valor, a duplicação é feita bit-a-bit (cópia idêntica), nem sempre o desejável (GtkWindow->id); $objetoB = $objetoA; Se o objeto pai tiver uma propriedade que é um objeto (composição), duplicar o filho ou fazer os 2 apontar para o mesmo ? Se não existir a função __clone(), usa padrão: Ou $objetoB = clone $objetoA; Pessoa--<>------Endereço Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 17. Clonagem <? // Classe Pessoa Class Pessoa { static $codigo; // Propriedade estática } // Método 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 Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 18. Construtores PHP4 class Pessoa { function Pessoa($nome, $idade) { ... } } PHP5 class Pessoa { function __construct($nome, $idade) { ... } } $joao = new Pessoa('joaozinho', 11); Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 19. Destrutores Utilidade: Debug msg's, limpar arquivos temporários, é chamado antes que o objeto seja liberado da memória; <? class ConexaoBancoDados { // Método construtor function __construct($host, $user, $pass) { $this->conn = mysql_connect($host, $user, $pass); } // Método destrutor function __destruct() { mysql_close($this->conn); } } $a = new ConexaoBancoDados('127.0.0.1', 'eu', 'xyz'); ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 20. Destrutores <? class CestaDeCompras { function __construct() { echo "construindo...n"; } function __destruct() { echo "destruindo...n"; } } class OutraCestaDeCompras extends CestaDeCompras { function __construct() { parent::__construct(); echo "construindo outra cestan"; } construindo... } Resultado construindo outra cesta destruindo... $a = new OutraCestaDeCompras; ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 21. Esquema de um Objeto dados mensagem operações (métodos) que manipulam os dados Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 23. Visibilidade Novos conceitos, para propriedades e métodos: • private; <? class Pessoa • protected; { protected $salario; • public; } # Herança class Empregado extends Pessoa { function GetSalario() { return $this->salario; } } # Teste... $joao = new Empregado; echo $joao->GetSalario(); // ok echo $joao->salario;      // não ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 24. Propriedades Estáticas No ZE 1.0, já existiam métodos estáticos, PHP5 instroduz as propriedades estáticas: <? class Pessoa { // Propriedade estática static $qtde_instancias; } ?> // Retorna Propriedade estática static function getQtde() { return self::$qtde_instancias; } Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 25. Propriedades Estáticas <? // criar instancia $joao = new Pessoa; Pessoa::$qtde_instancias ++; // criar instancia $maria = new Pessoa; Pessoa::$qtde_instancias ++; Resultado // Imprime quantidade print Pessoa::GetQtde(); 2 ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 26. Cosntantes 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 Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 28. __set(), __get() e __call() <? class MinhaClasse { function __set($name, $value) { $this->$name = $value; } function __get($name) { return $this->$name; } } ?> function __call($metodo, $parametro) { // ... } Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 29. __set() <?php class Pessoa { private $Nascimento; // Retorna a Data function GetNascimento() { return $this->Nascimento; } // Intercepta a atribuição function __set($nome, $valor) { if ($nome == 'Nascimento') { $partes = explode('/', $valor); if (count($partes)==3) $this->$nome = $valor; } } } ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 30. __set() <?php // Instancia Pessoa $julia = new Pessoa; // Atribui Nascimento $julia->Nascimento = '04/03/1980'; echo $julia->GetNascimento() . "n"; // Atribui Nascimento $julia->Nascimento = '8 de março'; echo $julia->GetNascimento() . "n"; ?> Resultado 04/03/1980 04/03/1980 Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 31. __get() <?php class Conta { private $Saldo; private $Limite = 500; // Altera o Saldo function SetSaldo($valor) { return $this->Saldo = $valor; } } ?> // Intercepta obtenção function __get($nome) { if ($nome == 'Saldo') { return $this->Saldo + $this->Limite; } } Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 32. __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 Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 33. __call() <?php class Conta { private $Saldo; private $Limite = 500; // Altera o Saldo function SetSaldo($valor) { return $this->Saldo = $valor; } // Intercepta obtenção function __call($nome, $parametros) { echo "Método não existenten"; echo $nome . ' - ' . $parametros[0]; } } ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 34. __call() <?php // instancia $contaCorrente = new Conta; // altera saldo $contaCorrente->SetSaldo(100); // altera conjugue $contaCorrente->SetConjugue('Joana'); ?> Resultado Método não existente SetConjugue - Joana Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 35. Abstract <? abstract class Pessoa { abstract function GetSalario(); // sobrecarga obrigatória } class Functionario extends Pessoa { // ... } class Estagiario extends Pessoa { // ... } $joao = new Funcionario; $joao = new Pessoa;         ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 // ok // não + =
  • 36. Final <? final class Pessoa { final function GetSalario() { } } class Functionario extends Pessoa {    // ... } # Classe final não pode ser herdada. # Método final não pode ser sobrecarregado. ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 37. 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 Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 38. Manipulação de Erros <? // função Hello function Hello($nome = null) { if ($nome === null) { throw new Exception('falta parametro'); } else { echo "Hello $nomen"; } } // TRY-CATCH try { Hello(); Hello('John'); } catch(Exception $e) { echo "erro: " . $e->getMessage(); } ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + Resultado #1 erro: falta param. #2 “Hello John” =
  • 39. 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 : Maria da Silva Idade : 25 Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 40. SQLite • Embutido no PHP5; • Iniciado no ano de 2000 por Richard Hipp; • Banco de Dados composto por simples arquivos; • Subselect, triggers, transações, views, 2-3x mais rápido que MySQL, limite de 2 Terabytes, views são read-only, sem foreign keys; Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 41. SQLite <?php // Abre o BD (cria se não 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 conexão sqlite_close($db); ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 42. Web Services Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 43. Web Services <?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 Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 44. Web Services <?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 Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 45. Web Services <?php // instancia cliente SOAP $client = new SoapClient("exemplo.wsdl"); try { // realiza chamada remota de método $retorno = $client->getNome(3); echo $retorno['codigo']; echo $retorno['nome']; echo $retorno['telefone'] } catch (SoapFault $excecao) // ocorrência de erro { echo "Erro: "; echo $excecao->faultstring; } ?> Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =
  • 49. Creative Commons Estes slides estão disponíveis sob a licença não comercial da creative commons 1.0; • Você pode distribuir, copiar, exibir e realizar outros trabalhos seguindo estas condições: ▪ Atribuição: Você deve dar os créditos ao autor original; ▪ Não-Comercial: Você não pode utilizar este trabalho para propósitos comerciais; ▪ Não derivar trabalhos: Você não pode alterar, transformar, ou construir algo sobre este trabalho. ▪ Para todo reuso ou distribuição, você deve deixar explícito para os outros, os termos da licença deste trabalho; ▪ Estas condições podem ser alteradas se você obter permissão do autor; • O uso justo e outros direitos não são afetados pelas condições acima. • Pablo Dall'Oglio [pablo@php.net] PHP-GTK2 + =