Alterações Incompatíveis com Versões Anteriores
A maioria dos códigos PHP 4 existentes deve funcionar sem mudanças, mas você deve ter atenção às seguintes alterações incompatíves com versões anteriores:
- Existem algumas palavras reservadas novas.
- strrpos() e strripos() agora usam o texto todo como busca (needle).
-
O uso ilegal de posição de string causará
E_ERRORao invés deE_WARNING. Um exemplo de uso ilegal é: $str = 'abc'; unset($str[0]);. -
array_merge() foi alterada para aceitar somente arrays. Se uma
variavel diferente de array for passada, um
E_WARNINGserá lançado para cada parâmetro. Tenha cuidado porque seu código pode iniciar emitindo umE_WARNING. -
A variável de servidor
PATH_TRANSLATEDnão é mais setada implicitamente no Apache2 SAPI em contraste com o ocorrido no PHP 4, onde ele é setado com o mesmo valor que a variável de servidorSCRIPT_FILENAMEquando não era populada pelo Apache. Esta mudança foi realizada para seguir a » Especificação CGI/1.1. Por favor consulte o » bug #23610 para mais informações, e veja mais sobre a descrição do $_SERVER['PATH_TRANSLATED'] no manual. Este problema afeta as versões >= 4.3.2 do PHP. -
A constante
T_ML_COMMENTnão é mais definida pela extensão Tokenizer. Se o error_reporting estiver configurado paraE_ALL, o PHP irá gerar um aviso. Embora oT_ML_COMMENTnão ser usado totalmente, ele é definido no PHP 4. Em ambas versões, PHP 4 e PHP 5, // e /* */ são consideradas como constantesT_COMMENT. Entrentanto, o estilo de comentários do PHPDoc /** */, que começou a ser interpretado pelo PHP 5, é reconhecido comoT_DOC_COMMENT. - $_SERVER deve ser populado com argc e argv se variables_order inclue "S". Se você configurou especificamente seu sistema para não criar a variável $_SERVER, então é claro que não estará lá. Esta alteração faz com que argc e argv sempre esteja disponível na versão CLI independente da configuração da variables_order. Assim como, a versão CLI agora sempre popula as variáveis globais $argc e $argv.
- Um objeto sem propriedades não será mais considerado "vazio".
- Em alguns casos as classes devem ser declaradas antes de serem usadas. Isto acontece somente se algumas das novas funcionalidades do PHP 5 (como as interfaces) são usadas. Caso contrário, o comportamento é o antigo.
-
get_class(), get_parent_class()
e get_class_methods() agora retornam o nome das
classes/métodos como são declaradas (case-sensitive) o que pode causar
problemas com scripts antigos que utilizavam o comportamento anterior (o
nome da classe/método sempre era retornada em letras minúsculas). Uma possível solução
é procurar por essas funções no seu script e utilizar a função
strtolower().
Esta mudança de case-sensite change também se aplica a
constantes mágicas pré-definidas
__CLASS__,__METHOD__, e__FUNCTION__. Esses valores são retornadas exatamente como são declarados (case-sensitive). -
ip2long() agora retorna
FALSEquando um endereço IP inválido é passado como argumento para a funcão, e não mais -1. - Se existem funcões definidas no arquivo incluído, elas podem ser usadas no arquivo que a inclui independete se antes ou depois do return. Se o mesmo arquivo for incluído duas vezes, o PHP 5 emitirá um erro fatal porque as funções já foram declaradas, enquanto o PHP 4 não se importa com isso. É recomendado o uso de include_once ao invés de verificar se o arquivo já foi incluído e retornar uma condição dentro do arquivo incluído.
- include_once e require_once primeiro normaliza o caminho para o arquivo no Windows de modo que incluir A.php e a.php incluirá somente um arquivo.
- Passar um array para um função por valor não irá mais resetar o ponteiro interno do array para acessos na array realizados dentro da função. Em outras palavras, no PHP 4 se você passar uma array para uma função, seu ponteiro interno dentro da função será resetado, enquanto que no PHP 5, quando você passa uma array para uma função, o ponteiro dela dentro da função será o mesmo quando for passada para a função.
Example #1 strrpos() e strripos() agora usam todo o texto como busca (needle)
<?php
var_dump(strrpos('ABCDEF','DEF')); //int(3)
var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>
Example #2 Um objeto sem propriedades não será mais considerado "vazio"
<?php
class test { }
$t = new test();
var_dump(empty($t)); // echo bool(false)
if ($t) {
// Será executado
}
?>
Example #3 Em alguns casos classes devem ser declaradas antes de serem usadas
<?php
//funciona sem erros:
$a = new a();
class a {
}
//lança um erro:
$a = new b();
interface c{
}
class b implements c {
}
?>