SlideShare uma empresa Scribd logo
Novas Funcionalidades no PHP 5.3
            Douglas V. Pasqua
          Zend Certified Engineer
        douglas.pasqua@gmail.com




                           http://dpasqua.wordpress.com
Objetivo
Conhecer as principais funcionalidades incluídas no PHP
 5.3
Exemplos de códigos PHP das novas funcionalidades
Melhores práticas de programação ao se trabalhar com os
 novos recursos




                                   http://dpasqua.wordpress.com
Tópicos
Namespaces
Static Late Bindings
Lambda e Closures
Arquivos Phar
mysqlnd – MySQL Native Driver
Outras melhorias




                                 http://dpasqua.wordpress.com
Namespaces – Características
Agrupar classes, funções e constantes em pacotes
 (namespaces)
Possibilita mais de um classe/função/constante com o
 mesmo nome, porém em diferentes namespaces
Diminui o número de prefixos usados nos nomes das
 classes/funções e constantes
Deixa o código mais limpo e legível




                                       http://dpasqua.wordpress.com
Namespaces – Definição
Determinando um namespace para um arquivo PHP
A diretiva namespace deve ser declarada antes de qualquer
 outro código php ou caractéres na saída padrão

  <?php
  namespace exemplo;




                                   http://dpasqua.wordpress.com
Namespaces – Exemplo
Arquivo UsuarioBlog.php
  <?php
  namespace Blog;

  class Usuario {
  private $nome;

  public function setNome ($nome) {
     $this->nome = $nome;
  }

  public function getNome() {
     return "Usuário Atual do Blog é " . $this->nome;
  }
  }




                                      http://dpasqua.wordpress.com
Namespaces – Exemplo
Arquivo UsuarioCms.php
  <?php
  namespace Cms;

  class Usuario {
  private $nome;

  public function setNome ($nome) {
     $this->nome = $nome;
  }

  public function getNome() {
     return "Usuário Atual do Cms é " . $this->nome;
  }
  }




                                      http://dpasqua.wordpress.com
Namespaces – Exemplo
Acessando as classes “Usuario” de acordo com o
 namespace.
  // incluíndo os arquivos das classes 'Usuarios'
  require_once("UserBlog.php");
  require_once("UserCms.php");




                                    http://dpasqua.wordpress.com
Namespaces – Exemplo
Acessando as classes “Usuario” de acordo com o
 namespace.
  // incluíndo os arquivos das classes 'Usuarios'
  require_once("UserBlog.php");
  require_once("UserCms.php");

  // Instancinado a classe Usuario no namespace Blog
  $usuario = new BlogUsuario();
  $usuario->setNome("Douglas");
  echo $usuario->getNome() . PHP_EOL;
  // Usuário Atual do Blog é Douglas




                                    http://dpasqua.wordpress.com
Namespaces – Exemplo
Acessando as classes “Usuario” de acordo com o
 namespace.
  // incluíndo os arquivos das classes 'Usuarios'
  require_once("UserBlog.php");
  require_once("UserCms.php");

  // Instancinado a classe Usuario no namespace Blog
  $usuario = new BlogUsuario();
  $usuario->setNome("Douglas");
  echo $usuario->getNome() . PHP_EOL;
  // Usuário Atual do Blog é Douglas

  // Instancinado a classe Usuario no namespace Cms
  $usuario1 = new CmsUsuario();
  $usuario1->setNome("Douglas");
  echo $usuario1->getNome() . PHP_EOL;
  // Usuário Atual do Cms é Douglas


                                    http://dpasqua.wordpress.com
Namespaces – Utilizando
Nome qualificado absoluto
  $a = new BlogUsuario();
  $b = new CmsUsuario();




                              http://dpasqua.wordpress.com
Namespaces – Utilizando
Nome qualificado absoluto
  $a = new BlogUsuario();
  $b = new CmsUsuario();


Nome não-qualificado
  namespace Blog;
  $a = new Usuario();   // BlogUsuario




                                     http://dpasqua.wordpress.com
Namespaces – Utilizando
Nome qualificado absoluto
  $a = new BlogUsuario();
  $b = new CmsUsuario();


Nome não-qualificado
  namespace Blog;
  $a = new Usuario();   // BlogUsuario


Nome qualificado relativo

  namespace Empresa;
  $a = new BlogUsuario(); // EmpresaBlogUsuario
  // Erro pois classe não existe neste namespace



                                     http://dpasqua.wordpress.com
Namespaces – Import e Alias
A finalidade do Alias é criar um nome mais curto para
 referenciar um elemento
A palavra-chave para import e alias é “use”

  use BlogUsuario as BlogUsuario;
  use CmsUsuario;

  $u1 = new BlogUsuario(); // alias referenciando
  BlogUsuario();
  $u2 = new Usuario(); // alias referenciando
  CmsUsuario();

  $u3 = new BlogUsuario(); // FQN não são afetados por
  Alias e import




                                      http://dpasqua.wordpress.com
Namespaces – Espaço Global
A classe/função/constante pertencem ao namespace
 “global” quando não for especificado nenhuma namespace
  <?php
  class Usuario {
        private $nome;

        public function setNome ($usuario) {
            $this->nome = $usuario;
        }

        public function getNome() {
            return "Usuário Atual Global é " . $this->nome;
        }
  }




                                    http://dpasqua.wordpress.com
Namespaces – Espaço Global
Quando pretendemos usar um elemento definido no espaço
 global, utiliza o prefixo “” seguido pelo nome do elemento

  $usuario = new Usuario();
  $usuario->setNome("Douglas");
  echo $usuario->getNome(); // Usuário Atual Global é
  Douglas




                                    http://dpasqua.wordpress.com
