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'
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
NULLcâ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 unE_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.
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 {}
$foo = new foo;
print $foo;
/* Catchable fatal error: Object of class foo could
not be converted to string in filename on line n */
?><?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
FALSEcând restricțiile openbase_dir sunt încălcate.
goellerk at bucks dot edu ¶
3 years ago
Alexander Schuch ¶
3 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().';
}
}
?>
jbarker at erepublic dot com ¶
5 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.
Tachy ¶
5 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>
php dot manual at frankkleine dot de ¶
5 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.
Erik Osterman ¶
6 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.
