The __call function will also lowercase the method arguement:
function __call($method, $args) {
if ($method == 'Foo') {
return true;
} else {
return false
}
}
(= false)
Incompatibilités avec les version antérieures
Bien que la plupart des scripts PHP 4 existants devraient fonctionner, il convient de noter quelques incompatibilités avec les versions antérieures de PHP :
- Il y a quelques nouveaux mots réservés.
- strrpos() et strripos() utilisent maintenant une chaîne de caractères complète (un seul caractère auparavant) en tant qu'élément de recherche.
- L'utilisation d'index illégaux sur une chaîne de caractères entraîne maintenant un message E_ERROR au lieu d'un message E_WARNING auparavant. Voici un exemple incorrect : $str = 'abc'; unset($str[0]);.
- La fonction array_merge() a été modifiée pour n'accepter que des tableaux. Pour chaque variable passée en paramètre autre qu'un tableau, un message E_WARNING sera envoyé. Soyez attentifs car votre script pourrait émettre des E_WARNING de façon inopinée.
- La variable de serveur PATH_TRANSLATED n'est plus définie implicitement avec Apache2 SAPI contrairement à auparavant (PHP 4) où elle était fixée avec la même valeur que SCRIPT_FILENAME lorsqu'Apache ne la renseignait pas. Cette modification a été apportée afin d'être en conformité avec les » spécifications CGI. Merci de consulter le » bogue #23610 pour plus d'informations, ainsi que la description de $_SERVER['PATH_TRANSLATED'] du manuel. Ce problème affecte également PHP >= 4.3.2.
- La constante T_ML_CONSTANT n'est plus définie par l'extension Tokenizer. Si error_reporting est réglée à E_ALL, PHP va générer un avertissement. Bien que T_ML_CONSTANT n'ait jamais été utilisée, elle était définie dans PHP 4. Avec PHP 4 et PHP 5, // et /* */ sont assimilés à la constante T_COMMENT. Toutefois les commentaires de style PHPDoc /** */, qui sont analysés depuis PHP 5, sont reconnus en tant que T_DOC_COMMENT.
- $_SERVER contient dorénavant argc et argv si votre variables_order inclus "S". Si vous avez configuré votre système pour qu'il ne crée pas $_SERVER, ils n'existeront bien sûr pas. Cette modification a été effectuée afin que argc et argv soient toujours accessibles dans la version CLI quelle que soit la valeur de variables_order. Ainsi, la version CLI renseignera dorénavant toujours les variables $argc et $argv.
- Un objet sans propriété n'est plus considéré comme vide (empty()).
- Dans certains cas, les classes doivent être déclarées avant d'être utilisées. Cela survient uniquement si les nouvelles fonctionnalités de PHP 5 (comme les interfaces) sont utilisées. Sinon, le comportement sera le même qu'avant.
- Les fonctions get_class(), get_parent_class() et get_class_methods() retournent désormais le nom de la classe comme elle a été déclarée (sensible à la casse), ce qui peut causer des problèmes dans vos anciens scripts qui utilisent le comportement précédent (le nom de la classe était toujours retourné en minuscules). Une solution possible est de rechercher ces fonctions dans tous vos anciens scripts et d'utiliser la fonction strtolower(). Ces changements de sensibilité à la casse sont également appliqués aux constantes magiques prédéfinies __CLASS__, __METHOD__ et __FUNCTION__. Les valeurs sont retournées exactement comme elles ont été déclarées (sensible à la casse).
- La fonction ip2long() retourne maintenant FALSE lorsqu'une adresse IP invalide est entrée comme argument de la fonction, et non plus -1.
- Lorsque des fonctions sont définies dans un fichier inclus, elles peuvent être utilisées dans le fichier principal, qu'elles soient définies avant ou après l'instruction return(). Si le fichier est inclus deux fois, PHP 5 émet une erreur fatale car les fonctions sont toujours déclarées, tandis que PHP 4 n'a aucun problème avec ça. Il est recommandé d'utiliser l'instruction include_once() au lieu de vérifier si le fichier a déjà été inclus et de retourner, conditionnellement, l'inclusion du fichier.
- include_once() et require_once() normalisent d'abord le chemin du fichier à inclure sous Windows. Donc inclure le fichier A.php et le fichier a.php revient à n'inclure qu'une seule fois ce fichier.
Exemple #1 strrpos() et strripos() recherchent maintenant une chaîne de caractères dans une autre
<?php
var_dump(strrpos('ABCDEF','DEF')); //int(3)
var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>
Exemple #2 Un objet sans propriété n'est plus considéré comme vide (empty())
<?php
class test { }
$t = new test();
var_dump(empty($t)); // echo bool(false)
if ($t) {
// Cette portion de code sera exécutée
}
?>
Exemple #3 Dans certains cas, les classes doivent être déclarées avant d'être utilisées
<?php
// fonctionne sans erreur :
$a = new a();
class a {
}
// ici, une erreur :
$a = new b();
interface c{
}
class b implements c {
}
?>
Incompatibilités avec les version antérieures
paul at oconnor-web dot net
10-Apr-2008 01:17
10-Apr-2008 01:17
Steven
20-Mar-2008 01:07
20-Mar-2008 01: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 05:05
11-Mar-2008 05: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 10:48
20-Feb-2008 10: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 04:01
26-Dec-2007 04: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 02:10
08-Nov-2007 02: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 01:43
10-Aug-2007 01: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 04:22
26-Jul-2007 04: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 03:11
22-Jun-2007 03: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 11:34
29-Apr-2007 11: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 11: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 09:54
02-Nov-2004 09: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 06: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 07:45
26-Aug-2004 07: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 07:07
05-Aug-2004 07: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 10:34
20-Jul-2004 10: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
15-Jul-2004 04:17
15-Jul-2004 04: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.
