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_ERROR ao invés de E_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_WARNING será lançado para cada parâmetro. Tenha cuidado porque seu código pode iniciar emitindo um E_WARNING.
  • A variável de servidor PATH_TRANSLATED nã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 servidor SCRIPT_FILENAME quando 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_COMMENT não é mais definida pela extensão Tokenizer. Se o error_reporting estiver configurado para E_ALL, o PHP irá gerar um aviso. Embora o T_ML_COMMENT não ser usado totalmente, ele é definido no PHP 4. Em ambas versões, PHP 4 e PHP 5, // e /* */ são consideradas como constantes T_COMMENT . Entrentanto, o estilo de comentários do PHPDoc /** */, que começou a ser interpretado pelo PHP 5, é reconhecido como T_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 false quando 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.

Exemplo #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)
?>

Exemplo #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
}
?>

Exemplo #3 Em alguns casos classes devem ser declaradas antes de serem usadas

<?php

//funciona sem erros:
$a = new a();
class 
{
}


//lança um erro:
$a = new b();

interface 
c{
}
class 
implements {


?>