Bulgaria PHP Conference

Mudanças de compatibilidade com versões anteriores.

Embora muitos códigos existentes em PHP 5 funcionarem sem mudanças, você deve ter atenção nas seguintes mudanças de compatibilidade:

  • getrusage() retorna NULL quando argumentos incompatíveis são passados, a partir do PHP 5.2.1.
  • ZipArchive::setCommentName() retorna TRUE em caso de sucesso, a partir do PHP 5.2.1.
  • ZipArchive::setCommentIndex() retorna TRUE em caso de sucesso, a partir do PHP 5.2.1.
  • SplFileObject::getFilename() retorna o nome do arquivo, com o caminho absoluto, a partir do PHP 5.2.1.
  • Muda a prioridade da variável de ambiente PHPRC em Win32 A variável de ambiente PHPRC agora tem prioridade sob o caminho armazenado nos registros do Windows.
  • CLI SAPI no longer checks cwd for php.ini or the php-cli.ini file No PHP 5.1.x uma funcionalidade não documentada foi adicionada fazendo com que o binário verificasse o diretório atual para carregar o arquivo de configuração do PHP, gerando comportamentos imprevisíveis se um arquivo de configuração não esperado for carregado. Esta funcionalidade foi removida na versão 5.2.0, então o PHP não verifica mais a presença dos arquivos php.ini ou php-cli.ini. Veja também a seção linha de comando no manual.
  • Adicionado um aviso quando forem executadas operações de módulo 0 Em versões anteriores do PHP, ao executar uma operação de módulo 0 (% 0) com um inteiro não se emitia nenhuma mensagem de alerta, retornando um valor FALSE inesperado. A partir do PHP 5.2.0, esta operação emitirá E_WARNING, como em todos os casos ao realizar divisões por zero.
    <?php
    print 10 0;
    /* Warning: Division by zero in filename on line n */
    ?>
  • O __toString() foi alterado para que possa ser chamado onde for aplicável. O método mágico __toString() agora será chamado em contexto de string, ou seja, em qualquer objeto que seja utilizado como string. O fallback que retornava uma string contendo o identificador do objeto foi removido no PHP 5.2.0. Isto começou a ser um problema por que o identificador do objeto não poderia ser considerado único. Esta mudança significa que se sua aplicação está esperando este comportamento, a mesma pode falhar. Na tentativa de utilizar o valor retornado quando o método não for aplicável, agora resultará em um erro tratável.
    <?php
    class foo {}
    $foo = new foo;
    print 
    $foo;
    /* Catchable fatal error:  Object of class foo could
       not be converted to string in filename on line n */
    ?>
    Até com __toString(), objetos não podem ser utilizados como indices ou chaves de um array. Posteriormente nós devemos adicionar uma funcionalidade embutida que dé suporte a isto, mas na versão 5.2.x você terá que fornecer seu próprio hashing ou a nova função do SPL spl_object_hash(). Excessões não podem lançadas dentro do __toString().
    <?php
    class foo {
        public function 
    __toString() {
            throw new 
    Exception;
        }
    }

    try {
        print new 
    foo;
        
    /* Fatal error:  Method foo::__toString() must
           not throw an exception in filename on line n */
    } catch(Exception $e) {}
    ?>
  • Funções de classes abstratas e estáticas foram removidas. Devido a um descuido nas versões 5.0.x e 5.1.x do PHP, foi permitido funções estáticas abstratas em classes. A partir do PHP 5.2.x, apenas as interfaces podem tê-las.
    <?php
    abstract class foo {
        abstract static function 
    bar();
        
    /* Strict Standards:  Static function foo::bar()
           should not be abstract in filename on line n */
    }
    ?>
  • A Extensão Oracle requer, pelo menos, o Oracle       10 no Windows.
  • Adicionado suporte RFC2397 (data: stream). A introdução do esquema de URL de dados podem levar uma mudança de comportamento no Windows. Se você estiver usando o sistema de arquivos NTFS e usar meta streams em sua aplicação, e se ocorrer de você usar um arquivo com o nome 'data:' ele será acessado sem o seu caminho - e não funcionará mais. Para corrigir isso use o protocolo 'file:' quando for acessá-lo. Veja também » RFC 2397
    <?php
    /* when allow_url_include is OFF (default) */
    include "data:;base64,PD9waHAgcGhwaW5mbygpOz8+";
    /* Warning:  include(): URL file-access is disabled
       in the server configuration in filename on line n */
    ?>
  • Regresssão no padrão glob() Na versão 5.2.4 uma correção de segurança causava uma regressão para os padrões do formulário "/foo/*/bar/*". Desde a versão 5.2.5 ao invés de exibir um warning a função glob() retornará FALSE quando as restrições openbase_dir forem violadas.
