1
0
mirror of https://github.com/php/doc-es.git synced 2026-04-26 08:38:05 +02:00
Files
archived-doc-es/appendices/migration51.xml
T
Pedro Antonio Gil Rodríguez ce2e8abb67 Actualización a la última versión
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@334597 c90b9560-bf6c-de11-be94-00142212c4b1
2014-08-25 11:40:57 +00:00

900 lines
28 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: b2c156678049385ccb6d4395318a52267fd047cf Maintainer: seros Status: ready -->
<!-- Reviewed: no -->
<appendix xml:id="migration51" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Migración de PHP 5.0.x a PHP 5.1.x</title>
<para>
&manual.migration.seealso;
<link linkend="migration5">5.0.x</link>,
<link linkend="migration52">5.2.x</link>,
<link linkend="migration53">5.3.x</link>,
<link linkend="migration54">5.4.x</link> y
<link linkend="migration55">5.5.x</link>.
</para>
<section xml:id="migration51.changes">
<title>Funcionalidades clave de PHP 5.1.x</title>
<para>
Algunas de las funcionalidades clave de PHP 5.1.x son:
</para>
<itemizedlist>
<listitem>
<para>
Rescritura completa del código de manejo de fechas, mejorando el soporte de zonas horarias.
</para>
</listitem>
<listitem>
<para>
Mejoras significativas de rendimiento respecto a PHP 5.0.X.
</para>
</listitem>
<listitem>
<para>
La extensión PDO está ahora habilitada por omisión.
</para>
</listitem>
<listitem>
<para>
Alrededor de 30 nuevas funciones, entre varias extensiones y funcionalidades del nucleo.
</para>
</listitem>
<listitem>
<para>
Alrededor de 400 errores corregidos.
</para>
</listitem>
</itemizedlist>
</section>
<section xml:id="migration51.references">
<title>Cambios en el control de referencias</title>
<itemizedlist>
<listitem>
<para>
<link linkend="migration51.references-overview">Resumen</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="migration51.references-fails">Código que funcionaba en PHP
4.3.x, y ahora falla</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="migration51.references-error">Código que funcionaba en PHP
4.3.x, y ahora lanza un error</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="migration51.references-works">Código que fallaba en PHP
4.3.x, y ahora funciona</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="migration51.references-didnotwork">Código que
debería haber funcionado en PHP 5.0.x</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="migration51.references-warnings">Alertas que vienen y
van</link>
</para>
</listitem>
</itemizedlist>
<section xml:id="migration51.references-overview">
<title>Resumen</title>
<para>
Desde el punto de vista del lector de scripts PHP, el cambio que más
impacto tendrá a la hora de mantener el código compatible, es la forma en que se manejan
las referencias en las versiones de PHP posteriores a 4.4.0.
</para>
<para>
Hasta PHP 4.3, incluida ésta, era posible enviar, asignar o devolver
variables por referencia que realmente tenían que devolver un valor, como
una constante, un valor temporal (p.ej. el resultado de una expresión), o el
resultado de una función que ha devuelto sí misma como valor, como aquí:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$foo = "123";
function return_value() {
global $foo;
return $foo;
}
$bar = &return_value();
?>
]]>
</programlisting>
</informalexample>
<para>
Aunque este código normalmente funcionará en PHP 4.3 como cabe esperar,
en general el resultado es indefinido. El Zend Engin podría no actuar
correctamente con estos valores como referencia. Este error podría llevar
a problemas de memorias corruptas difíciles de reproducir, en especial cuando
el código base es muy largo.
</para>
<para>
En PHP 4.4.0, PHP 5.0.4, y posterior, el motor Zend se ha corregido para que
'sepa' cuándo una operación por referencia se usa en un valor que no
debería referenciarse. En estos casos se utiliza el valor real,
y se emite una alerta. Esta alerta es en forma de
<constant>E_NOTICE</constant> en PHP 4.4.0 y superior, y de
<constant>E_STRICT</constant> en PHP 5.0.4 y superior.
</para>
<para>
Los códigos que podrían producir corrupciones en memoria ya no podrán hacerlo.
Sin embargo, hay códigos fuente que podrían funcionar de forma distinta a la esperada.
</para>
</section>
<section xml:id="migration51.references-fails">
<title>Código que funcionaba en PHP 4.3, pero ahora falla</title>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
function func(&$arraykey) {
return $arraykey; // ¡la función devuelve un valor!
}
$array = array('a', 'b', 'c');
foreach (array_keys($array) as $key) {
$y = &func($array[$key]);
$z[] =& $y;
}
var_dump($z);
?>
<]]>
</programlisting>
<para>
Al ejecutar el script superior en alguna versión de PHP anterior a la
corrección del error, producirá la siguiente salida:
</para>
<screen>
<![CDATA[
array(3) {
[0]=>
&string(1) "a"
[1]=>
&string(1) "b"
[2]=>
&string(1) "c"
}
]]>
</screen>
<para>
Y tras corregir el error de referencias, el mismo código resultará en:
</para>
<screen>
<![CDATA[
array(3) {
[0]=>
&string(1) "c"
[1]=>
&string(1) "c"
[2]=>
&string(1) "c"
}
]]>
</screen>
</informalexample>
<para>
Esto es porque, de acuerdo a los cambios, la asignación en <literal>func()</literal>
se hace por valor. El valor de <varname>$y</varname> se reasigna,
y se impide enlazar por referencia a <varname>$z</varname>. Antes de la
corrección, se asignaba el valor por referencia, dando lugar a que <varname>$y</varname>
se revinculara en cada asignación. El intento de enlazar a un valor
temporal por referencia era la causa de la memoria corrupta.
</para>
<para>
Dicho código se puede rescribir para funcionar de forma idéntica en
ambas versiones. La definición de <literal>func()</literal> se puede modificar
para devolver valores por referencia, o se podría eliminar la asignación
por referencia del resultado de <literal>func()</literal>.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
function func() {
return 'devolución de la function';
}
$x = 'valor original';
$y =& $x;
$y = &func();
echo $x;
?>
]]>
</programlisting>
</informalexample>
<para>
En PHP 4.3 <varname>$x</varname> será 'valor original', mientras que tras los
cambios será 'devolución de la función' - recuerde que como la función
no devuelve el valor por referencia, la asignación por referencia se convierte
a una asignación convencional. De nuevo, esto puede se llevar a un comportamiento común,
o bien forzando a que <literal>func()</literal> devuelva el valor por referencia
o eliminando la asignación por referencia.
</para>
</section>
<section xml:id="migration51.references-error">
<title>Código que funcionaba en PHP 4.3.x, pero ahora lanza un error</title>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
class Foo {
function getThis() {
return $this;
}
function destroyThis() {
$baz =& $this->getThis();
}
}
$bar = new Foo();
$bar->destroyThis();
var_dump($bar);
?>
]]>
</programlisting>
</informalexample>
<para>
En PHP 5.0.3, <varname>$bar</varname> se evaluaba a <constant>NULL</constant>
en lugar de devolver un objeto. Esto sucedía porque
<literal>getThis()</literal> devuelve por valor, pero el valor aquí se
asigna por referencia. A pesar de que funciona de la forma esperada, esto es en realidad
un código inválido que lanzará un <constant>E_NOTICE</constant>
en PHP 4.4 o un <constant>E_STRICT</constant> en PHP 5.0.4 y superior.
</para>
</section>
<section xml:id="migration51.references-works">
<title>Código que fallaba en PHP 4.3.x, pero ahora funciona</title>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
function &f() {
$x = "foo";
var_dump($x);
print "$x\n";
return($a);
}
for ($i = 0; $i < 3; $i++) {
$h = &f();
}
?>
]]>
</programlisting>
<para>
En PHP 4.3 la tercera llamada a <function>var_dump</function> produce
<constant>NULL</constant>, debido a la memoria corrupta provocada tras
devolver por referencia un valor no inicializado. Este código es valido
en PHP 5.0.4 y superior, pero lanza errores en versiones de PHP anteriores.
</para>
</informalexample>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$arr = array('a1' => array('alfa' => 'ok'));
$arr =& $arr['a1'];
echo '-'.$arr['alfa']."-\n";
?>
]]>
</programlisting>
<para>
Hasta PHP 5.0.5, no era posible asignar un array por referencia
de esta forma. Ahora sí.
</para>
</informalexample>
</section>
<section xml:id="migration51.references-didnotwork">
<title>Código que <literal>debería haber funcionado</literal> en PHP 5.0.x</title>
<para>
Hay un par de de errores en PHP 5.0, anteriores a que se
corrigiera el problema de referencias, que ahora 'funcionan'. Sin embargo, en ambos
casos los errores se emiten en PHP 5.1.x, porque en primer lugar, el código era
inválido. Devolver un valor por referencia usando <literal>self::</literal> ahora,
en términos generales, funciona pero emite una alerta <constant>E_STRICT</constant>,
y se emitirá un <constant>E_ERROR</constant> cuando se asigne por referencia
un objeto sobrecargado, incluso cuando parezca que la asignación ha funcionado.
</para>
</section>
<section xml:id="migration51.references-warnings">
<title>Alertas que vienen y van</title>
<para>
Las llamadas anidadas a funciones que devuelven por valores por referencia son válidas tanto
en PHP 4.3.x como en PHP 5.1.x, pero emiten
<constant>E_NOTICE</constant> o <constant>E_STRICT</constant> en las
versiones de PHP intermedias.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
function & foo() {
$var = 'ok';
return $var;
}
function & bar() {
return foo();
}
$a =& bar();
echo "$a\n";
?>
]]>
</programlisting>
</informalexample>
</section>
</section>
<section xml:id="migration51.reading">
<title>Leyendo []</title>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
class XmlTest {
function test_ref(&$test) {
$test = "ok";
}
function test($test) { }
function run() {
$ar = array();
$this->test_ref($ar[]);
var_dump($ar);
$this->test($ar[]);
}
}
$o = new XmlTest();
$o->run();
?>
]]>
</programlisting>
</informalexample>
<para>
Esto debería haber emitido un error fatal <constant>E_ERROR</constant>,
ya que [] no se puede usar para leer en PHP. Es un código inválido
en PHP 4.4.2, PHP 5.0.5 y superior.
</para>
</section>
<section xml:id="migration51.integer-parameters">
<title>Valores enteros en los parámetros de funciones</title>
<para>
Con la llegada de PHP 5.0.x, se introdujo una nueva API de análisis de
parámetros que se usa por un gran número de funciones PHP. El control de valores
enteros en las versiones de PHP entre 5.0.x y 5.1.x era muy estricto y cuando una
función PHP esperaba un valor entero, se hubiera rechazado cualquier valor numérico
malformado. Se han suavizado estas comprobaciones para permitir valores numéricos
malformados como " 123" o "123 ", de forma que ya no fallará tal y como ocurría en
PHP 5.0.x. En cualquier caso, para apostar por un código seguro y para validar las
entradas, las funciones PHP emitirán un <constant>E_NOTICE</constant> cuando se
pasen textos de ese tipo como enteros.
</para>
</section>
<section xml:id="migration51.oop">
<title>Cambios en clases y objetos</title>
<itemizedlist>
<listitem>
<para>
<link linkend="migration51.oop-functions"><literal>instanceof</literal>,
<literal>is_a()</literal>, <literal>is_subclass_of()</literal> y
<literal>catch</literal></link>
</para>
</listitem>
<listitem>
<para>
<link linkend="migration51.oop-methods">Métodos privados abstractos</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="migration51.oop-modifiers">Modificadores de acceso en
interfaces</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="migration51.oop-inheritance">Cambios en las reglas de
herencia</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="migration51.oop-constants">Constantes de clases</link>
</para>
</listitem>
</itemizedlist>
<section xml:id="migration51.oop-functions">
<title><literal>instanceof</literal>, <literal>is_a()</literal>,
<literal>is_subclass_of()</literal> y <literal>catch</literal></title>
<para>
En PHP 5.0, <literal>is_a()</literal> quedó obsoleto en favor del operador
<literal>instanceof</literal>. Había algunos problemas con la implementación
inicial de <literal>instanceof</literal>, que dependía de
<literal>__autoload()</literal> para localizar las clases no encontradas.
Si no se localizara la clase, <literal>instanceof</literal> emitiría un error
fatal <constant>E_ERROR</constant> ya que
<literal>__autoload()</literal> fallaría al ubicar la clase. Este mismo comportamiento
tenía lugar con el operador <literal>catch</literal> y con la función
<literal>is_subclass_of()</literal>, por la misma razón.
</para>
<para>
En PHP 5.1.x ninguna de estas funciones y operadores llama a
<literal>__autoload()</literal>, y los trucos tipo <literal>class_exists()</literal>
que se usaban con PHP 5.0.x, pese a que no provocan problemas, ya no
serán necesarios.
</para>
</section>
<section xml:id="migration51.oop-methods">
<title>Métodos privados abstractos</title>
<para>
Los métodos privados abstractos estaban permitidos entre PHP 5.0.0 y PHP 5.0.4,
pero se prohibió su uso ya que los comportamientos de
<literal>private</literal> y <literal>abstract</literal> son mutuamente
excluyentes.
</para>
</section>
<section xml:id="migration51.oop-modifiers">
<title>Modificadores de acceso en interfaces</title>
<para>
En PHP 5.0, las declaraciones de funciones en interfaces se trataban de la misma
manera que las declaraciones de funciones en clases. Desde octubre de 2004 esto
no es así, fecha a partir de la cual se permite el modificador de acceso <literal>public</literal>
en la declaración de funciones en interfaces. Desde abril de 2005
- fecha de la edición de PHP 5.0b1 - se permitió usar también el modificador
<literal>static</literal>. Pero los modificadores
<literal>protected</literal> y <literal>private</literal> ahora emiten
un error <constant>E_ERROR</constant>, tal y como pasa con
<literal>abstract</literal>. Debe tenerse en cuenta que este cambio no afectará al código
ya existente, ya que ninguno de estos modificadores tiene, en ningún caso, sentido
en un contexto de interfaces.
</para>
</section>
<section xml:id="migration51.oop-inheritance">
<title>Cambios en reglas de herencia</title>
<para>
En PHP 5.0 era posible redeclarar una función, en una clase derivada, que no coincidera
con la declaración de esa misma función de la clase base,
por ejemplo:
</para>
<informalexample>
<para>
Este código provocará un error <constant>E_STRICT</constant> en PHP 5.1.x.
</para>
<programlisting role="php">
<![CDATA[
<?php
class Base {
function &return_by_ref() {
$r = 1;
return $r;
}
}
class Derived extends Base {
function return_by_ref() {
return 1;
}
}
?>
]]>
</programlisting>
</informalexample>
</section>
<section xml:id="migration51.oop-constants">
<title>Constantes de clase</title>
<para>
En PHP 5.0.x, el siguiente código era inválido:
</para>
<informalexample>
<para>
En PHP 5.1.x, si se redefine una constante de clase se lanzará un error fatal
<constant>E_ERROR</constant>.
</para>
<programlisting role="php">
<![CDATA[
<?php
class test {
const foobar = 'foo';
const foobar = 'bar';
}
?>
]]>
</programlisting>
</informalexample>
</section>
</section>
<section xml:id="migration51.extensions">
<title>Extensiones</title>
<itemizedlist>
<listitem>
<para>
<link linkend="migration51.extensions-gone">Extensiones que se sacan del
núcleo de PHP</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="migration51.extensions-constants">Constantes de clase nuevas
en extensiones de PHP 5.1.x</link>
</para>
</listitem>
</itemizedlist>
<section xml:id="migration51.extensions-gone">
<title>Extensiones que se sacan del núcleo de PHP</title>
<para>
Una de las primeras cosas de las que uno se percata al descargar PHP 5.1.x es que
muchas de las anteriores extensiones han desaparecido. Estas extensiones,
que todavía tienen un mantenimiento activo, están disponibles en la
Biblioteca de la Comunidad de Extensiones PHP (PECL), en
<link xlink:href="&url.pecl;">&url.pecl;</link>.
</para>
<table>
<title>Extensiones eliminadas</title>
<tgroup cols="2">
<thead>
<row>
<entry>Extension</entry>
<entry>Alternativa/Estado</entry>
</row>
</thead>
<tbody>
<row>
<entry>ext/cpdf</entry>
<entry><link linkend="ref.pdf">pecl/pdflib</link></entry>
</row>
<row>
<entry><link linkend="ref.dbx">ext/dbx</link></entry>
<entry>pecl/dbx</entry>
</row>
<row>
<entry><link linkend="ref.dio">ext/dio</link></entry>
<entry>pecl/dio</entry>
</row>
<row>
<entry><link linkend="ref.fam">ext/fam</link></entry>
<entry>Sin mantenimiento activo</entry>
</row>
<row>
<entry><link linkend="ref.ingres">ext/ingres_ii</link></entry>
<entry>pecl/ingres</entry>
</row>
<row>
<entry>ext/ircg</entry>
<entry>Sin mantenimiento activo</entry>
</row>
<row>
<entry><link linkend="ref.mcve">ext/mcve</link></entry>
<entry>pecl/mcve</entry>
</row>
<row>
<entry><link linkend="ref.mnogosearch">ext/mnogosearch</link></entry>
<entry>Sin mantenimiento activo</entry>
</row>
<row>
<entry>ext/oracle</entry>
<entry>
<link linkend="ref.oci8">ext/oci8</link> or
<link linkend="ref.pdo-oci">ext/pdo_oci</link>
</entry>
</row>
<row>
<entry>ext/ovrimos</entry>
<entry>Sin mantenimiento activo</entry>
</row>
<row>
<entry>ext/pfpro</entry>
<entry>Sin mantenimiento activo</entry>
</row>
<row>
<entry>ext/w32api</entry>
<entry><link xlink:href="&url.pecl.package;ffi">pecl/ffi</link></entry>
</row>
<row>
<entry><link linkend="ref.nis">ext/yp</link></entry>
<entry>Sin mantenimiento activo</entry>
</row>
<row>
<entry>ext/activescript</entry>
<entry>
<link xlink:href="&url.pecl.package;activescript">pecl/activescript</link>
</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Los módulos de PECL que no están en mantenimiento activo (es decir, no han
recibido suporte durante un tiempo, no tienen un mantenedor activo trabajando en él
actualmente, y no tiene ninguna edición de paquete PECL), todavía están disponibles
por SVN en <link xlink:href="&url.php.svn;pecl">&url.php.svn;pecl</link>.
Sin embargo, los módulos de PHP no liberados están, dada su naturaleza, no soportados,
por lo que esto podrá afectar a la decisión de instalarlos o usarlos.
</para>
</section>
<section xml:id="migration51.extensions-constants">
<title>Constantes de clase nuevas en extensiones de PHP 5.1.x</title>
<para>
La API de Zend Engine 2.1 API permite a los desarrolladores de extensiones declarar constantes
de clases en las extensiones orientadas a objetos. Las nuevas extensiones escritas para PHP
5.1.x, incluyendo <link linkend="ref.spl">SPL</link>,
<link linkend="intro.pdo">PDO</link>,
<link linkend="book.xmlreader">XMLReader</link> y
<link linkend="ref.datetime">date</link>, tienen sus constantes en
formato <constant>PDO::CLASS_CONSTANT</constant> en lugar de en formato
C <constant>PDO_CLASS_CONSTANT</constant> para evitar contaminar
el espacio de nombres global de PHP.
</para>
</section>
</section>
<section xml:id="migration51.datetime">
<title>Soporte de fecha/hora</title>
<para>
Se ha rescrito completamente el soporte de fecha/hora en PHP 5.1.x, y ya no se utiliza
la configuración del sistema para 'conocer' la zona horaria en que se opera. En su lugar,
se averigua a partir de (en orden):
</para>
<itemizedlist>
<listitem>
<para>
Zona horaria definida usando la función <function>date_default_timezone_set</function>
(si se hubiera hecho)
</para>
</listitem>
<listitem>
<para>
La variable de entorno TZ (si no estuviera vacía)
</para>
</listitem>
<listitem>
<para>
Suposición "mágica" (si lo permite el sistema operativo)
</para>
</listitem>
<listitem>
<para>
Si ninguna de las opciones de arriba funciona, se usa UTC
</para>
</listitem>
</itemizedlist>
<informalexample>
<para>
Para asegurar la precisión (y evitar una alerta <constant>E_STRICT</constant>),
se debe definir la zona horaria en el fichero <filename>php.ini</filename>
usando el siguiente formato:
</para>
<para>
date.timezone = Europe/London
</para>
</informalexample>
<para>
Las zonas horarias soportadas se listan, en este formato, en el
<link linkend="timezones">apéndice de zonas horarias</link>.
</para>
<para>
Tenga en cuenta que ahora <function>strtotime</function> devuelve &false; en
caso de error, en lugar de -1.
</para>
</section>
<section xml:id="migration51.databases">
<title>Cambios en el soporte a base de datos</title>
<itemizedlist>
<listitem>
<para>
<link linkend="migration51.databases-pdo">Sobre PDO</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="migration51.databases-mysql">Cambios de soporte en MySQL</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="migration51.databases-sqlite">Cambios de soporte en SQLite</link>
</para>
</listitem>
</itemizedlist>
<section xml:id="migration51.databases-pdo">
<title>Sobre PDO</title>
<para>
Los <link linkend="intro.pdo">Objetos de Datos PHP (PDO)</link> se introdujeron como
extensión PECL en PHP 5.0, y comenzó a formar parte del núcleo de PHP
en PHP 5.1.x. La extensión PDO ofrece una interfaz consistente de acceso a bases de datos,
y funciona en conjunción con drivers PDO específicos a cada bases de datos. Cada driver
puede además tener funciones específicas de su propia base de datos, pero las funcionalidades
básicas de acceso, tal como hacer consultas o capturar dato, se realizan por las funciones
de PDO, usando el driver que se haya indicado al llamar a
<function>PDO::__construct</function>.
</para>
<para>
Tenga en cuenta que la extensión PDO y sus drivers están pensados para construirse como
extensiones compartidas. Esto permite facilitar el proceso de actualización
desde PECL, sin tener que reconstruir todo PHP.
</para>
<para>
Desde el punto de vista de la versión de PHP 5.1.x, PDO está completamente preparado
para probarlo y puede utilizarse en la mayoría de escenarios. Sin embargo, es importante
entender que tanto PDO como sus drivers no son una herramienta madura y pueden
carecer de funcionalidades específicas de un motor de bases de datos; se debe analizar
cuidadosamente PDO antes de usarse en nuevos proyectos.
</para>
<para>
Por norma general, el código fuente de versiones anteriores dependerá de las
extensiones de base de datos preexistentes, las cuales seguirán siendo mantenidas.
</para>
</section>
<section xml:id="migration51.databases-mysql">
<title>Cambios de soporte en MySQL</title>
<para>
En PHP 4, había soporte incorporado para MySQL 3. Con la llegada de PHP 5.0 había
dos extensiones de MySQL, 'mysql' y 'mysqli', diseñadas para funcionar
con MySQL &lt; 4.1 y MySQL 4.1 o superior, respectivamente. Con la llegada
de PDO, que proporciona una interfaz muy rápida a las APIs de las bases de datos
soportadas por PHP, el driver PDO_MYSQL puede funcionar con cualquiera de las
versiones (MySQL 3, 4 or 5) en códigos escritos para PDO,
dependiendo de la versión de la biblioteca MySQL usada al compilarlo. La extensión
de MySQL anterior continua disponible por retrocompatibilidad, pero no
viene habilitada por omisión.
</para>
</section>
<section xml:id="migration51.databases-sqlite">
<title>Cambios de soporte en SQLite</title>
<para>
En PHP 5.0.x, el soporte para SQLite 2 venía incorporado por omisión con la
extensión sqlite, también disponible como extensión PECL para PHP 4.3 y para
PHP 4.4. Con la llegada de PDO, la extensión sqlite
pasa a actuar como driver 'sqlite2' de PDO; es por esto que la extensión
sql de PHP 5.1.x depende de la extensión PDO.
</para>
<para>
PHP 5.1.x incorpora numerosas interfaces alternativas para sqlite:
</para>
<para>
La extensión sqlite ofrece la "clásica" API procedural/OO a sqlite que se
usaba en versiones anteriores de PHP. También contiene el driver PDO
'sqlite2', que permite acceder a bases de datos SQLite 2 usando la
API de PDO.
</para>
<para>
PDO_SQLITE ofrece la versión 3 del driver 'sqlite'. La versión 3 de
SQLite es muy superior a la 2, y el formato de ficheros de estas dos
versiones no son compatibles.
</para>
<para>
Si un proyecto basado en SQLite estuviera escrito y funcionando con una
versión de PHP anterior, se podrá seguir usando ext/sqlite sin ningún
problema, pero se deberá habilitar explícitamente tanto PDO como sqlite.
Los nuevos proyectos deben usar PDO y el driver (versión 3) de 'sqlite', ya que
es más rápido que SQLite 2, mejora la concurrencia, y soporta tanto
sentencias preparadas, como columnas binarias, de forma nativa.
</para>
<para>
Se puede habilitar PDO usando la extensión SQLite. Si se deseara construir la
extensión PDO como extensión compartida, se deberá construir SQLite también
compartido, tal y como sucede con cualquier extensión que contenga un driver
PDO.
</para>
</section>
</section> <!-- end of migration51.databases -->
<section xml:id="migration51.errorcheck">
<title>Comprobación de <constant>E_STRICT</constant></title>
<informalexample>
<para>
Si sólo se va a comprobar un único script, se pueden consultar los errores
<constant>E_STRICT</constant> usando la utilidad de línea de comandos
de PHP:
</para>
<programlisting role="shell">
php -d error_reporting=4095 -l script_to_check.php
</programlisting>
<para>
En proyectos de mayor tamaño, el siguiente script de consola realizará la misma tarea:
</para>
<programlisting role="shell">
<![CDATA[
#!/bin/sh
directory=$1
shift
# Se comprueban estas extensiones
extensions="php inc"
check_file ()
{
echo -ne "Doing PHP syntax check on $1 ..."
# Opciones:
ERRORS=`/www/php/bin/php -d display_errors=1 -d html_errors=0 -d error_prepend_string=" " -d error_append_string=" " -d error_reporting=4095 -l $1 | grep -v "No syntax errors detected"`
if test -z "$ERRORS"; then
echo -ne "OK."
else
echo -e "Errors found!\n$ERRORS"
fi
echo
}
# recorrer por el resto de parámetros de fichero
for FILE in "$@" ; do
for ext in $extensions; do
if echo $FILE | grep "\.$ext$" > /dev/null; then
if test -f $FILE; then
check_file "$FILE"
fi
fi
done
done
]]>
</programlisting>
</informalexample>
</section>
</appendix>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->