
Hace unos días instalé la útlima versión de PHP l
anzada el 30 de junio de 2009. Hay muchos cambios, elementos nuevos y obsoletos, varios de ellos esperados para la versión 6.0 pero que, desconozco la razón, los adelantaron.
No hablaré de todos los cambios, obsolencias y nuevas funcionalidades, sino que relataré cuales fueron los cambios que exigieron de mi atención al momento de la instalación. Si quieren más detalles pueden revisar
la serie de artículos en IBM developerWorks respecto de PHP 5.3.
Lo primero con lo que me encontré fue con
nuevos niveles de error. A los ya existentes se suman
E_DEPRECATED y
E_USER_DEPRECATED los cuales nos advierten sobre funciones o sintaxis obsoleta. Actualmente trabajo con un framework que yo mismo desarrollé y con
CakePHP. Con el primero no tuve problemas respecto a obsolencias pero con el segundo si los tuve ya que en diversas partes asigna por refencia instancias de clases (
ver función new). La forma de "resolverlo" (
esto hasta que la gente de CakePHP libere una actualización) es realizar un pequeño cambio en la función write, de la clase configure.php ubicada en cake/libs/. Basta con cambiar la línea en donde aparece "error_reporting(E_ALL)" por "error_reporting(E_ALL & ~E_DEPRECATED)". La función debería quedar así:
function write($config, $value = null) {
$_this =& Configure::getInstance();
if (!is_array($config)) {
$config = array($config => $value);
}
foreach ($config as $names => $value) {
$name = $_this->__configVarNames($names);
switch (count($name)) {
case 3:
$_this->{$name[0]}[$name[1]][$name[2]] = $value;
break;
case 2:
$_this->{$name[0]}[$name[1]] = $value;
break;
case 1:
$_this->{$name[0]} = $value;
break;
}
}
if (isset($config['debug'])) {
if ($_this->debug) {
error_reporting(E_ALL & ~E_DEPRECATED);
if (function_exists('ini_set')) {
ini_set('display_errors', 1);
}
if (!class_exists('Debugger')) {
require LIBS . 'debugger.php';
}
if (!class_exists('CakeLog')) {
require LIBS . 'cake_log.php';
}
Configure::write('log', LOG_NOTICE);
} else {
error_reporting(0);
Configure::write('log', LOG_NOTICE);
}
}
}
CakePHP trae un manejador de niveles de error propio, por lo tanto, aunque indiquemos en php.ini el nuevo nivel de error, CakePHP seguirá indicando el mensaje de codigo "Deprecated". Si no trabajan con CakePHP y quieren manejar esto para todas sus aplicaciones y sitios ,el cambio que deben aplicar en el archivo php.ini es agregar & ~E_DEPRECATED a la directiva error_reporting.
Otra novedad es el cambio de la librería de comunicación con MySQL. Hasta la versión 5.2.9 se utilizaba únicamente la librería libmysql la cual estaba desarrollada para C y C++. Ahora se utiliza mysqlnd la cual está desarrollada específicamente para PHP la cual, según dicen y que no he probado empíricamente, mejora el rendimiento en diversos aspectos.
Con libmysql la configuración de instalación PHP típica (hablo de unix/linux) era:
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql
Pero ahora cambia por:
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=mysqlnd --with-mysql-sock=/var/run/mysqld/mysqld.sock
Por último, PHP 5.3 ya no utiliza la función
ereg() para trabajar con expresiones regulares, ahora debemos utilizar
preg_match() la cual no varía drásticamente en los parámetros de ingreso, permitiendo su reemplazo, en algunos casos, con un rápido buscar/reemplazar.
Este último cambio afecta a la libería para web services
NuSoap la cual, lamentablemente, aún no tiene actualización para aumentar la compatibilidad
pero si hay un foro abierto al respecto.
En la medida que aparezcan más cosas las iré comentando. Pueden consultar las siguientes fuentes con más información al respecto: