Espaços para nome
A maior mudança no PHP 5.3 são, sem dúvida, Namespaces (havia uma FAQ relacionada sobre Namespaces PHP antes). Isso traz muitos benefícios para os desenvolvedores de PHP, e o amplamente criticado problema de nomenclatura de funções também foi resolvido.
O código é mais claro
O código comum anterior à versão 5.3 requer um prefixo personalizado para distinguir nomes de funções e classes
CÓDIGO
DE TEXTO PLANO
:function MY_wrapper() {}
classe MEU_BD { }
define('MY_CONN_STR', '');
MEU_wrapper();
novo MEU_BD();
MEU_CONN_STR;
Depois de usar namespaces, o código parece mais limpo.
CÓDIGO
DE TEXTO PLANO
:namespace MEU;
wrapper de função() {}
classe banco de dados { }
const CONN_STR = '';
use MEU COMO MEU;
invólucro();
novo banco de dados();
CONN_STR;
Vários namespaces definidos em um arquivo
O que deve ser feito se vários namespaces forem definidos em um arquivo?
CÓDIGO
DE TEXTO PLANO
:namespace LIB;
classe MySQL {}
classe SQLite {}
$b = novo SQLite();
espaço de nomes LIB_EXTRA;
classe MScrypt {}
$a = newMScrypt();
var_dump(
get_class($a),
get_class($b)
);
A saída do código acima é:
CÓDIGO
DE TEXTO PLANO
:string(18)"LIB_EXTRA::MScrypt"
string(11)"LIB::SQLite"
PHP é uma linguagem para interpretação e execução, e os resultados acima são razoáveis.
prioridade de namespace
Funções, classes e constantes definidas no namespace têm precedência, seguidas pelas globais.
CÓDIGO
DE TEXTO PLANO
:namespace foo;
função strlen($foo) { return htmlentities($foo });
echo strlen("teste");
echo ::strlen("teste"); // 4
echo namespace::strlen("teste"); //teste
A amizade entre namespace e autoload
O autoload analisará a localização do arquivo de classe com base no nome do namespace e o nome da classe será acionado somente quando a definição da classe não for encontrada no namespace e o escopo global definido no namespace não será chamado automaticamente.
TEXTO SIMPLES
CÓDIGO:
função __autoload($var) { var_dump($var } // LIB::foo);
requer "./ns.php";
<?php
espaço de nomes LIB;
novo foo();
*/
namespace alguns acessórios
CÓDIGO
DE TEXTO PLANO
:namespace realmente::long::pointlessly::verbose::ns;
__NAMESPACE__; // Nova constante mágica representando o nome do namespace atual
classe a{}
get_class(new a()); // realmente::long::pointlessly::verbose::ns::a
use realmente::long::pointlessly::verbose::ns::a AS b;// Faz referência a uma classe do namespace Nota: O conteúdo aqui foi extraído do pdfIntroduction to PHP 5.3 Slides e não será repetido posteriormente.
Melhorias de desempenho
O desempenho geral do php 5.3 melhorou de 5 a 15%
e md5() é 10 a 15% mais rápido
Melhor implementação de pilha no mecanismo
Constantes movidas para memória somente leitura
Melhoria do processo de tratamento de exceções (simplificação, menos opcodes)
(exigir/incluir)_uma vez melhorada, remova a duplicata aberta
Tamanho binário menor e tamanho de inicialização com gcc4
Novo recurso de idioma__DIR__
Antes da versão 5.3, para obter o diretório do script atual, era necessária uma chamada de função
: PLAIN TEXT
CODE:
echo dirname(__FILE__);
Na versão 5.3, apenas uma constante mágica __DIR__ é necessária.
CÓDIGO
DE TEXTO PLANO
:echo __DIR__; // >= PHP 5.3
?:Operator O conveniente operador ?:pode obter rapidamente um valor não nulo de dois valores/expressões.
CÓDIGO
DE TEXTO PLANO
:$a = true ?: false; // true;
$a = falso?: verdadeiro; //verdadeiro;
$a = "" ?: 1; // 1
$a = 0 ?: 2;
$a = array() ?: array(1); // array(1);
$a = strlen("") ?: strlen("a");
__callStatic()
Um novo método mágico __callStatic é adicionado. Sua função é semelhante a __call, mas é válida apenas para métodos estáticos.
CÓDIGO
DE TEXTO PLANO
:auxiliar de classe {
função estática __callStatic($nome, $args) {
echo $nome.'('.implode(',', $args).')';
}
}
helper::test("foo","bar"); // teste(foo,bar)
Chamar dinamicamente um método estático Chamar dinamicamente um método estático? Combinação de movimento e quietude.
CÓDIGO
DE TEXTO PLANO
:auxiliar de classe {
função estática foo() { echo __METHOD__ };
}
$a = "ajudante";
$b = "foo";
$a::$b(); // ajudante::foo
Vinculação estática tardia
Não sei traduzir, talvez seja mais fácil de entender se eu deixar o texto original. O tempo de processamento de eventos dos métodos estáticos foi alterado. Costumava ser processado durante a compilação, mas agora é processado durante a execução.
Antes do PHP 5.3, o código a seguir geraria um A, mas não é isso que queremos. O método whoami foi redefinido na classe B. Ele deveria gerar B para estar em conformidade com o que consideramos garantido.
CÓDIGODE TEXTO SIMPLES
:
classe A {
função estática pública whoami() {
eco __CLASS__;
}
identidade de função estática pública() {
self::whoami();
}
}
classe B estende A {
função estática pública whoami() {
eco __CLASS__;
}
}
B::identidade(); // A <- PHP <5.3
O código a seguir usa static::whoami() para chamar métodos estáticos. Após o PHP 5.3, como __CLASS__ é processado durante a execução, a classe B pode ser capturada com sucesso neste exemplo.
DE TEXTO SIMPLES
:
classe A {
função estática pública whoami() {
eco __CLASS__;
}
identidade de função estática pública() {
static::whoami();
}
}
classe B estende A {
função estática pública whoami() {
eco __CLASS__;
}
}
B::identidade(); // B <-->= PHP 5.3
mysqlnd
Veja que mysqlnd se tornou o driver mysql padrão no PHP 5.3
, mas PDO_MySQL ainda não suporta mysqlnd Atualmente, apenas a extensão mysql(i) pode usar
os novos recursos do PHP 5.3 introduzidos anteriormente, que são convenientes para desenvolvedores. Aqui está um recurso que os provedores de hospedagem na web gostam muito.
Suporte aprimorado a arquivos ini
CGI/FastCGI suporta configuração INI semelhante a .htaccess. Cada diretório pode ter configurações INI. O nome do arquivo ini depende da configuração do php.ini, mas [PATH=/var/www/domain.com], [HOST=www. As configurações da seção .domain.com] não podem ser modificadas pelo usuário.
Tratamento de erros aprimorado
Variáveis e constantes podem ser definidas em arquivos ini e podem ser chamadas diretamente no programa.
Em anexo está um exemplo de arquivo ini
CÓDIGO
DE TEXTO SIMPLES
:#Nome do arquivo php.ini definido pelo usuário (.htaccess O padrão é ".user.ini").
user_ini.filename=".user.ini"
#Se você deseja desativar esse recurso, defina-o como um valor nulo.
user_ini.filename=
#Comprimento TTL do arquivo php.ini definido pelo usuário (tempo de vida), a unidade é segundos, entendo como tempo de expiração do cache. O padrão é 300 segundos
user_ini.cache_ttl=300
[PATH=/var/www/domain.com]
ordem_variáveis = GPC
modo_seguro=1
[minhas variáveis]
algumvar = "1234"
outravar = ${algumavar}; outravar ==algumavarar
[matrizes ini]
foo[barra]=1
foo[123]=2
foo[]=3