mirror of
https://github.com/php/doc-es.git
synced 2026-04-26 08:38:05 +02:00
ce2e8abb67
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@334597 c90b9560-bf6c-de11-be94-00142212c4b1
900 lines
28 KiB
XML
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 < 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
|
|
-->
|