<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://php.apsique.com" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>Php y otras yerbas - Variables, referencias, estructuras de control,  objetos y patrones de diseño - Comentarios</title>
 <link>http://php.apsique.com/contenido/curso_php_i</link>
 <description>Comentarios para &quot;Variables, referencias, estructuras de control,  objetos y patrones de diseño&quot;</description>
 <language>es</language>
<item>
 <title>Acerca de los</title>
 <link>http://php.apsique.com/contenido/curso_php_i#comment-79091</link>
 <description>&lt;p&gt;Acerca de los frameworks...&lt;br /&gt;
Hola, llevo un tiempo con PHP, te recomiendo un libro para completar este artículo, su título es CorePHP programming de Leon Atkinson ,editorial Prentice Hall. He leido muchos de sus capítulos y la verdad es que te aclaran un montón cosas que no imaginabas sobre este lenguaje. Algunas de ellas las he puesto en práctica en un framework que estoy desarrollando en &lt;a href=&quot;http://blog.zenphp.es&quot;&gt;el blog de zenphp&lt;/a&gt;, desde hace más tiempo he publicado algunos artículos de mis experiencias en granadaphp.agenciaq4.com, una comunidad de este lenguaje, espero que esta información llegue a quien le hace falta.&lt;br /&gt;
Saludos.&lt;/p&gt;
</description>
 <pubDate>Fri, 21 Mar 2008 18:24:56 -0700</pubDate>
 <dc:creator>zenphp</dc:creator>
 <guid isPermaLink="false">comment 79091 at http://php.apsique.com</guid>
</item>
<item>
 <title>Drupalizando: sigue el traspaso.</title>
 <link>http://php.apsique.com/contenido/curso_php_i#comment-767</link>
 <description>&lt;p&gt;El cambio de backend de un sitio no concluye con el paso de toda la información pertinente. Queda un aspecto muy importante que cuidar: los links.&lt;br /&gt;
Sí, señores. No hay nada peor para las visitas que ir a su querido feed de noticias y encontrars&lt;/p&gt;
</description>
 <pubDate>Sat, 12 Feb 2005 20:09:18 -0800</pubDate>
 <dc:creator>Php y otras yerbas, por Clbustos (trackback)</dc:creator>
 <guid isPermaLink="false">comment 767 at http://php.apsique.com</guid>
</item>
<item>
 <title>Variables, referencias, estructuras de control,  objetos y patrones de diseño</title>
 <link>http://php.apsique.com/contenido/curso_php_i</link>
 <description>&lt;P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo1&quot;&gt;Caracter&amp;iacute;sticas de PHP&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo2&quot;&gt;1.- Manejo de variables en PHP&lt;/A&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo3&quot;&gt;1.1.- BOOL&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo4&quot;&gt;1.2.- NULL&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo5&quot;&gt;1.3.- ARRAYS&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo6&quot;&gt;1.4.- Alcance (scope) de las variables&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo7&quot;&gt;1.5.- Variables superglobales&lt;/A&gt;&lt;/UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo8&quot;&gt;2.- Referencias.&lt;/A&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo9&quot;&gt;2.1.- Usos de las referencias&lt;/A&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo10&quot;&gt;2.1.1.- Funciones&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo11&quot;&gt;2.2.2.- Manejo de arrays complejos&lt;/A&gt;&lt;/UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo12&quot;&gt;2.3.- Consideraciones sobre las referencias&lt;/A&gt;&lt;/UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo13&quot;&gt;3.- Estructuras de control y funciones &lt;/A&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo14&quot;&gt;3.1.- Estructuras de control b&amp;aacute;sicas.&lt;/A&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo15&quot;&gt;IF&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo16&quot;&gt;WHILE&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo17&quot;&gt;DO ... WHILE&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo18&quot;&gt;FOR&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo19&quot;&gt;FOREACH&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo20&quot;&gt;SWITCH&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo21&quot;&gt;CONTINUE y BREAK.&lt;/A&gt;&lt;/UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo22&quot;&gt;3.2.- Funciones nativas y de usuario&lt;/A&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo23&quot;&gt;3.2.1.- Sintaxis de variables y alcance&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo24&quot;&gt;3.2.2.- Argumentos&lt;/A&gt;&lt;/UL&gt;
