PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Noile mesaje de eroare> <Migrarea de la PHP 5.1.x la PHP 5.2.x
Last updated: Fri, 18 Jul 2008

view this page in

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 atuncate 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
Schimbări incompatibile în sens invers
jbarker at erepublic dot com
21-Feb-2008 06:44
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.
Tachy
31-Jan-2008 08:04
$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>
php dot manual at frankkleine dot de
10-Nov-2007 04:17
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.
Erik Osterman
29-Mar-2007 08:44
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.

 
show source | credits | stats | sitemap | contact | advertising | mirror sites