Forum und email

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


// gerena un error:
$a = new b();

interface 
c{
}
class 
implements {
}

?>