Namespaces
Além de classes, namespaces se aplicam para funções e
 constantes

  <?php
  namespace ABC;
  const TESTCONST = true;

  // função fopen no namespace ABC
  function fopen() {
  // chamando a função Global fopen
     $f = fopen(...);
      // constante no namespace ABC
      return TESTCONST;
  }




                                    http://dpasqua.wordpress.com
Namespaces __NAMESPACE__
A constante __NAMESPACE__ contém o nome da
 namespace corrente
No namespace “Global” a constante terá o valor “vazio”
Além da constante __NAMEPSACE__ existe a palavra-chave
 “namespace” que pode ser usada para referenciar o
 namespace atual
  <?php
  namespace FooBar;
  echo __NAMESPACE__; // exibe FooBar
  namespacefunc(); // chama a função em FooBarfunc();




                                    http://dpasqua.wordpress.com
Namespaces - Múltiplos
É possível trabalhar com múltiplos namespaces em um
 mesmo arquivo
  namespace ProjetoBlog {
  const teste_constante = 1;
     class Usuario() { ... }
  }
  namespace ProjetoCms {
  const teste_constante = 1;
     class Usuario() { ... }
  }

  namespace {
  const teste_constante = 1;
     class Usuario() { ... }
  }



                                  http://dpasqua.wordpress.com
Namespaces - autoload
  É possível identificar o namespace na função de autoload
  do PHP.
 Autoload no PHP permite carregar classes dinâmicamente
 A função de autoload recebe o FQN, que inclui o namespace
<?php
$usuario = new ProjetoCmsUsuario();

function __autoload($class) {
$class = 'classes/' . str_replace('', '/', $class) . '.php';
    require_once($class);
    // classes/Projeto/Cms/Usuario.php
}




                                         http://dpasqua.wordpress.com
Late Static Bindings
Pode ser usado para referência a classe chamada (run-time)
 em um contexto de herança de método estático




                                   http://dpasqua.wordpress.com
Late Static Bindings

<?php
class A {
public static function who() {
   echo __CLASS__;
}
public static function test() {
   self::who(); // self:: referencia a classe do qual o
método test pertence
}
}

class B extends A {
public static function who() {
   echo __CLASS__;
}
}
B::test(); // Será impresso "A"   e não "B"


                                     http://dpasqua.wordpress.com
Late Static Bindings

<?php
class A {
public static function who() {
   echo __CLASS__;
}
public static function test() {
   static::who(); // static:: referencia a classe chamada
em tempo de execução
}
}

class B extends A {
public static function who() {
   echo __CLASS__;
}
}
B::test(); // Dessa vez será impresso “B”


                                    http://dpasqua.wordpress.com
Lambda e Closures
 Lambda é o mesmo que funções anônimas.
Podem ser definidas em qualquer lugar da aplicação
As funções anônimas podem ser atribuídas à uma variável
A função deixará de existir quando a variável sair fora do
 escopo
A utilização mais comum são em funções que aceitam um
 callback, como array_map, usort, etc.
É equivalente a função create_function. Lambda são mais
 rápidas e tornam o código mais limpo.
create_function é executada em run-time enquanto Lambda
 são criadas em compile-time

                                     http://dpasqua.wordpress.com
Lambda e Closures

<?php
$r = array_map(function($value) {
       return $value * 4;
   }, array(2, 4, 6, 8, 10));

print_r ($r);
?>
8
16
24
32
40




                                    http://dpasqua.wordpress.com
Lambda e Closures
<?php
$a = array(10, 4, 5 ,3 ,1);
usort($a, function($a, $b) {
          if ($a == $b) {
                 return 0;
          }
          return ($a < $b) ? -1 : 1;
});
print_r($a);
?>
Array
(
    [0] => 1
    [1] => 3
    [2] => 4
    [3] => 5
    [4] => 10
)

                                       http://dpasqua.wordpress.com
Lambda e Closures
 Closures adicionam recursos à Lambdas
Closures permite a interação de variáveis externas
A importação das variáveis externas são feitas através da
 palavra-chave “use”

  <?php
  $string = "Olá teste!";
  $closure = function() use ($string) { echo $string; };

  $closure();
  ?>

  Olá teste !




                                    http://dpasqua.wordpress.com
Lambda e Closures
Por padrão as variáveis importadas são passadas por valor
É possível passar variáveis por referência usando “&”
<?php
$a = 10;
$closure = function() use (&$a) { $a += 50; };

$closure();
var_dump ($a); // int(60)

$closure();
var_dump ($a); // int(110)

$closure();
var_dump ($a);   // int(160)



                                    http://dpasqua.wordpress.com
Lambda e Closures
Além de programação procedural, closures podem ser
 utilizados em programação orientada a objetos

 <?php
 class DebugAll {
 public function __invoke($var) {
    var_dump($var);
 }
 }
 $obj1 = new DebugAll;
 $obj1(50);
 $obj1(100);
 ?>
 int(50)
 int(100)



                                    http://dpasqua.wordpress.com
Lambda e Closures
Exemplo de como podemos deixar um código mais limpo
 usando closures
