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 {
}
?>