&lt;/UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo25&quot;&gt;4.- Objetos&lt;/A&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo26&quot;&gt;4.1.- Creaci&amp;oacute;n de objetos&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo27&quot;&gt;4.2.- Clase derivada&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo28&quot;&gt;4.3.- Llamada est&amp;aacute;tica a m&amp;eacute;todos&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo29&quot;&gt;4.4.- Serializaci&amp;oacute;n de objetos&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo30&quot;&gt;4.5.- Como simular funciones abstractas&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo31&quot;&gt;4.6.- Como simular interface&lt;/A&gt;&lt;/UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo32&quot;&gt;5.- Patrones de dise&amp;ntilde;o en PHP&lt;/A&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo33&quot;&gt;5.1.- Que son los patrones de dise&amp;ntilde;o&lt;/A&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo34&quot;&gt;5.2.- Patrones en PHP&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo35&quot;&gt;5.3.- Ejemplos de patrones&lt;/A&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo36&quot;&gt;5.3.1.- Factory&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo37&quot;&gt;5.3.2.- Singleton&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo38&quot;&gt;5.3.3.- Estrategia&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo39&quot;&gt;5.3.4.- Fa&amp;ccedil;ade&lt;/A&gt;
&lt;LI&gt;&lt;A HREF=&quot;#titulo40&quot;&gt;5.3.5.- Cadena de responsabilidad&lt;/A&gt;&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;!--Fin indice--&gt;
&lt;h2&gt;&lt;A NAME=&quot;titulo1&quot;&gt;&lt;/A&gt;Caracter&amp;iacute;sticas de PHP&lt;/h2&gt;
&lt;p&gt;PHP es un lenguaje interpretado, creado en el a&amp;ntilde;o 1995 por Rasmus Lerdorf. Su sintaxis y propiedades derivan principalmente de C, Java y Perl.
&lt;br&gt;
En su uso m&amp;aacute;s com&amp;uacute;n de lenguaje interpretado de servidor, PHP puede ser utilizado como m&amp;oacute;dulo en los servidores m&amp;aacute;s famosos (APACHE, IIS) o como CGI, tal como se funcionar&amp;iacute;a un script Perl.
&lt;br&gt;
PHP, en estos momentos, ha dejado de ser s&amp;oacute;lo una herramienta para la creaci&amp;oacute;n de p&amp;aacute;ginas web din&amp;aacute;micas, para convertirse en un lenguaje de programaci&amp;oacute;n de uso general. Se puede usar PHP como l&amp;iacute;nea de comandos, siendo una herramienta sencilla y poderosa y tambi&amp;eacute;n se pueden generar aplicaciones de escritorio, a trav&amp;eacute;s de PHP-GTK, aunque todav&amp;iacute;a falta un mayor desarrollo de esta forma de trabajo.
&lt;br&gt;
La versi&amp;oacute;n estable m&amp;aacute;s reciente es la 4.3.4, mientras que en desarrollo se encuentra la versi&amp;oacute;n 5,a&amp;uacute;n en estado de beta. 
&lt;br&gt;
La versi&amp;oacute;n actual estable de PHP, la 4, se caracteriza por su velocidad, independencia de procesos (thread-safe), extensibilidad (a trav&amp;eacute;s de m&amp;oacute;dulos escritos en C), soporte mejorado para programaci&amp;oacute;n dirigida a objetos y compatibilidad con PHP 3. 
&lt;br&gt;
Entre las fortalezas de PHP para el desarrollo de aplicaciones web se encuentran:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;Portabilidad&lt;/strong&gt;: PHP se encuentra disponible en todas las plataformas importantes y las alteraciones necesarias para portar el c&amp;oacute;digo de una plataforma a otra son m&amp;iacute;nimas, sino innecesarias&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Soporte para base de datos&lt;/strong&gt;: PHP cuenta con soporte nativo o basado en extensiones para las bases de datos m&amp;aacute;s usadas en la actualidad (MySQL, PostgretSQL, Oracle, MSSQL,etc) ,tanto como soporte ODBC, que le permite su conexi&amp;oacute;n a bases no consideradas. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Excelente documentaci&amp;oacute;n&lt;/strong&gt;: para conocer y manejar de manera adecuada un lenguaje es importante tener una buena documentaci&amp;oacute;n. PHP tiene uno de los mejores manuales existentes para un lenguaje, el cual se ve complementando por los comentarios de usuarios, que enriquecen con ejemplos pr&amp;aacute;cticos el uso de determinadas caracter&amp;iacute;sticas o funciones del lenguaje&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Flexibilidad en el desarrollo&lt;/strong&gt;: PHP, al igual que Perl, permite la definici&amp;oacute;n de variables en tiempo de ejecuci&amp;oacute;n, e incluso permite la generaci&amp;oacute;n de c&amp;oacute;digo en tiempo real. No se requiere una IDE espec&amp;iacute;fica para trabajar con scripts PHP, y el proceso de depuraci&amp;oacute;n se puede realizar directamente en la pantalla del browser, o trav&amp;eacute;s de diversas herramientas gratuitas. &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;A NAME=&quot;titulo2&quot;&gt;&lt;/A&gt;1.- Manejo de variables en PHP&lt;/h2&gt;
&lt;p&gt;PHP maneja diversos tipos de variables: booleanas, enteros, n&amp;uacute;meros de punto flotante, cadenas, arrays y objetos. Se incluyen tambi&amp;eacute;n las variables especiales recurso y NULL. El tipo de variable generalmente no es definido explicitamente por el programador, sino que PHP lo decide en tiempo de ejecuci&amp;oacute;n&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si se desea saber de que tipo es una variable, se puede utilizar &lt;code&gt;gettype()&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;Para determinar si una variable es de un determinado tipo, se debe utilizar el grupo de funciones is_XXX, en el cual XXX corresponde al tipo de funci&amp;oacute;n. Por ejemplo, &lt;code&gt;is_null&lt;/code&gt; - &lt;code&gt;is_bool&lt;/code&gt; - &lt;code&gt;is_int&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;Para cambiar el tipo de una variable, se utiliza el nombre del tipo encerrado entre par&amp;eacute;ntesis antes de la variable. Por ejemplo &lt;code&gt;(int)$variable&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo3&quot;&gt;&lt;/A&gt;1.1.- BOOL&lt;/h3&gt;
&lt;p&gt;Las variables booleanas son aquellas que pueden tomar el valor&lt;code&gt; true&lt;/code&gt; o &lt;code&gt;false&lt;/code&gt;.
&lt;br&gt;
Los siguientes valores son considerados false:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; El valor &lt;code&gt;false&lt;/code&gt;&lt;/li&gt;
&lt;li&gt; El entero 0 y el flotante 0.0&lt;/li&gt;
&lt;li&gt; La cadena &amp;quot;&amp;quot; o &amp;quot;0&amp;quot; &lt;/li&gt;
&lt;li&gt;Un array sin elementos&lt;/li&gt;
&lt;li&gt; Un objeto sin miembros&lt;/li&gt;
&lt;li&gt; El valor &lt;code&gt;NULL&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Resultan de inter&amp;eacute;s especial la conversi&amp;oacute;n de las cadenas y los arrays. 
&lt;br&gt;
Es muy com&amp;uacute;n la verificaci&amp;oacute;n de entradas significativas en la cadena, por ejemplo en la validaci&amp;oacute;n de cuestionarios o en consultas a base de datos. Para evitar inconvenientes, sugiero el uso de:&lt;/p&gt;
&lt;code&gt;if (strlen(trim($var)))&lt;/code&gt;
&lt;p&gt;Ya que permite discriminar aquellas cadenas que incluyen solo espacios en blanco (en sentido gen&amp;eacute;rico) y aquellas que pueden contener el valor &#039;0&#039;.
&lt;br&gt;
En el caso de los arrays, la verificaci&amp;oacute;n de una cadena vac&amp;iacute;a es especialmente relevante antes de un ciclo foreach, ya que permite la utilizaci&amp;oacute;n de la f&amp;oacute;rmula
&lt;br&gt;
&lt;div class=&#039;code&#039;&gt;&lt;div class=&quot;hl-main&quot;&gt;&lt;ol class=&quot;hl-main&quot;&gt;&lt;li&gt;&amp;nbsp;&lt;span class=&quot;hl-inlinetags&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;  &lt;/span&gt;&lt;span class=&quot;hl-reserved&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt; &lt;/span&gt;&lt;span class=&quot;hl-brackets&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;hl-var&quot;&gt;$var&lt;/span&gt;&lt;span class=&quot;hl-brackets&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt; &lt;/span&gt;&lt;span class=&quot;hl-brackets&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;      &lt;/span&gt;&lt;span class=&quot;hl-reserved&quot;&gt;foreach&lt;/span&gt;&lt;span class=&quot;hl-brackets&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;hl-var&quot;&gt;$var&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt; &lt;/span&gt;&lt;span class=&quot;hl-reserved&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt; &lt;/span&gt;&lt;span class=&quot;hl-var&quot;&gt;$item&lt;/span&gt;&lt;span class=&quot;hl-brackets&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt; &lt;/span&gt;&lt;span class=&quot;hl-brackets&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;        &lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt; codigo&lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt;&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;      &lt;/span&gt;&lt;span class=&quot;hl-brackets&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;   &lt;/span&gt;&lt;span class=&quot;hl-brackets&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;hl-inlinetags&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;la cual impide la generaci&amp;oacute;n de un error si $var resulta ser de otro tipo.&lt;/p&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo4&quot;&gt;&lt;/A&gt;1.2.- NULL&lt;/h3&gt;
&lt;p&gt;Si se requiere el valor de una variable no definida anteriormente, su tipo es NULL, y su valor es NULL (con may&amp;uacute;sculas). 
&lt;br&gt;
En el caso de los formularios, una cadena vac&amp;iacute;a y 0 se convierten en false, por lo que la mejor manera de detectar si una variable no existe en el formulario (por ejemplo, si lo generamos autom&amp;aacute;ticamente), es a trav&amp;eacute;s de is_null.&lt;/p&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo5&quot;&gt;&lt;/A&gt;1.3.- ARRAYS&lt;/h3&gt;
&lt;p&gt;La generaci&amp;oacute;n de un array se puede realizar a trav&amp;eacute;s del constructo de lenguaje array(), o de forma directa. Para cada valor del array existe una clave que lo identifica, que puede ser un &amp;iacute;ndice (a la C), o una cadena (m&amp;eacute;todo asociativo).
&lt;br&gt;
Los elementos del array pueden ser agregados con clave o sin ella.
&lt;br&gt;
Tenemos entonces:&lt;/p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
$a=array(); // Por instrucci&amp;oacute;n
$b[1]=&amp;quot;hola&amp;quot;; // de forma directa, con &amp;iacute;ndice num&amp;eacute;rico&lt;br&gt;$b[&amp;quot;hola&amp;quot;]=1; // de forma asociativa.&lt;br&gt;$b[]=&amp;quot;chao&amp;quot;; // sin clave expl&amp;iacute;cita. Toma valor &lt;/pre&gt;
&lt;p&gt;Si una variable ha sido definida y se utiliza como array, el valor antiguo ser&amp;aacute; eliminado, EXCEPTO SI ES UN STRING.
&lt;br&gt;
El uso de los par&amp;eacute;ntesis en un string, de forma similar a C, nos permite acceder a un caracter espec&amp;iacute;fico. Entonces, lo siguiente&lt;/p&gt;
&lt;p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
$b=&amp;quot;string&amp;quot;;&lt;br&gt;$b[&amp;quot;hola&amp;quot;]=&amp;quot;chao&amp;quot;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;No producir&amp;aacute; una transformaci&amp;oacute;n de $b a array, sino que har&amp;aacute; que $b sea &amp;quot;ctring&amp;quot;. &amp;iquest;Por que? Primero, &amp;quot;hola&amp;quot; hace cast a integer, transform&amp;aacute;ndose en 0, haciendo que la expresi&amp;oacute;n se transforme en &lt;code&gt;$b[0]=&amp;quot;chao&amp;quot;&lt;/code&gt;;
&lt;br&gt;
Con los resultados previsibles.&lt;/p&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo6&quot;&gt;&lt;/A&gt;1.4.- Alcance (scope) de las variables&lt;/h3&gt;
&lt;p&gt;Las variables en php pueden ser de tres tipos: &lt;strong&gt;globales&lt;/strong&gt;, &lt;strong&gt;locales a la funci&amp;oacute;n &lt;/strong&gt;y &lt;strong&gt;locales a una instancia de objeto&lt;/strong&gt;.
&lt;br&gt;
Cualquier variable que se defina fuera de una funci&amp;oacute;n o clase, es una variable global. 
&lt;br&gt;
Toda variable que se defina dentro de una funci&amp;oacute;n, es local a ella y no afecta a otra variable global del mismo nombre. Lo mismo ocurre con las variables de clase.
&lt;br&gt;
Ahora bien, para hacer referencia a una variable global dentro de una funci&amp;oacute;n, es necesario usar, al inicio de &amp;eacute;sta la sentencia &#039;global&#039;, seguida por las variables globales entre comas.&lt;/p&gt;
&lt;p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
global $variable_global_1, $variable_global_2&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n se puede hacer referencia a una variable global , utilizando el array superglobal $GLOBALS.&lt;/p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
$GLOBALS[&amp;quot;variable_global_1&amp;quot;];&lt;/pre&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo7&quot;&gt;&lt;/A&gt;1.5.- Variables superglobales&lt;/h3&gt;
&lt;p&gt;Desde PHP 4.1, existe un conjunto de variables denominadas Superglobales, arrays que contienen informaci&amp;oacute;n relevante sobre el servidor, el ambiente de ejecuci&amp;oacute;n y el ingreso de los usuarios. La gran ventaja de estas variables que son registradas autom&amp;aacute;ticamente en todas las funciones, por lo est&amp;aacute;n disponibles en cualquier alcance. Esto es muy &amp;uacute;til, ya que como desde PHP 4.2 la variable de inicializaci&amp;oacute;n register_global se encuentra en off, ya no se registran de modo autom&amp;aacute;tico como variables globales las variables de formularios, cookies ni variables de sesi&amp;oacute;n.
&lt;br&gt;
Por ejemplo, para utilizar el array POST antes de PHP 4, hab&amp;iacute;a que utilizar&lt;/p&gt;
&lt;p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
global $HTTP_POST_VARS;&lt;br&gt;if ($HTTP_POST_VARS[&amp;quot;mi_ingreso&amp;quot;]==1) { ... &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Ahora, basta s&amp;oacute;lo con&lt;/p&gt;
&lt;p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
if ($_POST[&amp;quot;mi_ingreso&amp;quot;]==1) { ... &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Las variables superglobales son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$GLOBALS : Contiene una referencia a cada variable que se encuentra en el espacio global. &lt;/li&gt;
&lt;li&gt;$_SERVER: Variables del servidor y relacionadas.&lt;/li&gt;
&lt;li&gt; $_POST: Contiene todos los campos de formularios enviados por el m&amp;eacute;todo POST.&lt;/li&gt;
&lt;li&gt; $_GET: Contiene todos los campos de formularios enviados por el m&amp;eacute;todo GET.&lt;/li&gt;
&lt;li&gt; $_COOKIE: Variables proveidas por los cookies de las p&amp;aacute;ginas.&lt;/li&gt;
&lt;li&gt; $_FILES: Variables proveidas por upload de archivos v&amp;iacute;a POST.&lt;/li&gt;
&lt;li&gt; $_ENV: Variables del entorno de ejecuci&amp;oacute;n.&lt;/li&gt;
&lt;li&gt; $_REQUEST: Total de variables proveidas por los m&amp;eacute;todos POST, GET, COOKIE y HEAD.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;A NAME=&quot;titulo8&quot;&gt;&lt;/A&gt;2.- Referencias.&lt;/h2&gt;
&lt;p&gt;Las referencias constituyen una poderosa herramienta de PHP, muchas veces incomprendidas. 
&lt;br&gt;
Las referencias permiten acceder desde distintos nombres a un mismo valor. No son punteros, sino alias dentro de la tabla de s&amp;iacute;mbolos. 
&lt;br&gt;
Por ejemplo:&lt;/p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
&lt;br&gt;$a=5;&lt;br&gt;$b=&amp;amp;$a;&lt;br&gt;$b=10;&lt;br&gt;echo $a; // 1&lt;/pre&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo9&quot;&gt;&lt;/A&gt;2.1.- Usos de las referencias&lt;/h3&gt;
&lt;h4&gt;&lt;A NAME=&quot;titulo10&quot;&gt;&lt;/A&gt;2.1.1.- Funciones&lt;/h4&gt;
&lt;p&gt;El uso m&amp;aacute;s obvio de las referencias es el paso de valores por referencia, no por valor. Por ejemplo&lt;/p&gt;
&lt;p&gt;
&lt;div class=&#039;code&#039;&gt;&lt;div class=&quot;hl-main&quot;&gt;&lt;ol class=&quot;hl-main&quot;&gt;&lt;li&gt;&amp;nbsp;&lt;span class=&quot;hl-inlinetags&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;  &lt;/span&gt;&lt;span class=&quot;hl-var&quot;&gt;$a&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;  &lt;/span&gt;&lt;span class=&quot;hl-reserved&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt; &lt;/span&gt;&lt;span class=&quot;hl-identifier&quot;&gt;sumar_1&lt;/span&gt;&lt;span class=&quot;hl-brackets&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;hl-identifier&quot;&gt;amp&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;hl-var&quot;&gt;$a&lt;/span&gt;&lt;span class=&quot;hl-brackets&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt; &lt;/span&gt;&lt;span class=&quot;hl-brackets&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;    &lt;/span&gt;&lt;span class=&quot;hl-var&quot;&gt;$a&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;++;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;  &lt;/span&gt;&lt;span class=&quot;hl-brackets&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;  &lt;/span&gt;&lt;span class=&quot;hl-identifier&quot;&gt;sumar_1&lt;/span&gt;&lt;span class=&quot;hl-brackets&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;hl-var&quot;&gt;$a&lt;/span&gt;&lt;span class=&quot;hl-brackets&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;; &lt;/li&gt;
&lt;li&gt;&amp;nbsp;  &lt;/span&gt;&lt;span class=&quot;hl-reserved&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt; &lt;/span&gt;&lt;span class=&quot;hl-var&quot;&gt;$a&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt; 6&lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt;&lt;/span&gt;&lt;span class=&quot;hl-code&quot;&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;hl-inlinetags&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Otro uso no tan obvio es el retorno de referencia. Esto es especialmente &amp;uacute;til para devolver un valor determinado de un array o un objeto. &lt;/p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
function &amp;amp;encontrar_valor(&amp;amp;$a,$i) {
return $a[$i];&lt;br&gt;
}
$a=array(1=&amp;gt;&amp;quot;bueno&amp;quot;,2=&amp;gt;&amp;quot;malo&amp;quot;,3=&amp;gt;&amp;quot;No tengo 
idea&amp;quot;);&lt;br&gt;
$b=&amp;amp;encontrar_valor($a,1);
$b=&amp;quot;muy bueno&amp;quot;;
echo $a[1]; // muy bueno&lt;/pre&gt;
&lt;h4&gt;&lt;A NAME=&quot;titulo11&quot;&gt;&lt;/A&gt;2.2.2.- Manejo de arrays complejos&lt;/h4&gt;
&lt;p&gt;Un caso t&amp;iacute;pico que todos hemos tenido que enfrentar es el de manejar variables como&lt;/p&gt;
&lt;p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
$a[1][&amp;quot;objeto&amp;quot;]-&amp;gt;var[&amp;quot;array_1&amp;quot;][1]=50;&lt;br&gt;$a[1][&amp;quot;objeto&amp;quot;]-&amp;gt;var[&amp;quot;array_1&amp;quot;][2]=60&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Esto se puede solucinar con el uso de referencias, similar a lo que hace con &#039;with&#039; en JS o VB&lt;/p&gt;
&lt;p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
$rRef=&amp;amp;$a[1][&amp;quot;objeto&amp;quot;]-&amp;gt;var[&amp;quot;array_1];&lt;br&gt;$rRef[1]=50;&lt;br&gt;$rRef[2]=60&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo12&quot;&gt;&lt;/A&gt;2.3.- Consideraciones sobre las referencias&lt;/h3&gt;
&lt;p&gt;Las referencias no son transitivas. Por ejemplo&lt;/p&gt;
&lt;p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
$a=5;&lt;br&gt;$c=10;&lt;br&gt;$b=&amp;amp;$a;&lt;br&gt;$b=&amp;amp;$c;&lt;br&gt;$b=20; // $a=5, $b=$c=20&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Si se hace unset sobre una referencia, el valor no se destruye para el resto de las variables. Se debe pensar en el unlink de unix.&lt;/p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
$a=5;&lt;br&gt;$b=&amp;amp;$a;&lt;br&gt;unset($a); // $b sigue siendo &lt;/pre&gt;
&lt;h2&gt;&lt;A NAME=&quot;titulo13&quot;&gt;&lt;/A&gt;3.- Estructuras de control y funciones &lt;/h2&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo14&quot;&gt;&lt;/A&gt;3.1.- Estructuras de control b&amp;aacute;sicas.&lt;/h3&gt;
&lt;h4&gt;&lt;A NAME=&quot;titulo15&quot;&gt;&lt;/A&gt;IF&lt;/h4&gt;
&lt;p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
if (&amp;lt;cond&amp;gt;) {&amp;lt;inst&amp;gt;}&lt;br&gt;elseif (&amp;lt;cond&amp;gt;) {&amp;lt;inst&amp;gt;}&lt;br&gt;else {&amp;lt;inst&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Alternativa:&lt;/p&gt;
&lt;p&gt; 
&lt;pre class=&quot;codigo&quot;&gt;
if (&amp;lt;cond&amp;gt;) :&lt;br&gt;&amp;lt;inst&amp;gt;&lt;br&gt;elseif (&amp;lt;cond&amp;gt;) :&lt;br&gt;&amp;lt;inst&amp;gt;&lt;br&gt;else : &amp;lt;inst&amp;gt;&lt;br&gt;endif&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h4&gt;&lt;A NAME=&quot;titulo16&quot;&gt;&lt;/A&gt;WHILE&lt;/h4&gt;
&lt;p&gt; 
&lt;pre class=&quot;codigo&quot;&gt;
while (&amp;lt;cond&amp;gt;) {&lt;br&gt;&amp;lt;inst&amp;gt;&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h4&gt;&lt;A NAME=&quot;titulo17&quot;&gt;&lt;/A&gt;DO ... WHILE&lt;/h4&gt;
&lt;p&gt; 
&lt;pre class=&quot;codigo&quot;&gt;
do {&lt;br&gt;&amp;lt;inst&amp;gt;&lt;br&gt;} while (&amp;lt;cond&amp;gt;)&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h4&gt;&lt;A NAME=&quot;titulo18&quot;&gt;&lt;/A&gt;FOR&lt;/h4&gt;
&lt;p&gt; 
&lt;pre class=&quot;codigo&quot;&gt;
for (&amp;lt;init&amp;gt;; &amp;lt;cond&amp;gt;; &amp;lt;post-cond&amp;gt;) { &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h4&gt;&lt;A NAME=&quot;titulo19&quot;&gt;&lt;/A&gt;FOREACH&lt;/h4&gt;
&lt;pre class=&quot;codigo&quot;&gt;
// para valores: &lt;br&gt;
foreach ($aArray as $sValor) {&lt;br&gt;&amp;lt;inst&amp;gt;
}&lt;br&gt;
// para claves y valores:&lt;br&gt;
foreach ($aArray as $sClave=&amp;gt;$sValor) {
&amp;lt;inst&amp;gt;
&lt;/pre&gt;
&lt;h4&gt;&lt;A NAME=&quot;titulo20&quot;&gt;&lt;/A&gt;SWITCH&lt;/h4&gt;
&lt;p&gt; 
&lt;pre class=&quot;codigo&quot;&gt;
switch ($valor) {&lt;br&gt;
  case &#039;&amp;lt;valor&amp;gt;&#039;:&lt;br&gt;
  break;&lt;br&gt;
  case &#039;&amp;lt;valor&amp;gt;&#039;:&lt;br&gt;
  case &#039;&amp;lt;valor&amp;gt;&#039;:&lt;br&gt;
  break;&lt;br&gt;
  default:&lt;br&gt;
  break;&lt;br&gt;
 &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h4&gt;&lt;A NAME=&quot;titulo21&quot;&gt;&lt;/A&gt;CONTINUE y BREAK.&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;continue&lt;/strong&gt;: omite la ejecuci&amp;oacute;n del resto de las instrucciones del bucle y sigue con la siguiente iteraci&amp;oacute;n
&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;break&lt;/strong&gt;: rompe la ejecuci&amp;oacute;n del bucle. Se puede indicar opcionalmente un n&amp;uacute;mero para indicar cuantos niveles debe saltar&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;codigo&quot;&gt;
$sMiValor=&amp;quot;Juan P&amp;eacute;rez&amp;quot;;
$bLoEncontre=false;&lt;br&gt;foreach ($aEmpresas as $aEmpresa) {&lt;br&gt;	if ($aEmpresa[&amp;quot;privada&amp;quot;]) { continue;}&lt;br&gt;		foreach($aEmpresa as $sEmpleado) {&lt;br&gt;			if ($sEmpleado==$sMiValor) {&lt;br&gt;			$bLoEncontre=true;
			break 2;
		}&lt;br&gt;	}&lt;br&gt;}
if ($bLoEncontre) {&lt;br&gt;	echo &amp;quot;lo encontre&amp;quot;;&lt;br&gt;} else {&lt;br&gt; 	echo &amp;quot;no lo encontr&amp;eacute;&amp;quot;; &lt;br&gt;}
 &lt;/pre&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo22&quot;&gt;&lt;/A&gt;3.2.- Funciones nativas y de usuario&lt;/h3&gt;
&lt;h4&gt;&lt;A NAME=&quot;titulo23&quot;&gt;&lt;/A&gt;3.2.1.- Sintaxis de variables y alcance&lt;/h4&gt;
&lt;p&gt;Las funciones en php siguen la siguiente sintaxis&lt;/p&gt;
&lt;p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
function nombre_funcion (&amp;lt;args&amp;gt;) {
	&amp;lt;inst&amp;gt;
 	return $valor;
 &lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;Toda funci&amp;oacute;n es accesible, antes o despu&amp;eacute;s de su definici&amp;oacute;n expl&amp;iacute;cita, excepto:
&lt;br&gt;
-&lt;strong&gt; cuando se define condicionalmente&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
if ($valor) {
	 function existe() {}&lt;br&gt;}&lt;br&gt;
&lt;/pre&gt;
- &lt;strong&gt;cuando se encuentra dentro de otra funci&amp;oacute;n &lt;/strong&gt; 
&lt;pre class=&quot;codigo&quot;&gt;
function padre() {
  function hijo() {
  }
}
  // aqui no puedo llamar a hijo&lt;br&gt;
  padre();&lt;br&gt;
  // ahora si puedo llamar a hijo&lt;br&gt;
  hijo();
 &lt;/pre&gt;
&lt;h4&gt;&lt;A NAME=&quot;titulo24&quot;&gt;&lt;/A&gt;3.2.2.- Argumentos&lt;/h4&gt;
&lt;p&gt;* Para pasar un argumento por referencia, se utiliza&lt;/p&gt;
&lt;p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
function sumar_1(&amp;amp;$a) {
 if (is_numeric($a)) {&lt;br&gt;	$a++;
  }&lt;br&gt;}&lt;br&gt;
sumar_1($a)&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;* Se pueden utilizar valores por defecto para los argumentos&lt;/p&gt;
&lt;p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
function correcta($a,$b=false) {}&lt;br&gt;
function erronea($a=false,$b) {}&lt;br&gt;
function erronea_2($a,&amp;amp;$b=false) {&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;* Se puede entregar una lista de argumentos variables, utilizando las funciones func_num_args(), func_get_arg() y func_get_args() &lt;/p&gt;
&lt;p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
function funcion_con_argumentos_variables() {&lt;br&gt;	if (func_num_args()&amp;lt;2) {&lt;br&gt;		return &amp;quot;Error&amp;quot;;&lt;br&gt;	} else {&lt;br&gt;		$aArgs=func_get_args();&lt;br&gt;		foreach($aArgs as $sClave=&amp;gt;$sValor) {&lt;br&gt;			&amp;lt;...&amp;gt;&lt;br&gt;		}&lt;br&gt;	}&lt;br&gt;&lt;/pre&gt;
&lt;/p&gt;
&lt;h2&gt;&lt;A NAME=&quot;titulo25&quot;&gt;&lt;/A&gt;
&lt;br&gt;
4.- Objetos&lt;/h2&gt;
&lt;p&gt;PHP, a pesar de ser un lenguaje de programaci&amp;oacute;n predominante estructurado, permite la utilizaci&amp;oacute;n de objetos, los cuales presentan las siguientes caracter&amp;iacute;sticas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; Creaci&amp;oacute;n de objetos a trav&amp;eacute;s de esquema clase - instancia&lt;/li&gt;
&lt;li&gt;Poliformismo a trav&amp;eacute;s de sobrecarga de funciones. No se pueden sobrecargar operadores.&lt;/li&gt;
&lt;li&gt; Herencia simple, no m&amp;uacute;ltiple.&lt;/li&gt;
&lt;li&gt; Todos los m&amp;eacute;todos y propiedades son p&amp;uacute;blicos. Por convenci&amp;oacute;n, se utiliza _ antes del nombre de un m&amp;eacute;todo o variable para indicar que es privado.&lt;/li&gt;
&lt;li&gt; No existen formas intr&amp;iacute;nsecas del lenguaje para indicar que una clase o m&amp;eacute;todo es abstracto, o para requerir una implementaci&amp;oacute;n espec&amp;iacute;fica&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo26&quot;&gt;&lt;/A&gt;4.1.- Creaci&amp;oacute;n de objetos&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Los objetos se crean a trav&amp;eacute;s de la i&lt;code&gt;nstr&lt;/code&gt;ucci&amp;oacute;n class.&lt;/li&gt;
&lt;li&gt;Las propiedades se definen con &lt;code&gt;var&lt;/code&gt; (s&amp;oacute;lo se pueden inicializar con valores est&amp;aacute;ticos)&lt;/li&gt;
&lt;li&gt;Los m&amp;eacute;todos se definen con &lt;code&gt;function&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Se puede hacer referencia al mismo objeto a trav&amp;eacute;s de la variable &lt;code&gt;$this&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Al crear un objeto, se inicializa la funci&amp;oacute;n con el mismo nombre de la clase (constructor)&lt;/p&gt;
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;codigo&quot;&gt;
class pagina {
	var $nombre;&lt;br&gt;	var $doctype;&lt;br&gt;	function pagina($nombre) {&lt;br&gt;		$this-&amp;gt;nombre=$nombre;&lt;br&gt;	}&lt;br&gt;	function cambiarDoctype($doctype) {&lt;br&gt;		$this-&amp;gt;nombre=$doctype;&lt;br&gt;	}&lt;br&gt;}
$miPagina=new pagina(&amp;quot;fea&amp;quot;);
$miPagina-&amp;gt;cambiarDoctype(&amp;quot;strict&amp;quot;);
 &lt;/pre&gt;
&lt;p&gt;Es importante considerar que el objeto devuelto por new es una copia, no una referencia. Por lo tanto, si se asignan una referencia del objeto a una variable global, se deber&amp;aacute; usar lo siguiente:&lt;/p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
$ref=array();
class a {
	var $objeto;&lt;br&gt;	var $nombre=&amp;quot;hola&amp;quot;;&lt;br&gt;	function a() {&lt;br&gt;		global $ref;&lt;br&gt;		$ref[]=&amp;amp;$this;&lt;br&gt;	}&lt;br&gt;}
$aa=&amp;amp;new a();&lt;br&gt;$bb= new a();&lt;br&gt;$aa-&amp;gt;nombre=&amp;quot;chao&amp;quot;;&lt;br&gt;$bb-&amp;gt;nombre=&amp;quot;chao&amp;quot;;&lt;br&gt;print_r($ref); // mostrara chao y hola, respectivament&lt;/pre&gt;
&lt;p&gt;Si se requiere verificar que los patrones de inicializaci&amp;oacute;n del objeto sean correctos, es mejor utilizar un patr&amp;oacute;n Factory, que devuelva el objeto por referencia si se valida, false o un objeto de error si no.&lt;/p&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo27&quot;&gt;&lt;/A&gt;4.2.- Clase derivada&lt;/h3&gt;
&lt;p&gt;Para crear una clase derivada se ocupa extends. 
&lt;br&gt;
Para sobrecargar una funci&amp;oacute;n, basta con crear una nueva con el mismo nombre. Si se desea acceder a la funci&amp;oacute;n de la clase padre, se puede utilizar parent::funcion()
&lt;br&gt;
El constructor de la clase padre es llamado si no se define uno nuevo. Si se define constructor, no se llama al constructor de la clase padre. Para suplir esto, se puede hacer lo siguiente:&lt;/p&gt;
&lt;p&gt; 
&lt;pre class=&quot;codigo&quot;&gt;
class padre&lt;br&gt;{&lt;br&gt;    function padre() {&lt;br&gt;        ...codigo...&lt;br&gt;        $this-&amp;gt;init();&lt;br&gt;    }&lt;br&gt;    function init() {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;class hijo&lt;br&gt;{&lt;br&gt;    function init() {&lt;br&gt;        ...codigo...&lt;br&gt;    }&lt;br&gt;}
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n se puede llamar a &lt;code&gt;parent::&amp;lt;nombre_clase_padre&amp;gt;&lt;/code&gt; desde el contructor de la clase hijo&lt;/p&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo28&quot;&gt;&lt;/A&gt;
&lt;br&gt;
4.3.- Llamada est&amp;aacute;tica a m&amp;eacute;todos&lt;/h3&gt;
&lt;p&gt;Una &amp;uacute;til caracter&amp;iacute;stica de PHP es la capacidad de llamar de forma est&amp;aacute;tica a las funciones de una clase. Esto quiere decir que no es necesario intanciarla para ocupar sus funcionalidades. Se utiliza la sintaxis clase::funcion. Es &amp;uacute;til para llamar a funciones que devuelven objetos(Factory) y crear namespaces, a la C++&lt;/p&gt;
&lt;p&gt; 
&lt;pre class=&quot;codigo&quot;&gt;
class mensaje&lt;br&gt;{&lt;br&gt;    function escribir($sTexto) {&lt;br&gt;        echo $sTexto;&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;mensaje::escribir(&amp;quot;hola&amp;quot;)&lt;/pre&gt;
&lt;/p&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo29&quot;&gt;&lt;/A&gt;
&lt;br&gt;
4.4.- Serializaci&amp;oacute;n de objetos&lt;/h3&gt;
&lt;p&gt;Si se desea grabar en un archivo o en la base de datos el contenido de una instancia, esta se puede serializar.&lt;/p&gt;
&lt;p&gt; 
&lt;pre class=&quot;codigo&quot;&gt;
$sSerial = serialize($miPagina);&lt;br&gt;$query = &amp;quot;INSERT INTO mis_paginas SET id=1,pagina=&#039;$miPagina&#039;&amp;quot;&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;Para recuperar una clase serializada, es necesario que ya est&amp;eacute; definida (se serializan solamente los valores, no los m&amp;eacute;todos).&lt;/p&gt;
&lt;p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
$oSerial=unserialize($miPagina)&lt;/pre&gt;
&lt;/p&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo30&quot;&gt;&lt;/A&gt;4.5.- Como simular funciones abstractas&lt;/h3&gt;
&lt;p&gt;La forma m&amp;aacute;s sencilla de simular funciones abstractas es generando un error si son accesadas desde la clase padre&lt;/p&gt;
&lt;p&gt; 
&lt;pre class=&quot;codigo&quot;&gt;
class abstracto&lt;br&gt;{&lt;br&gt;    function funcion_abstracta&lt;br&gt;    {&lt;br&gt;        trigger_error(&amp;quot;abstracto::funcion_abstracta : se debe sobrecargar esta&lt;br&gt;            funci&amp;oacute;n&amp;quot;, E_USER_ERROR);&lt;br&gt;    }&lt;br&gt;}
&lt;/pre&gt;
&lt;/p&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo31&quot;&gt;&lt;/A&gt;4.6.- Como simular interface&lt;/h3&gt;
&lt;p&gt;Se puede crear un objeto interface, que verifique que otra clase contenga los m&amp;eacute;todos y propiedades requeridos.&lt;/p&gt;
&lt;p&gt; 
&lt;pre class=&quot;codigo&quot;&gt;
include(&amp;quot;PEAR.php&amp;quot;);&lt;br&gt;class Interface&lt;br&gt;{&lt;br&gt;    var $aMetodos = array();&lt;br&gt;    var $aPropiedades = array();&lt;br&gt;    var $sModoError = &amp;quot;PEAR_Error&amp;quot;;&lt;br&gt;    var $aErrores = array();&lt;br&gt;    function Interface($aMetodos, $aPropiedades) {&lt;br&gt;        $this-&amp;gt;aMetodos = $aMetodos;&lt;br&gt;        $this-&amp;gt;aPropiedades = $aPropiedades;&lt;br&gt;    }&lt;br&gt;    function verificarClase($sClase) {&lt;br&gt;        $aClassVars = array_keys(get_class_vars($sClase));&lt;br&gt;        $aClassMethods = get_class_methods($sClase);&lt;br&gt;        foreach($this-&amp;gt;aMetodos as $sMetodo) {&lt;br&gt;            if (!in_array($sMetodo, $aClassMethods)) {&lt;br&gt;                $this-&amp;gt;agregarError(&amp;quot;No existe el m&amp;eacute;todo &#039;$sMetodo&#039; para la clase&lt;br&gt;                    &#039;$sClase&#039;&amp;quot;);&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;        foreach($this-&amp;gt;aPropiedades as $sPropiedad) {&lt;br&gt;            if (!in_array($sPropiedad, $aClassVars)) {&lt;br&gt;                $this-&amp;gt;agregarError(&amp;quot;No existe la propiedad &#039;$sPropiedad&#039; para la clase&lt;br&gt;                    &#039;$sClase&#039;&amp;quot;);&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;        if ($this-&amp;gt;aErrores) {&lt;br&gt;            if ($this-&amp;gt;sModoError == &amp;quot;PEAR_Error&amp;quot;) {&lt;br&gt;                return PEAR::raiseError(implode(&amp;quot;\n&amp;quot;, $this-&amp;gt;aErrores));&lt;br&gt;            } elseif ($this-&amp;gt;sModoError == &amp;quot;PHP_Error&amp;quot;) {&lt;br&gt;                trigger_error(implode(&amp;quot;\n&amp;quot;, $this-&amp;gt;aErrores), E_USER_ERROR);&lt;br&gt;            }&lt;br&gt;        } else {&lt;br&gt;            return true;&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;    function agregarError($sTexto) {&lt;br&gt;        $this-&amp;gt;aErrores[] = $sTexto;&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;$aMetodos = array(&amp;quot;get&amp;quot;, &amp;quot;set&amp;quot;);&lt;br&gt;$aPropiedades = array(&amp;quot;nombre&amp;quot;);&lt;br&gt;$oInterface = new Interface($aMetodos, $aPropiedades);&lt;br&gt;$mRes = $oInterface-&amp;gt;verificarClase(&amp;quot;Interface&amp;quot;);&lt;br&gt;print_r($mRes-&amp;gt;getMessage());&lt;/pre&gt;
&lt;/p&gt;
&lt;h2&gt;&lt;A NAME=&quot;titulo32&quot;&gt;&lt;/A&gt;5.- Patrones de dise&amp;ntilde;o en PHP&lt;/h2&gt;
&lt;h3&gt;&lt;A NAME=&quot;titulo33&quot;&gt;&lt;/A&gt;5.1.- Que son los patrones de dise&amp;ntilde;o&lt;/h3&gt;
&lt;p&gt;Los patrones son formas de describir buenos dise&amp;ntilde;os y pr&amp;aacute;cticas, que permiten describir una experiencia de programaci&amp;oacute;n de tal manera que otros la puedan reutilizaar.
&lt;br&gt;
El prop&amp;oacute;sito de los patrones es crear un cuerpo de conocimientos que ayuden a los dise&amp;ntilde;adores de software a resolver problemas recurrentes. Los patrones ayudan a crear un lenguaje com&amp;uacute;n para comunicar descubrimientos y experiencias acerca de los problemas y sus soluciones. &lt;/p&gt;
&lt;h4&gt;&lt;A NAME=&quot;titulo34&quot;&gt;&lt;/A&gt;5.2.- Patrones en PHP&lt;/h4&gt;
&lt;p&gt;Si bien el desarrollo de peque&amp;ntilde;as aplicaciones en PHP hace en muchas ocasiones innecesario el uso de patrones, por lo evidente de las soluciones, al adentrarnos en problemas de mediana y gran envergadura nos encontramos muchas veces con problemas en apariencia dif&amp;iacute;ciles, que nos obligan a modificar el c&amp;oacute;digo en reiteradas ocasiones. Un adecuado conocimiento de algunos patrones nos permiten dise&amp;ntilde;ar de manera m&amp;aacute;s apropiada nuestras aplicaciones, previniendo problemas a posteriori.&lt;/p&gt;
&lt;h4&gt;&lt;A NAME=&quot;titulo35&quot;&gt;&lt;/A&gt;5.3.- Ejemplos de patrones&lt;/h4&gt;
&lt;h5&gt;&lt;A NAME=&quot;titulo36&quot;&gt;&lt;/A&gt;5.3.1.- Factory&lt;/h5&gt;
&lt;p&gt;Problema: se debe generar un objeto de acuerdo a una entrada espec&amp;iacute;fica definida en tiempo de ejecuci&amp;oacute;n. 
&lt;br&gt;
Ejemplo: Crear un generador de thumbnails que sea f&amp;aacute;cilmente extensible a diversos tipos de archivos
&lt;br&gt;
Soluci&amp;oacute;n: se crea una clase (o funci&amp;oacute;n), que devuelve otra clase de acuerdo al contexto. &lt;/p&gt;
&lt;p&gt;C&amp;oacute;digo:&lt;/p&gt;
&lt;p&gt;- Con switch&lt;/p&gt;
&lt;p&gt; 
&lt;pre class=&quot;codigo&quot;&gt;
class generadorImagenes&lt;br&gt;{&lt;br&gt;    function &amp;amp;Factory($tipo, $archivo) {&lt;br&gt;        switch($tipo) {&lt;br&gt;            case &#039;gif&#039;:&lt;br&gt;            return &amp;amp;new ImagenesGif($archivo);&lt;br&gt;            break;&lt;br&gt;            case &#039;jpg&#039;:&lt;br&gt;            return &amp;amp;new ImagenesJpg($archivo);&lt;br&gt;            break;&lt;br&gt;            default:&lt;br&gt;            return false;&lt;br&gt;            break;&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;
  $miObjeto=&amp;amp;generadorImagenes($sTipo,$sArchivo)&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h5&gt;&lt;A NAME=&quot;titulo37&quot;&gt;&lt;/A&gt;5.3.2.- Singleton&lt;/h5&gt;
&lt;p&gt;Problema: Se requiere crear y acceder a una sola instancia de un objeto.
&lt;br&gt;
Soluci&amp;oacute;n: Se genera una funci&amp;oacute;n o clase (patr&amp;oacute;n Factory) que genera una instancia de un objeto. Si detecta que este ya existe, retorna esa instancia. 
&lt;br&gt;
Ejemplo: Crear una sola conexi&amp;oacute;n a la base de datos, accesible desde cualquier parte del script.&lt;/p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
class conexionDb&lt;br&gt;{&lt;br&gt;} 

// metodo con global&lt;br&gt;function &amp;amp;getDb() {&lt;br&gt;    if (!isset($GLOBALS[&amp;quot;CONEXION_DB&amp;quot;])) {&lt;br&gt;        $GLOBALS[&amp;quot;CONEXION_DB&amp;quot;] = &amp;amp;new conexionDb();&lt;br&gt;    }&lt;br&gt;    return $GLOBALS[&amp;quot;CONEXION_DB&amp;quot;];&lt;br&gt;}&lt;br&gt;
// con static

function &amp;amp;getDb() {&lt;br&gt;static $db = false;&lt;br&gt;if (!$db) {&lt;br&gt;    $db = &amp;amp;new conexionDb();&lt;br&gt;}&lt;br&gt;return $db;&lt;br&gt;}&lt;/pre&gt;
&lt;h5&gt;&lt;A NAME=&quot;titulo38&quot;&gt;&lt;/A&gt;5.3.3.- Estrategia&lt;/h5&gt;
&lt;p&gt;
&lt;br&gt;
Problema: Se tiene multitud de problemas cuya soluci&amp;oacute;n abstraca es la misma, pero que requieren algoritmos espec&amp;iacute;ficos.
&lt;br&gt;
Ejemplo: se desea validar un formulario. Las acciones requeridas son comunes a cualquier tipo de campo (verificar que no est&amp;eacute; vacios si es un campo requerido, que no contengan datos err&amp;oacute;neos, filtrar los contenidos para que sean procesables, etc.), pero la acci&amp;oacute;n espec&amp;iacute;fica var&amp;iacute;a de acuerdo al tipo de campo.
&lt;br&gt;
Soluci&amp;oacute;n: Crear una clase padre, que contenga las funciones m&amp;aacute;s importantes, y derivar de ella subclases que contengan la implementaci&amp;oacute;n espec&amp;iacute;fica de acuerdo al tipo particular de problema. Para obtener la clase correspondiente, se utiliza un patr&amp;oacute;n Factory.&lt;/p&gt;
&lt;p&gt; 
&lt;pre class=&quot;codigo&quot;&gt;
class procesadorCamposForma&lt;br&gt;{&lt;br&gt;    function &amp;amp;Factory($tipo) {&lt;br&gt;        $sClass = &amp;quot;procesadorCamposForma&amp;quot;.$tipo;&lt;br&gt;        if (class_exists($sClass)) {&lt;br&gt;            $oTemp = &amp;amp;new $sClass();&lt;br&gt;            return $oTemp;&lt;br&gt;        } else {&lt;br&gt;            return false;&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;    function procesadorCamposForma() {&lt;br&gt;    }&lt;br&gt;    function esRequerido() {&lt;br&gt;    }&lt;br&gt;    function estaVacio() {&lt;br&gt;    }&lt;br&gt;    function filtrar() {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;class procesadorCamposFormaText extends procesadorCamposForma&lt;br&gt;{&lt;br&gt;    function esRequerido() {&lt;br&gt;    }&lt;br&gt;    function estaVacio() {&lt;br&gt;    }&lt;br&gt;    function filtrar() {&lt;br&gt;    }&lt;br&gt;}&lt;/pre&gt;
&lt;/p&gt;
&lt;h5&gt;&lt;A NAME=&quot;titulo39&quot;&gt;&lt;/A&gt;5.3.4.- Fa&amp;ccedil;ade&lt;/h5&gt;
&lt;p&gt;Problema: Se tiene multitud de objetos, que deben actuar coordinadamente para realizar determinadas actividades
&lt;br&gt;
Ejemplo: Se deben crear formularios que reflejen el estado actual de la base de datos. La informaci&amp;oacute;n recibida debe ingresar nuevamente a la base de datos.
&lt;br&gt;
Resoluci&amp;oacute;n: Se crea un objeto que controle a los otros objetos, ocultando al programador la complejidad de la tarea.&lt;/p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
class conexionBaseDeDatos&lt;br&gt;{&lt;br&gt;}&lt;br&gt;class creadorFormularios&lt;br&gt;{&lt;br&gt;}&lt;br&gt;class procesadorFormularios&lt;br&gt;{&lt;br&gt;}&lt;br&gt;class formulariosTablas&lt;br&gt;{&lt;br&gt;    var $oDb;&lt;br&gt;    var $oCf;&lt;br&gt;    var $oPf;&lt;br&gt;    function formulariosTablas(&amp;amp;$oConexionDB) {&lt;br&gt;        $this-&amp;gt;oDb = &amp;amp;$oConexionDB;&lt;br&gt;        $this-&amp;gt;oCf = &amp;amp;new creadorFormularios();&lt;br&gt;        $this-&amp;gt;oPf = &amp;amp;new procesadorFormularios();&lt;br&gt;    }&lt;br&gt;    function generarFormulario($sTabla) {&lt;br&gt;        $aTablaEstructura = $this-&amp;gt;oDb-&amp;gt;getEstructuraTabla($sTabla);&lt;br&gt;        $aDatos = $this-&amp;gt;oDb-&amp;gt;getDatosTablas($sTabla, $aTablaEstructura[&amp;quot;cols&amp;quot;]);&lt;br&gt;        return $this-&amp;gt;oCf-&amp;gt;crearFormulario($aTablaEstructura[&amp;quot;cols&amp;quot;], $aDatos);&lt;br&gt;    }&lt;br&gt;}
&lt;/pre&gt;
&lt;h5&gt;&lt;A NAME=&quot;titulo40&quot;&gt;&lt;/A&gt;
&lt;br&gt;
5.3.5.- Cadena de responsabilidad&lt;/h5&gt;
&lt;p&gt;Problema: Se deben realizar un conjunto de acuerdo a una determina petici&amp;oacute;n, pero sin acoplar de modo fijo la petici&amp;oacute;n a un objeto.
&lt;br&gt;
Ejemplo: Se deben realizar m&amp;uacute;ltiples operaciones sobre un item, cada una de las cuales puede modificar lo que recibe la siguiente, ser necesarias y/o excluyentes entre s&amp;iacute;. 
&lt;br&gt;
Soluci&amp;oacute;n: Se encadenan los objetos receptores, de tal manera que la petici&amp;oacute;n pase de unos a otros hasta que alguno lo procese. Se establece una superclase manejadora abstracta, de las cuales deriven otras clases que contengan las implementaciones concretas (patr&amp;oacute;n Estrategia).&lt;/p&gt;
&lt;pre class=&quot;codigo&quot;&gt;
class Comando {&lt;br&gt;    function getDatos($aDatos) {&lt;br&gt;    }&lt;br&gt;    function verificar($aOpciones) {&lt;br&gt;    }&lt;br&gt;    function procesarDatos() {&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;class ComandoAgregar extends Comando {&lt;br&gt;}&lt;br&gt;class ComandoModificar extends Comando {&lt;br&gt;}&lt;br&gt;class ComandoQuitar extends Comando {&lt;br&gt;}&lt;br&gt;$aOperaciones = array(&amp;quot;agregar&amp;quot;, &amp;quot;quitar&amp;quot;, &amp;quot;modificar&amp;quot;);&lt;br&gt;$aDatos = $conexionDb-&amp;gt;getDatos($_GET[&amp;quot;tabla&amp;quot;]);&lt;br&gt;foreach($aOperaciones as $sOperacion) {&lt;br&gt;    if (in_array($sOperacion, $_GET[&amp;quot;operacion_seleccionada&amp;quot;])) {&lt;br&gt;        $oComando = Comando::Factory($sOperacion);&lt;br&gt;        $oComando-&amp;gt;getDatos($aDatos);&lt;br&gt;        $oComando-&amp;gt;verificar($_GET[&amp;quot;opciones&amp;quot;]);&lt;br&gt;        $aDatos = $oComando-&amp;gt;procesarDatos();&lt;br&gt;    }&lt;br&gt;}&lt;br&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;</description>
 <comments>http://php.apsique.com/contenido/curso_php_i#comments</comments>
 <category domain="http://php.apsique.com/lenguajes/php/curso_avanzado">Curso de Php Avanzado</category>
 <category domain="http://php.apsique.com/categoria/busquedas_comunes/estructuras_control">estructuras de control</category>
 <category domain="http://php.apsique.com/categoria/busquedas_comunes/objetos">objetos</category>
 <category domain="http://php.apsique.com/categoria/busquedas_comunes/patrones_diseno">patrones de diseño</category>
 <category domain="http://php.apsique.com/categoria/busquedas_comunes/referencias">referencias</category>
 <category domain="http://php.apsique.com/categoria/busquedas_comunes/variables">variables</category>
 <enclosure url="http://php.apsique.com/files/php_dia_1.ppt" length="55296" type="application/vnd.ms-powerpoint" />
 <pubDate>Sun, 04 Jan 2004 23:17:22 -0800</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">18 at http://php.apsique.com</guid>
</item>
</channel>
</rss>
