PHP 5.4.36 Released

Cambiamenti non compatibili

Anche se la maggior parte del codice PHP 5 esistente dovrebbe funzionare senza modifiche, occorre fare attenzione ai seguenti cambiamenti imcompatibili col codice precedente:

  • getrusage() restituisce NULL quando riceve argomenti non compatibili a partire da PHP 5.2.1.
  • ZipArchive::setCommentName() se ha con buon esito restituisce TRUE a partire da PHP 5.2.1.
  • ZipArchive::setCommentIndex() se ha buon esito restituisce TRUE a partire da PHP 5.2.1.
  • SplFileObject::getFilename() restituisce il nome del file, e non il percorso relativo del file, a partire da PHP 5.2.1.
  • Cambiata la priorità della variabile d'ambiente PHPRC in Win32 Ora la variabile d'ambiente PHPRC ha priorità rispetto al percorso salvato nel registro di Windows.
  • CLI SAPI non controlla più la cartella corrente in php.ini o nel file php-cli.ini In PHP 5.1.x fu aggiunta una funzionalità non documentata nella versione CLI, la quale cercava nella cartella corrente un file di configurazione PHP, potenzialmente causando comortamenti non prevedibili nel caso fosse letto un file con configurazioni inattese. Questa funzionalità è stata rimossa nel 5.2.0, e PHP non cercherà più nella CWD la presenza di php.ini o php-cli.ini. Vedere anche la sezione command line del manuale.
  • Aggiunto un allarme quando si eseguono operazioni a modulo 0 Nelle prime bersioni di PHP, l'esecuzione di intero % 0 restituiva non dei messaggi di allarme, bensì un valore FALSE inaspettato. Dal PHP 5.2.0, questa operazione crea un E_WARNING, come in tutte le altre situazioni in cui viene eseguita una divisione per 0.
    <?php
    print 10 0;
    /* Warning:  Division by zero in filename on line n */
    ?>
  • La funzione __toString() viene sempre chiamata dove possibile. Il metodo 'magico' __toString() viene ora chiamato nel contesto di stringa, ovvero, ovunque un oggetto sia usato come una stringa. La soluzione di ripiego di restituire una stringa che contiene l'identificativo dell'oggetto è stata abbandonata col PHP 5.2.0. Questo è diventato problematico poiché un identificativo di oggetto non può essere considerato univoco. Questo cambiamento significa che qualsiasi applicazione che si basi sugli identificativi come valore di ritorno è da correggere. Un tentativo di utilizzare questo valore come stringa ora risulterà in un errore fatale intercettabile.
    <?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 */
    ?>
    Anche con __toString(), gli oggetti non possono essere usati come indici o chiavi degli array. In futuro potrà essere aggiunto un supporto integrato, ma nel PHP 5.2.x occorre fornire una funzione di hashing personalizzata o utitlizzare la nuova funzione SPL spl_object_hash(). Le eccezioni non possono essere lanciate dai metodi __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) {}
    ?>
  • Abbandonate le funzioni astratte statiche. A causa di una svista, PHP 5.0.x e 5.1.x permettevano funzioni astratte e statiche nelle classi. Dal PHP 5.2.x solo le interfacce possono averle.
    <?php
    abstract class foo {
        abstract static function 
    bar();
        
    /* Strict Standards:  Static function foo::bar()
           should not be abstract in filename on line n */
    }
    ?>
  • L'estensione Oracle richiede almeno Oracle 10 in Windows.
  • Aggiunto il supporto a RFC2397 (data: stream). L'introduzione dello schema di URL 'data' può portare ad un cambio nel comportamento sotto Windows. Se si lavora con un filesystem NTFS e nell'applicazione si usano i meta stream, non sarà più possibile effettuare operazioni su un file di nome 'data:' che venga raggiunto senza informazioni sul percorso. Il rimedio è utilizzare il protocollo 'file:' per accedere al file. Vedere anche » 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 */
    ?>
  • Regressione nei pattern glob() Nella versione 5.2.4 un fix di sicurezza ha causato una regressione per il pattern nella forma "/foo/*/bar/*". Dalla versione 5.2.5 invece di alzate un allarme la funzione glob() restituisce FALSE false quando le restrizioni openbase_dir sono violate.
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
6 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
4 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
6 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