<?php
$db = mysqli_connect("server","user","pass");
Logger::log('debug','database','Conectando com a database');
Logger::log('debug','database','Inserindo informações no
banco de dados');




                                     http://dpasqua.wordpress.com
Lambda e Closures
Exemplo de como podemos deixar um código mais limpo
 usando closures
<?php
$db = mysqli_connect("server","user","pass");
Logger::log('debug','database','Conectando com a database');
Logger::log('debug','database','Inserindo informações no
banco de dados');

// definindo o closure
$logdb = function ($string) {
Logger::log('debug','database',$string); };
$logdb('Conectando com a base de dados');
$logdb('Inserindo informações no banco de dados');




                                     http://dpasqua.wordpress.com
Arquivos Phar
 Possibilita distribuir a aplicação/biblioteca em um único
 arquivo
Semelhante aos arquivos JAR do Java
Funcionalidade nativa no PHP 5.3
A criação e manipulação são feitas através de código PHP
Praticamente não há perda de desempenho




                                     http://dpasqua.wordpress.com
Arquivos Phar - Criando
É necessário setar a diretiva phar.readonly para Off no
 php.ini
Por motivos de segurança esta diretiva é habilitada por
 padrão

 $p = new Phar('/project/app.phar', 0, 'app.phar');
 $p->startBuffering();




                                     http://dpasqua.wordpress.com
Arquivos Phar - Adicionando

// método addFile
$p->addFile("/project/userBlog.php");
$p->addFile("/project/userCMS.php", "/lib/CMS.php");




                                    http://dpasqua.wordpress.com
Arquivos Phar - Adicionando

// método addFile
$p->addFile("/project/userBlog.php");
$p->addFile("/project/userCMS.php", "/lib/CMS.php");

// ArrayAccess SPL
$p['index.php'] = file_get_contents("/project/index.php");
$p['teste.txt'] = "Teste 123 456";




                                    http://dpasqua.wordpress.com
Arquivos Phar - Adicionando

// método addFile
$p->addFile("/project/userBlog.php");
$p->addFile("/project/userCMS.php", "/lib/CMS.php");

// ArrayAccess SPL
$p['index.php'] = file_get_contents("/project/index.php");
$p['teste.txt'] = "Teste 123 456";

// Incluir vários arquivos de uma vez, recursivo
$p->buildFromDirectory('/project', '/.php/');




                                    http://dpasqua.wordpress.com
Arquivos Phar - Stub
Stub é o arquivo inicial que será carregado ao executar o
 pacote
 $p->setStub('<?php Phar::mapPhar(); include
 "phar://app.phar/index.php"; __HALT_COMPILER(); ?>');


 Phar::mapPhar() - Lê e inicializa o pacote Phar
O código stub deve terminar com __HALT_COMPILER()




                                     http://dpasqua.wordpress.com
Arquivos Phar - Stub
Utilize o método createDefaultStub dentro do método
 setStub para especificar o arquivo que será executado ao
 executar o pacote

  $p->setStub($p->createDefaultStub('index.php'));




                                    http://dpasqua.wordpress.com
Arquivos Phar - Exemplo

<?php
$p = new Phar('teste.phar', 0, 'teste.phar');
$p->startBuffering();

$p['index.php'] = '<?php echo "Olá mundo"; ?>';

$p->setStub($p->createDefaultStub('index.php'));
$p->stopBuffering();
?>

# php criarTestePhar.php

# php teste.phar
Olá Mundo




                                    http://dpasqua.wordpress.com
Arquivos Phar - Manipulando
Acessando através de include

include 'teste.phar';
include 'phar://teste.phar/index.php';




                                    http://dpasqua.wordpress.com
Arquivos Phar - Web

 <?php
 $phar = new Phar('exemplo.phar');
 $phar['index.php'] = '<?php echo "Hello World Index"; ?>';
 $phar['admin.php'] = '<?php echo "Hello World Admin"; ?>';
 $phar->setStub('<?php Phar::webPhar(); __HALT_COMPILER();
 ?>');
 ?>


 Phar::webPhar() atua como um frontcontroller
 redirecionando as chamadas web para dentro do pacote




                                    http://dpasqua.wordpress.com
Arquivos Phar - Web
http://exemplo.org/exemplo.phar
“Hello World Index”
http://exemplo.org/exemplo.phar/admin.php
“Hello World Admin”




                                   http://dpasqua.wordpress.com
Mysql Native Driver
É uma alternativa ao extensão libmysql
Funciona com as versões do Mysql >= 4.1
Driver integrado com Zend Engine
Perfomance melhorada em diversas funções
Não necessidade de linkar com bibliotecas externas
Utiliza “PHP License”
Facilidade na compilação




                                    http://dpasqua.wordpress.com
Mysql Native Driver
Driver pode ser utilizado nas três extensões do MySQL
 (mysql, mysqli, PDO_MySQL)
Para usar o mysqlnd compilando o PHP a partir do código
 fonte utilize os parâmetros:
--with-mysql=mysqlnd / --with-mysqli=mysqlnd / --with-pdo-
 mysql=mysqlnd
Na distribuição oficial do PHP para Windows o driver
 mysqlnd vem habilitado por padrão
Ainda não há suporte à SSL




                                    http://dpasqua.wordpress.com
Outras Melhorias
Função getopt
Error Levels e Funções Deprecated
__callstatic
Variáveis Estáticas
Novas funções
Goto
NowDoc
__DIR__
Operador ?:
Recursos SPL

                                     http://dpasqua.wordpress.com
Melhorias getopt
A função getopt que funcionava somente no Linux esta
 disponível para Windows
Agora é possível usar o caracter de atribuição “=” ao setar
 argumentos na linha de comando

 # php teste_opt.php -i="valor teste123"



O valor do argumento pode ser opcional

# php teste_opt.php -i




                                     http://dpasqua.wordpress.com
Melhorias Error Levels
E_ALL agora inclui E_STRICT
E_DEPRECATED – Usado para indicar funções que serão
 descontinuadas em funções futuras do php
Exemplos de funções que serão descontinuadas: ereg,
 ereg_replace, split, session_register, register_globals,
 magic_quotes_gpc




                                     http://dpasqua.wordpress.com
Melhorias __callstatic
__callstatic é um método mágico invocado quando se faz
 uma chamada para um método estático inexistente
Semelhante à __call, porém para métodos estáticos

 class Teste {
 static function __callStatic($nome, $args) {
    echo $nome . "(" . implode(",", $args) . ")";
 }
 }
 Teste::funcao('a', 'b');

 // funcao(a, b)




                                    http://dpasqua.wordpress.com
Melhorias Variáveis Estáticas

<?php
$class_name = "Teste";
$static_method_name = "funcao";
$class_name::$static_method_name();
?>
string(32) "static function called"




                                      http://dpasqua.wordpress.com
Melhorias Novas Funções
array_replace e array_replace_recursive

<?php
$base = array("laranja", "banana", "maça", "goiabada");
$repl = array(0 => "abacaxi", 4 => "morango");

$bacia = array_replace($base, $repl);
print_r($bacia);
?>

 Array    (
    [0]   =>   abacaxi
    [1]   =>   banana
    [2]   =>   maþa
    [3]   =>   goiabada
    [4]   =>   morango
)


                                    http://dpasqua.wordpress.com
Melhorias Goto
Operador Goto pode ser usado para pular para outra seção
 do programa

 <?php
 goto b;
 echo 'A';

 b:
 echo 'B';
 ?>

 B




                                   http://dpasqua.wordpress.com
Melhorias NowDoc
HereDoc

<?php
$variavel = 'teste';
$bar = <<<CODIGOPHP
Teste código php $variavel
CODIGOPHP;
echo $bar; // Teste código php teste

NowDoc
<?php
$bar = <<<'CODIGOPHP'
Teste código php $variavel
CODIGOPHP;
echo $bar;
?>
Teste código php $variavel

                                   http://dpasqua.wordpress.com
Melhorias __DIR__
Constante __DIR__ indica o diretório corrente onde o script
 esta localizado
Antes do PHP 5.3
echo dirname(__FILE__);

A partir do PHP 5.3
echo __DIR__;




                                    http://dpasqua.wordpress.com
Melhorias – Operador ?:
Permite obter de forma ágil um valor não vazio à partir de
 duas expressões


  $a   =   "" ?: 1; // 1
  $b   =   1 ?: 2; // 1
  $c   =   false ?: true; // true
  $d   =   array() ?: array(10); // array(10)




                                        http://dpasqua.wordpress.com
Melhorias SPL
Bibliotecas SPL inclusas no PHP 5.3: SplFixedArray,
 SplStack, SplQueue, SplHeap, SplMinHeap, SplMaxHeap,
 SplPriorityQueue


 http://www.slideshare.net/tobias382/new-spl-features-in-
 php-53




                                    http://dpasqua.wordpress.com
Fale Conosco

            Obrigado por Assistir !



               Mais informações:

    http://dpasqua.wordpress.com

        E-mail: douglas.pasqua@gmail.com

               Fone: 11 9236-4184




                                http://dpasqua.wordpress.com

Mais conteúdo relacionado

PPTX
Desenvolvimento de sistemas web com PHP Frameworks - Aula 3
PDF
Como criar um plugin para WordPress
PDF
LabMM4 (T13 - 12/13) - Funções
PPTX
Desenvolvimento de sistemas web com PHP Frameworks - Aula 2
PDF
Doctrine2 Seminário PHP
PPTX
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
PPTX
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
PPT
PHP GERAL
Desenvolvimento de sistemas web com PHP Frameworks - Aula 3
Como criar um plugin para WordPress
LabMM4 (T13 - 12/13) - Funções
Desenvolvimento de sistemas web com PHP Frameworks - Aula 2
Doctrine2 Seminário PHP
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
PHP GERAL

Mais procurados (20)

PPTX
Desenvolvimento de sistemas web com php Frameworks - Aula 1
PPTX
PPTX
Desenvolvimento de sistemas web com PHP Frameworks - Aula 4
PPTX
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
PPTX
Logs, pra que te quero! @ Meetup PHP Vale
ODP
Dependency injection
PDF
Entre na fila. Processamento distribuído usando Gearman
PDF
Integração do Flex com PHP através do AMFPHP
PDF
Memcached, Gearman e Sphinx
ODP
Php 05 Mvc
PDF
PrincipaiPrincipais Frameworks e Documentação
PDF
Curso PHP UNIFACS 2014.1 – 2ª aula
PDF
Leonardo Zamariola - High Order Functions e Functional Interfaces
PPT
Python cherrypy
PPTX
M5 php rc
PDF
Desenvolvimento Rápido de Programas Linha de Comando
PDF
PHP Jedi - Boas Práticas e Alta Performance
PDF
Java web 6 JSP Expression Language Taglib parte 2
PDF
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvimento de sistemas web com php Frameworks - Aula 1
Desenvolvimento de sistemas web com PHP Frameworks - Aula 4
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Logs, pra que te quero! @ Meetup PHP Vale
Dependency injection
Entre na fila. Processamento distribuído usando Gearman
Integração do Flex com PHP através do AMFPHP
Memcached, Gearman e Sphinx
Php 05 Mvc
PrincipaiPrincipais Frameworks e Documentação
Curso PHP UNIFACS 2014.1 – 2ª aula
Leonardo Zamariola - High Order Functions e Functional Interfaces
Python cherrypy
M5 php rc
Desenvolvimento Rápido de Programas Linha de Comando
PHP Jedi - Boas Práticas e Alta Performance
Java web 6 JSP Expression Language Taglib parte 2
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Anúncio

Destaque (8)

PPT
A Linguagem Php
PPTX
Apresentação da Linguagem de Programação PHP
PDF
PHP - Funções
PDF
Linguagem PHP
PPTX
Comandos gerais do PHP
PDF
Introdução a php
PPT
Curso de PHP Básico ao Avançado
PPT
Bases De Dados
A Linguagem Php
Apresentação da Linguagem de Programação PHP
PHP - Funções
Linguagem PHP
Comandos gerais do PHP
Introdução a php
Curso de PHP Básico ao Avançado
Bases De Dados
Anúncio

Semelhante a Novas Funcionalidade no PHP 5.3 (20)

PPT
Aula5
PPT
Aprofunde se no php 5.3
PPT
PHP FrameWARks - FISL
PPTX
Injeção de Dependências com PHP
PDF
PHP 5.3 - Classes e Objetos
ODP
Php 08 Oo
ODP
Prog web 06-php-oo
PDF
Programação Orientada a Objetos (POO) com PHP - Parte 1
PDF
PHP: Linguagem + Mysql + MVC + AJAX
PDF
Introducao a orientacao a objetos com PHP
PDF
Migrando para o PHP 5
PDF
Curso de PHP - Objetos
PPT
VRaptor - Alta produtividade no Desenvolvimento Web em Java
PDF
Introdução ao Zend Framework 2
PPTX
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 3 - 2019.1
PDF
Php5 e a orientação a objetos
PDF
Como usar a documentação da API Java 2
PPTX
PPT
Linguagens Poo
PPTX
Fundamentos da Programação PHP OO - Aula 3
Aula5
Aprofunde se no php 5.3
PHP FrameWARks - FISL
Injeção de Dependências com PHP
PHP 5.3 - Classes e Objetos
Php 08 Oo
Prog web 06-php-oo
Programação Orientada a Objetos (POO) com PHP - Parte 1
PHP: Linguagem + Mysql + MVC + AJAX
Introducao a orientacao a objetos com PHP
Migrando para o PHP 5
Curso de PHP - Objetos
VRaptor - Alta produtividade no Desenvolvimento Web em Java
Introdução ao Zend Framework 2
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 3 - 2019.1
Php5 e a orientação a objetos
Como usar a documentação da API Java 2
Linguagens Poo
Fundamentos da Programação PHP OO - Aula 3

Mais de Douglas V. Pasqua (9)

PDF
Graph API - Desenvolvimento para Facebook
PDF
Web Services RESTful
PDF
Introdução APIs RESTful
PDF
Dicas para sua carreira de Desenvolvedor PHP
PDF
Escrevendo códigos php seguros
PDF
Unicode: Os segredos da Codificação de Caracteres
PDF
The Facebook Plataform
PDF
Tuning Apache/MySQL/PHP para desenvolvedores
PDF
Segurança Web com PHP5
Graph API - Desenvolvimento para Facebook
Web Services RESTful
Introdução APIs RESTful
Dicas para sua carreira de Desenvolvedor PHP
Escrevendo códigos php seguros
Unicode: Os segredos da Codificação de Caracteres
The Facebook Plataform
Tuning Apache/MySQL/PHP para desenvolvedores
Segurança Web com PHP5

Último (19)

PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PDF
Processos na gestão de transportes, TM100 Col18
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Aula 18 - Manipulacao De Arquivos python
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
COBITxITIL-Entenda as diferença em uso governança TI
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Aula04-Academia Heri- Tecnologia Geral 2025
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Custos e liquidação no SAP Transportation Management, TM130 Col18
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Processos na gestão de transportes, TM100 Col18
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Apple Pippin Uma breve introdução. - David Glotz
Aula 18 - Manipulacao De Arquivos python

Novas Funcionalidade no PHP 5.3

  • 1. Novas Funcionalidades no PHP 5.3 Douglas V. Pasqua Zend Certified Engineer douglas.pasqua@gmail.com http://dpasqua.wordpress.com
  • 2. Objetivo Conhecer as principais funcionalidades incluídas no PHP 5.3 Exemplos de códigos PHP das novas funcionalidades Melhores práticas de programação ao se trabalhar com os novos recursos http://dpasqua.wordpress.com
  • 3. Tópicos Namespaces Static Late Bindings Lambda e Closures Arquivos Phar mysqlnd – MySQL Native Driver Outras melhorias http://dpasqua.wordpress.com
  • 4. Namespaces – Características Agrupar classes, funções e constantes em pacotes (namespaces) Possibilita mais de um classe/função/constante com o mesmo nome, porém em diferentes namespaces Diminui o número de prefixos usados nos nomes das classes/funções e constantes Deixa o código mais limpo e legível http://dpasqua.wordpress.com
  • 5. Namespaces – Definição Determinando um namespace para um arquivo PHP A diretiva namespace deve ser declarada antes de qualquer outro código php ou caractéres na saída padrão <?php namespace exemplo; http://dpasqua.wordpress.com
  • 6. Namespaces – Exemplo Arquivo UsuarioBlog.php <?php namespace Blog; class Usuario { private $nome; public function setNome ($nome) { $this->nome = $nome; } public function getNome() { return "Usuário Atual do Blog é " . $this->nome; } } http://dpasqua.wordpress.com
  • 7. Namespaces – Exemplo Arquivo UsuarioCms.php <?php namespace Cms; class Usuario { private $nome; public function setNome ($nome) { $this->nome = $nome; } public function getNome() { return "Usuário Atual do Cms é " . $this->nome; } } http://dpasqua.wordpress.com
  • 8. Namespaces – Exemplo Acessando as classes “Usuario” de acordo com o namespace. // incluíndo os arquivos das classes 'Usuarios' require_once("UserBlog.php"); require_once("UserCms.php"); http://dpasqua.wordpress.com
  • 9. Namespaces – Exemplo Acessando as classes “Usuario” de acordo com o namespace. // incluíndo os arquivos das classes 'Usuarios' require_once("UserBlog.php"); require_once("UserCms.php"); // Instancinado a classe Usuario no namespace Blog $usuario = new BlogUsuario(); $usuario->setNome("Douglas"); echo $usuario->getNome() . PHP_EOL; // Usuário Atual do Blog é Douglas http://dpasqua.wordpress.com
  • 10. Namespaces – Exemplo Acessando as classes “Usuario” de acordo com o namespace. // incluíndo os arquivos das classes 'Usuarios' require_once("UserBlog.php"); require_once("UserCms.php"); // Instancinado a classe Usuario no namespace Blog $usuario = new BlogUsuario(); $usuario->setNome("Douglas"); echo $usuario->getNome() . PHP_EOL; // Usuário Atual do Blog é Douglas // Instancinado a classe Usuario no namespace Cms $usuario1 = new CmsUsuario(); $usuario1->setNome("Douglas"); echo $usuario1->getNome() . PHP_EOL; // Usuário Atual do Cms é Douglas http://dpasqua.wordpress.com
  • 11. Namespaces – Utilizando Nome qualificado absoluto $a = new BlogUsuario(); $b = new CmsUsuario(); http://dpasqua.wordpress.com
  • 12. Namespaces – Utilizando Nome qualificado absoluto $a = new BlogUsuario(); $b = new CmsUsuario(); Nome não-qualificado namespace Blog; $a = new Usuario(); // BlogUsuario http://dpasqua.wordpress.com
  • 13. Namespaces – Utilizando Nome qualificado absoluto $a = new BlogUsuario(); $b = new CmsUsuario(); Nome não-qualificado namespace Blog; $a = new Usuario(); // BlogUsuario Nome qualificado relativo namespace Empresa; $a = new BlogUsuario(); // EmpresaBlogUsuario // Erro pois classe não existe neste namespace http://dpasqua.wordpress.com
  • 14. Namespaces – Import e Alias A finalidade do Alias é criar um nome mais curto para referenciar um elemento A palavra-chave para import e alias é “use” use BlogUsuario as BlogUsuario; use CmsUsuario; $u1 = new BlogUsuario(); // alias referenciando BlogUsuario(); $u2 = new Usuario(); // alias referenciando CmsUsuario(); $u3 = new BlogUsuario(); // FQN não são afetados por Alias e import http://dpasqua.wordpress.com
  • 15. Namespaces – Espaço Global A classe/função/constante pertencem ao namespace “global” quando não for especificado nenhuma namespace <?php class Usuario { private $nome; public function setNome ($usuario) { $this->nome = $usuario; } public function getNome() { return "Usuário Atual Global é " . $this->nome; } } http://dpasqua.wordpress.com
  • 16. Namespaces – Espaço Global Quando pretendemos usar um elemento definido no espaço global, utiliza o prefixo “” seguido pelo nome do elemento $usuario = new Usuario(); $usuario->setNome("Douglas"); echo $usuario->getNome(); // Usuário Atual Global é Douglas http://dpasqua.wordpress.com
  • 17. Namespaces Além de classes, namespaces se aplicam para funções e constantes <?php namespace ABC; const TESTCONST = true; // função fopen no namespace ABC function fopen() { // chamando a função Global fopen $f = fopen(...); // constante no namespace ABC return TESTCONST; } http://dpasqua.wordpress.com
  • 18. Namespaces __NAMESPACE__ A constante __NAMESPACE__ contém o nome da namespace corrente No namespace “Global” a constante terá o valor “vazio” Além da constante __NAMEPSACE__ existe a palavra-chave “namespace” que pode ser usada para referenciar o namespace atual <?php namespace FooBar; echo __NAMESPACE__; // exibe FooBar namespacefunc(); // chama a função em FooBarfunc(); http://dpasqua.wordpress.com
  • 19. Namespaces - Múltiplos É possível trabalhar com múltiplos namespaces em um mesmo arquivo namespace ProjetoBlog { const teste_constante = 1; class Usuario() { ... } } namespace ProjetoCms { const teste_constante = 1; class Usuario() { ... } } namespace { const teste_constante = 1; class Usuario() { ... } } http://dpasqua.wordpress.com
  • 20. Namespaces - autoload  É possível identificar o namespace na função de autoload do PHP. Autoload no PHP permite carregar classes dinâmicamente A função de autoload recebe o FQN, que inclui o namespace <?php $usuario = new ProjetoCmsUsuario(); function __autoload($class) { $class = 'classes/' . str_replace('', '/', $class) . '.php'; require_once($class); // classes/Projeto/Cms/Usuario.php } http://dpasqua.wordpress.com
  • 21. Late Static Bindings Pode ser usado para referência a classe chamada (run-time) em um contexto de herança de método estático http://dpasqua.wordpress.com
  • 22. Late Static Bindings <?php class A { public static function who() { echo __CLASS__; } public static function test() { self::who(); // self:: referencia a classe do qual o método test pertence } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); // Será impresso "A" e não "B" http://dpasqua.wordpress.com
  • 23. Late Static Bindings <?php class A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // static:: referencia a classe chamada em tempo de execução } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); // Dessa vez será impresso “B” http://dpasqua.wordpress.com
  • 24. Lambda e Closures  Lambda é o mesmo que funções anônimas. Podem ser definidas em qualquer lugar da aplicação As funções anônimas podem ser atribuídas à uma variável A função deixará de existir quando a variável sair fora do escopo A utilização mais comum são em funções que aceitam um callback, como array_map, usort, etc. É equivalente a função create_function. Lambda são mais rápidas e tornam o código mais limpo. create_function é executada em run-time enquanto Lambda são criadas em compile-time http://dpasqua.wordpress.com
  • 25. Lambda e Closures <?php $r = array_map(function($value) { return $value * 4; }, array(2, 4, 6, 8, 10)); print_r ($r); ?> 8 16 24 32 40 http://dpasqua.wordpress.com
  • 26. Lambda e Closures <?php $a = array(10, 4, 5 ,3 ,1); usort($a, function($a, $b) { if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; }); print_r($a); ?> Array ( [0] => 1 [1] => 3 [2] => 4 [3] => 5 [4] => 10 ) http://dpasqua.wordpress.com
  • 27. Lambda e Closures  Closures adicionam recursos à Lambdas Closures permite a interação de variáveis externas A importação das variáveis externas são feitas através da palavra-chave “use” <?php $string = "Olá teste!"; $closure = function() use ($string) { echo $string; }; $closure(); ?> Olá teste ! http://dpasqua.wordpress.com
  • 28. Lambda e Closures Por padrão as variáveis importadas são passadas por valor É possível passar variáveis por referência usando “&” <?php $a = 10; $closure = function() use (&$a) { $a += 50; }; $closure(); var_dump ($a); // int(60) $closure(); var_dump ($a); // int(110) $closure(); var_dump ($a); // int(160) http://dpasqua.wordpress.com
  • 29. Lambda e Closures Além de programação procedural, closures podem ser utilizados em programação orientada a objetos <?php class DebugAll { public function __invoke($var) { var_dump($var); } } $obj1 = new DebugAll; $obj1(50); $obj1(100); ?> int(50) int(100) http://dpasqua.wordpress.com
  • 30. Lambda e Closures Exemplo de como podemos deixar um código mais limpo usando closures <?php $db = mysqli_connect("server","user","pass"); Logger::log('debug','database','Conectando com a database'); Logger::log('debug','database','Inserindo informações no banco de dados'); http://dpasqua.wordpress.com
  • 31. Lambda e Closures Exemplo de como podemos deixar um código mais limpo usando closures <?php $db = mysqli_connect("server","user","pass"); Logger::log('debug','database','Conectando com a database'); Logger::log('debug','database','Inserindo informações no banco de dados'); // definindo o closure $logdb = function ($string) { Logger::log('debug','database',$string); }; $logdb('Conectando com a base de dados'); $logdb('Inserindo informações no banco de dados'); http://dpasqua.wordpress.com
  • 32. Arquivos Phar  Possibilita distribuir a aplicação/biblioteca em um único arquivo Semelhante aos arquivos JAR do Java Funcionalidade nativa no PHP 5.3 A criação e manipulação são feitas através de código PHP Praticamente não há perda de desempenho http://dpasqua.wordpress.com
  • 33. Arquivos Phar - Criando É necessário setar a diretiva phar.readonly para Off no php.ini Por motivos de segurança esta diretiva é habilitada por padrão $p = new Phar('/project/app.phar', 0, 'app.phar'); $p->startBuffering(); http://dpasqua.wordpress.com
  • 34. Arquivos Phar - Adicionando // método addFile $p->addFile("/project/userBlog.php"); $p->addFile("/project/userCMS.php", "/lib/CMS.php"); http://dpasqua.wordpress.com
  • 35. Arquivos Phar - Adicionando // método addFile $p->addFile("/project/userBlog.php"); $p->addFile("/project/userCMS.php", "/lib/CMS.php"); // ArrayAccess SPL $p['index.php'] = file_get_contents("/project/index.php"); $p['teste.txt'] = "Teste 123 456"; http://dpasqua.wordpress.com
  • 36. Arquivos Phar - Adicionando // método addFile $p->addFile("/project/userBlog.php"); $p->addFile("/project/userCMS.php", "/lib/CMS.php"); // ArrayAccess SPL $p['index.php'] = file_get_contents("/project/index.php"); $p['teste.txt'] = "Teste 123 456"; // Incluir vários arquivos de uma vez, recursivo $p->buildFromDirectory('/project', '/.php/'); http://dpasqua.wordpress.com
  • 37. Arquivos Phar - Stub Stub é o arquivo inicial que será carregado ao executar o pacote $p->setStub('<?php Phar::mapPhar(); include "phar://app.phar/index.php"; __HALT_COMPILER(); ?>');  Phar::mapPhar() - Lê e inicializa o pacote Phar O código stub deve terminar com __HALT_COMPILER() http://dpasqua.wordpress.com
  • 38. Arquivos Phar - Stub Utilize o método createDefaultStub dentro do método setStub para especificar o arquivo que será executado ao executar o pacote $p->setStub($p->createDefaultStub('index.php')); http://dpasqua.wordpress.com
  • 39. Arquivos Phar - Exemplo <?php $p = new Phar('teste.phar', 0, 'teste.phar'); $p->startBuffering(); $p['index.php'] = '<?php echo "Olá mundo"; ?>'; $p->setStub($p->createDefaultStub('index.php')); $p->stopBuffering(); ?> # php criarTestePhar.php # php teste.phar Olá Mundo http://dpasqua.wordpress.com
  • 40. Arquivos Phar - Manipulando Acessando através de include include 'teste.phar'; include 'phar://teste.phar/index.php'; http://dpasqua.wordpress.com
  • 41. Arquivos Phar - Web <?php $phar = new Phar('exemplo.phar'); $phar['index.php'] = '<?php echo "Hello World Index"; ?>'; $phar['admin.php'] = '<?php echo "Hello World Admin"; ?>'; $phar->setStub('<?php Phar::webPhar(); __HALT_COMPILER(); ?>'); ?>  Phar::webPhar() atua como um frontcontroller redirecionando as chamadas web para dentro do pacote http://dpasqua.wordpress.com
  • 42. Arquivos Phar - Web http://exemplo.org/exemplo.phar “Hello World Index” http://exemplo.org/exemplo.phar/admin.php “Hello World Admin” http://dpasqua.wordpress.com
  • 43. Mysql Native Driver É uma alternativa ao extensão libmysql Funciona com as versões do Mysql >= 4.1 Driver integrado com Zend Engine Perfomance melhorada em diversas funções Não necessidade de linkar com bibliotecas externas Utiliza “PHP License” Facilidade na compilação http://dpasqua.wordpress.com
  • 44. Mysql Native Driver Driver pode ser utilizado nas três extensões do MySQL (mysql, mysqli, PDO_MySQL) Para usar o mysqlnd compilando o PHP a partir do código fonte utilize os parâmetros: --with-mysql=mysqlnd / --with-mysqli=mysqlnd / --with-pdo- mysql=mysqlnd Na distribuição oficial do PHP para Windows o driver mysqlnd vem habilitado por padrão Ainda não há suporte à SSL http://dpasqua.wordpress.com
  • 45. Outras Melhorias Função getopt Error Levels e Funções Deprecated __callstatic Variáveis Estáticas Novas funções Goto NowDoc __DIR__ Operador ?: Recursos SPL http://dpasqua.wordpress.com
  • 46. Melhorias getopt A função getopt que funcionava somente no Linux esta disponível para Windows Agora é possível usar o caracter de atribuição “=” ao setar argumentos na linha de comando # php teste_opt.php -i="valor teste123" O valor do argumento pode ser opcional # php teste_opt.php -i http://dpasqua.wordpress.com
  • 47. Melhorias Error Levels E_ALL agora inclui E_STRICT E_DEPRECATED – Usado para indicar funções que serão descontinuadas em funções futuras do php Exemplos de funções que serão descontinuadas: ereg, ereg_replace, split, session_register, register_globals, magic_quotes_gpc http://dpasqua.wordpress.com
  • 48. Melhorias __callstatic __callstatic é um método mágico invocado quando se faz uma chamada para um método estático inexistente Semelhante à __call, porém para métodos estáticos class Teste { static function __callStatic($nome, $args) { echo $nome . "(" . implode(",", $args) . ")"; } } Teste::funcao('a', 'b'); // funcao(a, b) http://dpasqua.wordpress.com
  • 49. Melhorias Variáveis Estáticas <?php $class_name = "Teste"; $static_method_name = "funcao"; $class_name::$static_method_name(); ?> string(32) "static function called" http://dpasqua.wordpress.com
  • 50. Melhorias Novas Funções array_replace e array_replace_recursive <?php $base = array("laranja", "banana", "maça", "goiabada"); $repl = array(0 => "abacaxi", 4 => "morango"); $bacia = array_replace($base, $repl); print_r($bacia); ?> Array ( [0] => abacaxi [1] => banana [2] => maþa [3] => goiabada [4] => morango ) http://dpasqua.wordpress.com
  • 51. Melhorias Goto Operador Goto pode ser usado para pular para outra seção do programa <?php goto b; echo 'A'; b: echo 'B'; ?> B http://dpasqua.wordpress.com
  • 52. Melhorias NowDoc HereDoc <?php $variavel = 'teste'; $bar = <<<CODIGOPHP Teste código php $variavel CODIGOPHP; echo $bar; // Teste código php teste NowDoc <?php $bar = <<<'CODIGOPHP' Teste código php $variavel CODIGOPHP; echo $bar; ?> Teste código php $variavel http://dpasqua.wordpress.com
  • 53. Melhorias __DIR__ Constante __DIR__ indica o diretório corrente onde o script esta localizado Antes do PHP 5.3 echo dirname(__FILE__); A partir do PHP 5.3 echo __DIR__; http://dpasqua.wordpress.com
  • 54. Melhorias – Operador ?: Permite obter de forma ágil um valor não vazio à partir de duas expressões $a = "" ?: 1; // 1 $b = 1 ?: 2; // 1 $c = false ?: true; // true $d = array() ?: array(10); // array(10) http://dpasqua.wordpress.com
  • 55. Melhorias SPL Bibliotecas SPL inclusas no PHP 5.3: SplFixedArray, SplStack, SplQueue, SplHeap, SplMinHeap, SplMaxHeap, SplPriorityQueue http://www.slideshare.net/tobias382/new-spl-features-in- php-53 http://dpasqua.wordpress.com
  • 56. Fale Conosco Obrigado por Assistir ! Mais informações: http://dpasqua.wordpress.com E-mail: douglas.pasqua@gmail.com Fone: 11 9236-4184 http://dpasqua.wordpress.com