Qué ha cambiado en PHP 5.0.x
CLI y CGI
Migración desde PHP 4 a PHP 5.0.x
PHP Manual

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

Qué ha cambiado en PHP 5.0.x
CLI y CGI
Migración desde PHP 4 a PHP 5.0.x
PHP Manual