add a note add a note

User Contributed Notes 6 notes

up
1
php dot manual at frankkleine dot de
7 years ago
Between PHP 5.2.3 and 5.2.4 another backward incompatible change was introduced: parent classes now can not access private properties of child classes with get_object_vars(). See the following example:

class Bar {
    public function dumpBar()  {
        var_dump(get_object_vars($this));
    }
}
class Foo extends Bar {
    public $public = 'public';
    protected $protected = 'protected';
    private $private = 'private';

    public function dump() {
        var_dump(get_object_vars($this));
    }
}

$foo = new Foo();
$foo->dump();
$foo->dumpBar();

The result with PHP < 5.2.4:
E:\php\tests>php get_object_vars.php
array(3) {
  ["public"]    => string(6) "public"
  ["protected"] => string(9) "protected"
  ["private"]   => string(7) "private"
}

array(3) {
  ["public"]    => string(6) "public"
  ["protected"] => string(9) "protected"
  ["private"]   => string(7) "private"
}

And the result with PHP >= 5.2.4:
E:\php-5.2.4-Win32>php ../php/tests/get_object_vars.php
array(3) {
  ["public"]    => string(6) "public"
  ["protected"] => string(9) "protected"
  ["private"]   => string(7) "private"
}

array(2) {
  ["public"]    => string(6) "public"
  ["protected"] => string(9) "protected"
}

As you can see the private property is missing now when dumped from the parent class Bar.
up
0
goellerk at bucks dot edu
4 years ago
str_pad has been modified as well, to enforce UPPERCASE sensitivity on the pad_type declaration.

Optional argument pad_type can be STR_PAD_RIGHT, STR_PAD_LEFT, or STR_PAD_BOTH. If pad_type is not specified it is assumed to be STR_PAD_RIGHT.

If entered as:
$foo = 10;
$wrong = str_pad($foo, 4,'0',str_pad_left);
print "wrong is '$wrong'<br>";

$right = str_pad($foo,4,'0',STR_PAD_LEFT);
print "right is '$right'<br>";

results:
wrong is '    '
right is '  10'
up
0
jbarker at erepublic dot com
7 years ago
If any of your code relies on includes of URLS  à la allow_url_fopen, be aware that a new directive (allow_url_include) has been added, and that it defaults to Off.
up
0
Erik Osterman
7 years ago
It should be noted that if you provide a __toString method, you can cast the object to a string and use it as an array key (PHP 5.2.x).

e.g.   $array[ (string)$myObject ] = 'foobar';

This is an alternative to using spl_object_hash.
up
-1
Alexander Schuch
5 years ago
If the sole reason for having "abstract static methods" is to force the implementation of such a method in a child, consider using an interface for them. The abstract class implements the interface, and a child class extends the base class and defines the "abstract static methods".

<?php
interface I
{
static public function
f();
}

abstract class
C implements I
{
// more/other methods go here
}

class
D extends C
{
static public function
f()
{
echo
'I am f().';
}
}
?>
up
-1
Tachy
7 years ago
$string="12345";
$rightstring1=substr($string,-3);
$rightstring2=substr($string,-8);
echo "Result1: ".$rightstring1."<BR>";
echo "Result2: ".$rightstring2."<BR>";

PHP5.1.x:
Result1: 345
Result2: 12345

PHP5.2.x
Result1: 345
Result2: <Empty>
To Top