The __call function will also lowercase the method arguement:
function __call($method, $args) {
if ($method == 'Foo') {
return true;
} else {
return false
}
}
(= false)
Cambios Incompatibles con Versiones Anteriores
Aunque la mayoría de código PHP 4 existente debe correr sin modificaciones, es importante que preste atención a los siguientes cambios incompatibles con versiones anteriores:
- Existen algunas palabras clave nuevas.
- strrpos() y strripos() ahora usan la cadena entera como aguja.
- El uso de índices de cadena inválidos generan errores de tipo E_ERROR en lugar de E_WARNING. Un ejemplo de uso inválido es: $cadena = 'abc'; unset($cadena[0]);.
- Se modificó array_merge() para que acepte únicamente matrices. Si una variable de un tipo diferente a matriz es pasada, se genera un error de tipo E_WARNING para cada uno de esos parámetros. Tenga cuidado, ya que su código puede comenzar a emitir anuncios E_WARNING de la nada.
- La variable de servidor PATH_TRANSLATED ya no es definida de forma implícita bajo la SAPI de Apache2, a diferencia del comportamiento de PHP 4, en donde se define con el mismo valor de la variable de servidor SCRIPT_FILENAME cuando no se define por Apache. Este cambio fue realizado para seguir la » especificación CGI. Por favor refiérase al » bug #23610 para más información, y asimismo vea la descripción de $_SERVER['PATH_TRANSLATED'] en el manual. Este problema afecta también a las versiones >= 4.3.2 de PHP.
- La constante T_ML_COMMENT ya no es definida por la extensión Tokenizer. Si el valor de error_reporting es E_ALL, PHP generará una noticia. Aunque la constante T_ML_COMMENT nunca fue usada, estaba definida en PHP 4. Tanto en PHP 4 como en PHP 5 // y /* */ son resueltos como la constante T_COMMENT. Sin embargo, los comentarios estilo PHPDoc /** */, que son interpretados a partir de PHP 5, se reconocen como T_DOC_COMMENT.
- $_SERVER debe poblarse con argc y argv si variables_order incluye "S". Si ha configurado su sistema específicamente para no crear $_SERVER, entonces por supuesto que no aparecerá. El cambio fue hecho para lograr que argc y argv siempre estuvieran disponibles en la versión CLI independientemente del parámetro variables_order. Es decir, ahora la versión CLI define siempre las variables globales $argc y $argv.
- Un objeto sin propiedades ya no es considerado "vacío".
- En algunos casos, las clases deben ser declaradas antes de su uso. Esto sólo ocurre si algunas de las nuevas características de PHP 5 (tal como las interfaces) son usadas. De otro modo el comportamiento antiguo se conserva.
- get_class(), get_parent_class() y get_class_methods() devuelven ahora el nombre de las clases/métodos como ellos fueron declarados (siguiendo las mayúsculas y minísculas) lo cual puede llevar a problemas en scripts viejos que dependían en el comportamiento anterior (el nombre de la clase/método era devuelto en minúsculas siempre). Una posible solución es buscar las funciones mencionadas en todos sus scripts y usar strtolower(). Este cambio en la sensibilidad a minúsculas y mayúsculas se aplica también a las constantes predefinidas mágicamente __CLASS__, __METHOD__, y __FUNCTION__. Los valores son devueltos exactamente como son declarados (sensibles a mayúsculas y minúsculas).
- ip2long() ahora devuelve FALSE cuando una dirección IP inválida es pasada como argumento a la función, y no -1.
- Si hay funciones definidas en el archivo incluido, éstas pueden ser usadas en el archivo principal, sin importar que estén antes de una sentencia return() o después. Si el archivo es incluido dos veces, PHP 5 produce un error fatal ya que las funciones ya han sido declaradas, mientras que PHP 4 no se queja al respecto. Se recomienda usar include_once() en lugar de revisar si el archivo ya había sido incluido y retornar condicionalmente al interior del archivo incluido.
- include_once() y require_once() primero normalizan la ruta del archivo incluido en Windows de modo que incluir A.php y a.php incluyen el archivo solo una vez.
Example #1 strrpos() y strripos() ahora usan la cadena entera como aguja
<?php
var_dump(strrpos('ABCDEF','DEF')); //int(3)
var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>
Example #2 Un objeto sin propiedades ya no es considerado "vacío"
<?php
class prueba { }
$p = new prueba();
var_dump(empty($p)); // echo bool(false)
if ($p) {
// Se ejecuta
}
?>
Example #3 En algunos casos, las clases deben declararse antes de ser usadas
<?php
// funciona sin errores:
$a = new a();
class a {
}
// gerena un error:
$a = new b();
interface c{
}
class b implements c {
}
?>
Cambios Incompatibles con Versiones Anteriores
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.
