The __call function will also lowercase the method arguement:
function __call($method, $args) {
if ($method == 'Foo') {
return true;
} else {
return false
}
}
(= false)
Schimbări incompatibile în sens invers
Cu toate că majoritatea codului-sursă existent în PHP 4 ar trebui să funcţioneze fără schimbări, totuşi ar trebui să atrageţi atenţia la următoarele schimbări incompatibile în sens invers:
- Sunt unele noi cuvinte-cheie rezervate.
- strrpos() şi strripos() acum utilizează întregul string în calitate de 'ac'.
- Utilizarea nelegală a deplasamentelor în string-uri cauzează E_ERROR în loc de E_WARNING. Un exemplu de utilizare nelegală ar fi: $str = 'abc'; unset($str[0]);.
- array_merge() a fost schimbată pentru ca să accepte numai tablouri. Dacă îi este transmisă o variabilă care nu este tablou, un E_WARNING va fi aruncat pentru fiecare astfel de parametru. Fiţi atent, deoarece codul dumneavoastră poate să înceapă să emită E_WARNING din senin.
- Variabila de server PATH_TRANSLATED nu mai este stabilită implicit sub Apache2 SAPI în contrast cu situaţia în PHP 4, unde ea este stabilită la aceeaşi valoare ca şi variabila de server SCRIPT_FILENAME, atunci când nu este populată de Apache. Această schimbare a fost făcută pentru a ne conforma cu » specificaţia CGI. Vă rugăm să vă referiţi la » bug #23610 pentru informaţii suplimentare şi vedeţi de asemenea descrierea $_SERVER['PATH_TRANSLATED'] în manual. Această problemă de asemenea afectează versiunile PHP >= 4.3.2.
- Constanta T_ML_COMMENT nu mai este definită de către extensia Tokenizer. Dacă error_reporting este stabilită la E_ALL, PHP va genera o notificare. Cu toate că T_ML_COMMENT niciodată nu a fost utilizată, ea a fost definită în PHP 4. În ambele PHP 4 şi PHP 5 // şi /* */ sunt soluţionate ca constante T_COMMENT. Însă comentariile în stil PHPDoc /** */, care începând cu PHP 5 sunt înţelese de PHP, sunt recunoscute ca T_DOC_COMMENT.
- $_SERVER ar trebui să fie populată cu argc şi argv dacă variables_order include "S". Dacă aţi configurat sistemul dumneavoastră în mod specific să nu creeze $_SERVER, atunci desigur ea nu va fi. Schimbarea a fost de a face argc şi argv disponibile în versiunea CLI indiferent de setarea variables_order. Deci versiunea CLI acum întotdeauna va popula variabilele globale $argc şi $argv.
- Un obiect fără proprietăţi nu mai este considerat "vid".
- În unele cazuri clasele trebuiesc declarate înainte de a fi utilizate. Aceasta se întâmplă numai dacă unele facilităţi noi ale PHP 5 (cum ar fi interfeţele) sunt utilizate. În caz contrar, comportamentul este pe vechi.
- get_class(), get_parent_class() şi get_class_methods() acum întorc numele claselor/metodelor aşa cum ele au fost declarate (respectându-se literele majuscule/minuscule), ceea ce poate duce la probleme cu script-urile mai vechi care se bazează pe comportamentul vechi (numele claselor/metodelor întotdeauna erau întoarse cu litere minuscule). O soluţie posibilă este de a căuta aceste funcţii în toate script-urile şi de a le aplica strtolower(). Această diferenţiere a literelor majuscule/minuscule de asemenea se aplică la constantele predefinite magice __CLASS__, __METHOD__ şi __FUNCTION__. Valorile sunt întoarse exact cum sunt declarate (respectându-se literele majuscule/minuscule).
- ip2long() acum întoarce FALSE când o adresă IP nevalidă îi este transmisă ca argument şi nu -1 ca înainte.
- Dacă există funcţii definite într-un fişier inclus, ele pot fi utilizate în fişierul de bază indiferent dacă se află înainte de return() sau după. Dacă fişierul este inclus de două ori, PHP 5 va emite o eroare fatală deoarece funcţiile au fost declarate deja, în timp ce PHP 4 nu se plânge de acest fapt. Este recomandat de a utiliza include_once() în loc de a verifica dacă fişierul a fost inclus deja şi de a ieşi în acest caz din fişierul inclus.
- include_once() şi require_once() întâi normalizează calea fişierului inclus în Windows astfel încât includerea A.php şi a.php va include fişierul numai o singură dată.
Example #1 strrpos() şi strripos() acum utilizează întregul string în calitate de 'ac'
<?php
var_dump(strrpos('ABCDEF','DEF')); //int(3)
var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>
Example #2 Un obiect fără proprietăţi nu mai este considerat "vid"
<?php
class test { }
$t = new test();
var_dump(empty($t)); // echo bool(false)
if ($t) {
// Va fi executat
}
?>
Example #3 În unele cazuri clasele trebuie declarate înainte de a fi utilizate
<?php
// funcţionează fără erori:
$a = new a();
class a {
}
// aruncă o eroare:
$a = new b();
interface c{
}
class b implements c {
}
?>
Schimbări incompatibile în sens invers
paul at oconnor-web dot net
10-Apr-2008 04:17
10-Apr-2008 04:17
Steven
19-Mar-2008 05:07
19-Mar-2008 05:07
Three more that we discovered:
== 1. No longer can re-assign $this ==
The follwoing example works under PHP4 (it outputs "OK"), but produces a fatal error under PHP5:
<?
class a
{
var $text;
function a() { $this->text = 'OK'; }
}
class b
{
var $text = 'NOT OK';
function b() { $this = new a(); }
}
$myClass = new b();
echo $myClass->text;
?>
== 2. No comments allowed after shorthand echo block ==
The follwoing example works under PHP4, but produces a sytax error under PHP5.
<?=//comment?>
== 3. Constructors return a reference as default ==
The follwoing example works under PHP4, but produces an E_NOTICE notice under PHP5.
<?
class MyClass { function MyClass() { echo('OK'); } }
$myObj = null;
$myObj &= new MyClass();
?>
Removing the ampersand solves the problem
cyberscribe at php dot net
11-Mar-2008 09:05
11-Mar-2008 09:05
The comment from "Bright Spark" on 20 Feb 08 must be a prank. This behavior is not due to "an unresolved bug" in PHP 5. It is due to the phpversion() function providing 5 as the first character of its return string, whereas in PHP 4 the first character was 4. Evaluating 2*5=10 is no more a bug than evaluating 2*4=8.
Bright Spark
20-Feb-2008 01:48
20-Feb-2008 01:48
Please note that if you are using the following code to generate the number 8, due to an unresolved bug it will now return 10 in the newer version of PHP:
echo 2*((int)substr(phpversion(),0,1)); // returns 8 in PHP4
echo 2*((int)substr(phpversion(),0,1)); // returns 10 in PHP5
Emre Sururi
26-Dec-2007 07:01
26-Dec-2007 07:01
I had trouble with passing the variables from the command line. I used to do it simply by sending them smt like:
php.exe filename.php firstvar=firstval secondvar=secondval
and reaping them through $_GET["firstvar"], $_GET["secondvar"] and this elasticity allowed me to run the script without having anything to change either from the command line as quoted above, or from the browser interface through:
localhost/filename.php?firstvar=firstval&secondvar=secondval
But PHP 5 just collects them in $_SERVER["argv"] array. And it differs whether you use the command line or the browser interface. I solved this problem via the following procedure:
//For command line variable passing:
for($i=1;$i<sizeof($_SERVER["argv"]);$i++)
{
list($var0,$val0) = explode("=",$_SERVER["argv"][$i]);
$_GET[$var0] = $val0;
}
Aggelos Orfanakos
08-Nov-2007 05:10
08-Nov-2007 05:10
As with array_merge(), array_merge_recursive() returns NULL in PHP 5 if a non-array parameter is passed to it.
Sinured
10-Aug-2007 04:43
10-Aug-2007 04:43
Not mentioned above: The PHP/FI 2 function style (old_function aka cfunction) is no longer supported as of PHP 5.
nami
26-Jul-2007 07:22
26-Jul-2007 07:22
addition of the note on 07-Sep-2004 06:40
if you write down your code like this PHP5 will just work fine:
$array_1 = array('key1'=>'oranges','key2'=>'apples');
$array_2 = array('key3'=>'pears','key4'=>'tomatoes');
$array_3 = array();
$arr_gemerged = array_merge($array_1,$array_2,$array_3);
echo "result:<br>";
print_r($arr_gemerged);
echo "<br>";
---
so you have to declare array_3 as array() instead of NULL
kemal djakman
22-Jun-2007 06:11
22-Jun-2007 06:11
The handling of accessing empty property of a class error has also changed:
<?php
class Foo {
var $Bar = 'xxx';
function F() {
echo $this->$Bar;
}
}
$Obj = new Foo();
$Obj->F();
?>
Notice the $ sign after object dereference opr? $Bar is empty inside method F. PHP4 would only generate a warning, PHP5 throws a fatal error
Amir Laher
29-Apr-2007 02:34
29-Apr-2007 02:34
Some other things to be aware of:
some extra strictness:
* object members can no longer be accessed using array-member syntax
* function-calls with too many arguments will now cause errors.
Also, from PHP5.2, custom session handlers are affected:
* Best not to use global objects in custom session-handling functions. These would get destructed *before* the session is written (unless session_write_close() is called explicitly).
28-Feb-2006 02:03
is_a have been deprecated. You can simply replace all occurences with the new instanceOf operator, although this will break backwards-compatibility with php4.
dward . maidencreek.com
02-Nov-2004 12:54
02-Nov-2004 12:54
Another change that we've had problems with while trying to use PHP4 code in PHP5 is how $this is carried across static method calls if they are not declared static in PHP5. The main issue was that debug_backtrace() now shows the first class with -> instead of the second with :: in the backtrace element when the method in the second class was called statically (using ::) from a method in the first class.
07-Sep-2004 09:40
Be careful with array_merge in PHP5.1 not only a E_WARNING is thrown, but also the result is an empty array. So if you merge two select queries and the last one is empty you will end up with no array at all.
$array_1 = array('key1'=>'oranges','key2'=>'apples');
$array_2 = array('key3'=>'pears','key4'=>'tomatoes');
$array_3 = null;
$arr_gemerged = array_merge($array_1,$array_2,$array_3);
echo "result:<br>";
print_r($arr_gemerged);
echo "<br>";
Result on php4:
result:
Array ( [key1] => oranges [key2] => apples [key3] => pears [key4] => tomatoes )
Result on php5:
Warning: array_merge() [function.array-merge]: Argument #3 is not an array in /Library/WebServer/Documents/regis24/admin/test_array_merge.php on line 7
result:
john.g
26-Aug-2004 10:45
26-Aug-2004 10:45
PATH_TRANSLATED is handy when using Apache's ModRewrite engine, as it gives you the name and path of the resulting file rather than the one that was requested by the user. Since PHP 5.0 and Apache 2 no longer support this variable, I created a workaround by adding an environment variable to my ModRewrite command:
Original:
RewriteRule ^/test/(.*)\.php(.*) /test/prefix_$1.php$2
Adjusted:
RewriteRule ^/test/(.*)\.php(.*) /test/prefix_$1.php$2 [E=TARGET:prefix_$1.php]
I could then find out the resulting file name through the super global $_ENV, for instance:
<?php
echo "The actual filename is ".$_ENV['REDIRECT_TARGET'];
?>
Note: The "REDIRECT_" prefix appears to be allocated automatically by ModRewrite.
cyberhorse
05-Aug-2004 10:07
05-Aug-2004 10:07
clone() is a php function now.
if you create a subclass, it no longer uses samename methods in superclass as a constructor.
Justin Gehring
20-Jul-2004 01:34
20-Jul-2004 01:34
One more thing that is not backwards compatible with PHP 5.0 (at least as far as we can tell) is the XSLT Sablotron librarys and the old DOM_XML librarys. Both have replacements, but translations will need to be made with either an alias class, or in the code itself.
-Justin Gehring
jbeall /\t heraldic d0t us
14-Jul-2004 07:17
14-Jul-2004 07:17
Another change that was made is the behavior when you try to reassign $this.
Before, you could reassign $this from within an object, and thus change it to a different class. Now, this results in a parse error.
