Schimbări incompatibile în sens invers

Cu toate că codul-sursă existent în PHP 5 trebuie să funcționeze fără schimbări, ar trebui să atrageți atenția la următoarele schimbări incompatibile în sens invers:

  • getrusage() întoarce null când îi sunt transmise argumente incompatibile începând cu PHP 5.2.1.
  • ZipArchive::setCommentName() întoarce true în caz de succes începând cu PHP 5.2.1.
  • ZipArchive::setCommentIndex() întoarce true în caz de succes începând cu PHP 5.2.1.
  • SplFileObject::getFilename() întoarce denumirea fișierului, și nu calea/relativă/spre/fișier, începând cu PHP 5.2.1.
  • S-a modificat prioritatea variabilei de mediu PHPRC pe sistemele Win32. Variabila de mediu PHPRC acum are prioritate față de calea stocată în registrul Windows.
  • CLI SAPI nu mai caută fișierele php.ini sau php-cli.ini în directorul curent. În PHP 5.1.x a fost introdusă o facilitate nedocumentată care făcea ca binarul CLI să caute în Directorul de Lucru Curent (DLC) un fișier de configurare PHP, ducând potențial la un comportament imprevizibil atunci când era citit un fișier de configurare neașteptat. Această funcționalitate a fost eliminată în versiunea 5.2.0, și PHP nu mai caută în DLC fișierele php.ini sau php-cli.ini. Accesați de asemenea secțiunea manualului referitoare la linia de comandă.
  • A fost adăugată o preîntâmpinare la efectuarea operației modulus 0. În versiunile anterioare ale PHP, efectuarea operației "integer % 0" nu emitea nici un mesaj de preîntâmpinare, întorcând, în loc, o valoare neașteptată false. Începând cu PHP 5.2.0 această operație va emite un E_WARNING, după cum e cazul și în orice altă situație când se efectuează împărțirea la zero.
    <?php
    print 10 0;
    /* Warning:  Division by zero in filename on line n */
    ?>
  • A fost modificat __toString() pentru a fi apelat oricând este aplicabil. Metoda magică __toString() acum va fi apelată în contextul unui string, adică oriunde un obiect este utilizat ca string. Situația când se întoarce un string care conține identificatorul obiectului a fost abandonată în PHP 5.2.0. Aceasta devenise problematică deoarece identificatorul obiectului nu poate fi considerat unic. Această schimbare va însemna că aplicația dumneavoastră este defectuoasă dacă v-ați bazat pe identificatorul obiectului în calitate de valoare întoarsă. Acum încercarea de a utiliza această valoare în calitate de string va rezulta în emiterea unei erori fatale interceptabile.
    <?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 */
    ?>
    Chiar și cu __toString() obiectele nu pot fi utilizate ca indici ai tabloului sau chei. S-ar putea să adăugăm ulterior susținerea încorporată a hash-urilor pentru aceasta, însă în PHP 5.2.x va trebui sau să creați propria funcție hash, sau să utilizați noua funcție SPL spl_object_hash(). Din metodele __toString() nu pot fi aruncate excepții.
    <?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) {}
    ?>
  • Au fost abandonate funcțiile de clasă statice abstracte. Din cauza unei scăpări, PHP 5.0.x și 5.1.x permiteau funcții abstracte statice în clase. Începând cu PHP 5.2.x, numai interfețele le pot avea.
    <?php
    abstract class foo {
        abstract static function 
    bar();
        
    /* Strict Standards:  Static function foo::bar()
        should not be abstract in filename on line n */
    }
    ?>
  • Extensia Oracle necesită prezența a cel puțin Oracle 10 pe Windows.
  • A fost adăugată susținerea RFC2397 (fluxurile data:). Introducerea schemei URL 'data' poate duce la o schimbare în comportament sub Windows. Dacă lucrați cu un sistem de fișiere NTFS și utilizați meta-fluxurile în aplicația dumneavoastră, și dacă se întâmplă să utlizați un fișier cu denumirea 'data:', accesat fără informația despre cale - aceasta nu va mai funcționa. Pentru a corecta aceasta, utilizați protocolul 'file:' pentru a-l accesa. Accesați de asemenea » 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 */
    ?>
  • Regresul în șabloanele glob() În versiunea 5.2.4 o corectare a unei probleme de securitate cauza un regres al șabloanelor de forma "/foo/*/bar/*". Începând cu versiunea 5.2.5 în loc de a emite o preîntâmpinare, funcția glob() va întoarce false când restricțiile openbase_dir sunt încălcate.
add a note add a note

User Contributed Notes 5 notes

up
3
php dot manual at frankkleine dot de
17 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
1
Alexander Schuch
14 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
goellerk at bucks dot edu
14 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
-1
jbarker at erepublic dot com
16 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
-1
Erik Osterman
17 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.
To Top