<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alfredo Juarez &#187; PHP</title>
	<atom:link href="http://www.alfrek.net/blog/tags/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alfrek.net/blog</link>
	<description>Web Design and Development</description>
	<lastBuildDate>Fri, 03 Dec 2010 20:06:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Symfony Components &#8211; Librerias PHP</title>
		<link>http://www.alfrek.net/blog/2009/09/symfony-components-librerias-php/</link>
		<comments>http://www.alfrek.net/blog/2009/09/symfony-components-librerias-php/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 00:14:04 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Patrones de DiseÃ±o]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[librerias]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=1273</guid>
		<description><![CDATA[La gente detrás de Symfony, uno de los Frameworks más usados por la comunidad PHP ha publicado una serie de librerias independientes, que prometen ayudar con el proceso de desarrollo de aplicaciones Web, en su web reza la siguiente frase: The Symfony Components are standalone and reusable PHP classes. With no pre-requisite, except for PHP, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-1274" title="symfony-components" src="http://www.alfrek.net/blog/wp-content/uploads/2009/09/symfony-components.jpg" alt="symfony-components" width="480" height="207" /></p>
<p>La gente detrás de Symfony, uno de los Frameworks más usados por la comunidad PHP ha publicado una serie de librerias independientes, que prometen ayudar con el proceso de desarrollo de aplicaciones Web, en su web reza la siguiente frase:</p>
<blockquote><p><a title="Symfony Components" href="http://components.symfony-project.org/" target="_blank">The Symfony Components</a> are standalone and reusable PHP classes. With no pre-requisite, except for PHP, you can install them today, and start using them right away. Currently, there are three components available at the moment.</p></blockquote>
<p>Los componentes publicados hasta el momento son:</p>
<p><strong><img class="alignnone size-full wp-image-1275" title="yaml" src="http://www.alfrek.net/blog/wp-content/uploads/2009/09/yaml.png" alt="yaml" width="278" height="236" /></strong></p>
<p><strong>YAML â€“ Una librerí­a que habla YAML</strong><br />
Symfony YAML es una libreria PHP que convierte cadenas YAML a arreglos PHP y viceversa.</p>
<p><img class="alignnone size-full wp-image-1276" title="event-dispatcher" src="http://www.alfrek.net/blog/wp-content/uploads/2009/09/event-dispatcher.png" alt="event-dispatcher" width="278" height="236" /></p>
<p><strong>Event Dispatcher â€“ Facilitando la comunicación entre clases</strong><br />
Symfony Event Dispatcher es una librerí­a que provee de una implementación ligera del patrón de diseño Observer.</p>
<p><img class="alignnone size-full wp-image-1277" title="dependency-injection" src="http://www.alfrek.net/blog/wp-content/uploads/2009/09/dependency-injection.png" alt="dependency-injection" width="278" height="236" /></p>
<p><strong>Dependency Injection â€“ Reinventando el manejo de clases</strong><br />
Symfony Dependency Injection es una librerí­a que provee un robusto contenedor de inyección de dependencias (Dependency Injection).</p>
<p>[Via <a href="http://www.webappers.com/2009/09/21/symfony-components-standalone-libraries-for-php/" target="_blank">WebAppers</a>]</p>
<a href="javascript:toggleStartStop();PicLensLite.start({feedUrl:'http://www.alfrek.net/blog/wp-content/plugins/wp-piclens/mrss.php?id=1273'});">Start Slide Show with PicLens Lite <img src="http://www.alfrek.net/blog/wp-content/plugins/wp-piclens/PicLensButton.png" alt="PicLens" width="16" height="12" border="0" align="top"></a>]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2009/09/symfony-components-librerias-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando Apache 2.2.x + PHP 5.x en FreeBSD</title>
		<link>http://www.alfrek.net/blog/2009/07/instalando-apache-2-2-x-php-5-x-en-freebsd/</link>
		<comments>http://www.alfrek.net/blog/2009/07/instalando-apache-2-2-x-php-5-x-en-freebsd/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 19:27:39 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Otros]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[instalacion]]></category>
		<category><![CDATA[tutoriales]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=1186</guid>
		<description><![CDATA[Primero que nada instalaremos Apache 2.2.x, para eso vamos a hacer lo siguiente: # cd /usr/ports/www/apache22 # make install clean Luego de instalarse, debes de saber que el &#8220;web root&#8221; por defecto está en &#8220;/usr/local/www/apache22/data/&#8221; (aqui es donde pondrás todas las páginas y/o archivos que quieras prublicar en la web. Y por otra parte el [...]]]></description>
			<content:encoded><![CDATA[<p>Primero que nada  instalaremos Apache 2.2.x, para eso  vamos a hacer lo siguiente:</p>
<p><code> # cd /usr/ports/www/apache22<br />
# make install clean</code></p>
<p>Luego de instalarse, debes de saber que el &#8220;web root&#8221; por defecto está en &#8220;<strong>/usr/local/www/apache22/data/</strong>&#8221; (aqui es donde pondrás todas las páginas y/o archivos que quieras prublicar en la web. Y por otra parte el httpd.conf está en &#8220;<strong>/usr/local/etc/apache22/httpd.conf</strong>&#8220;.</p>
<p>Ahora sigue decirle al sistema que queremos que arranque el apache junto con él, para eso agregamos la siguiente linea al archivo <strong>/etc/rc.conf</strong>.</p>
<p><code>apache_enable="YES"</code></p>
<p>Con esa linea el demonio deberí­a iniciar durante el booteo de nuestro servidor.<br />
<em>(ACTUALIZADO) 08 de Marzo de 2010</em><br />
Antes de iniciar el demonio de Apache deberás agregar una linea al archivo /boot/loader.conf, para lo cuál ejecutamos el siguiente comando:</p>
<p><code># echo 'accf_http_load="YES"' &gt;&gt; /boot/loader.conf</code><br />
Para iniciar Apache manualmente escribimos el siguiente comando:</p>
<p># /usr/local/etc/rc.d/apache22 start</p>
<p>O bien podemos reiniciar el sistema (<em><strong>reboot</strong></em>) para que el demonio inicie solo.</p>
<p>Luego comprobamos que apache esté corriendo correctamente, ingresando en el navegador la IP o dominio del servidor donde lo hayas instalado. Si ves alguna página de apache todo salió perfecto, si no, revisa los pasos anteriores algo hiciste mal <img src='http://www.alfrek.net/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> .</p>
<p>Ahora bien, seguimos con PHP, para instalarlo habrá que seguir los siguientes pasos:</p>
<p># cd /usr/ports/lang/php5<br />
# make config<br />
# make install</p>
<p>Cuando estés en el cuadro de diálogo de configuración asegurate de seleccionar el Módulo para Apache, de lo contrario todo saldrá mal.</p>
<p>Una vez instalado, continuaremos con los siguientes módulos:</p>
<pre>/usr/ports/databases/php5-mysql - Soporte para MySQL
/usr/ports/www/php5-session	- Sessiones
/usr/ports/graphics/php5-gd - Librerí­a GD
/usr/ports/lang/php-extensions - Diversas Extensiones para PHP</pre>
<p>Ahora solo resta agregar a la configuración de Apache (/usr/local/etc/apache22/httpd.conf) las siguientes lineas, para decirle que tenemos PHP instalado.</p>
<pre># Apache 2.x
LoadModule php5_module        libexec/apache/libphp5.so</pre>
<p><em>Si lo instalaste por Ports y si ya tenias Apache instalado, esta linea ya deberí­a de estar.</em></p>
<p>Ahora busca la sección DirectoryIndex en el httpd.conf y modificalo para que quede como esto:</p>
<pre>DirectoryIndex index.php index.html index.htm</pre>
<p>Ahora resta agregar las siguientes lineas al httpd.conf para decirle a Apache que debe parsear los archivos .php:</p>
<pre>AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
<strong></strong></pre>
<p><strong>CONFIGURANDO PHP</strong></p>
<p>El archivo de configuración de PHP se encuentra en /usr/local/etc/php.ini, vas a tener que copiarlo desde /usr/local/etc/php.ini-dist.</p>
<p><code># cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini</code></p>
<p>Después de que ya quedaron todas las configuraciones, debemos de reiniciar Apache para que los cambios hagan efecto. Ahora sigue probar que todo haya salido bien:</p>
<pre># echo "&lt;?php phpinfo(); ?&gt;" &gt;&gt; /usr/local/www/apache22/data/test.php</pre>
<p>Ahora apunta el navegador a la dirección: <em><strong>http://localhost/test.php</strong></em> Si ves una página con información de las configuraciones del PHP todo salió bien.</p>
<p>En caso contrario, deberás revisar todas las partes que escribiste, posiblemente algo se te barrió.</p>
<a href="javascript:toggleStartStop();PicLensLite.start({feedUrl:'http://www.alfrek.net/blog/wp-content/plugins/wp-piclens/mrss.php?id=1186'});">Start Slide Show with PicLens Lite <img src="http://www.alfrek.net/blog/wp-content/plugins/wp-piclens/PicLensButton.png" alt="PicLens" width="16" height="12" border="0" align="top"></a>]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2009/07/instalando-apache-2-2-x-php-5-x-en-freebsd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bienvenido PHP 5.3!</title>
		<link>http://www.alfrek.net/blog/2009/06/bienvenido-php-5-3/</link>
		<comments>http://www.alfrek.net/blog/2009/06/bienvenido-php-5-3/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 18:17:03 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=1178</guid>
		<description><![CDATA[Tal como lo anunciara el equipo de desarrollo, el dí­a de hoy ha sido liberada la versión 5.3 de PHP, Esta versión es un paso importante en la serie 5.X y un escalón principal para el próximo lanzamiento de la versión 6.0, la cual pretende cambiar el paradigma de PHP. Algunas de las nuevas caracteristicas [...]]]></description>
			<content:encoded><![CDATA[<p>Tal como lo anunciara el equipo de desarrollo, el dí­a de hoy ha sido liberada la versión 5.3 de <strong>PHP</strong>, Esta versión es un paso importante en la serie 5.X y un escalón principal para el próximo lanzamiento de la versión 6.0, la cual pretende cambiar el paradigma de PHP.</p>
<p>Algunas de las nuevas caracteristicas clave incluyen:</p>
<ul>
<li>Namespaces.</li>
<li>Late static bulding.</li>
<li>Closures.</li>
<li>Opcional garbage collection para eliminar objetos que no están siendo usados/referenciados.</li>
<li>Nuevas extensiones (ext/phar, ext/intl, ext/FileInfo).</li>
<li>Más de 140 correciones de errores y mucho más.</li>
</ul>
<p>El equipo de PHP publicó una completa <a href="http://php.net/migration53" target="_blank">guí­a de emigración desde la versión PHP 5.2</a>.</p>
<p>Más detalles sobre la liberación de <a href="http://php.net/releases/5_3_0.php" target="_blank">PHP 5.3.0 se puede encontrar aquí­</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2009/06/bienvenido-php-5-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP para aplicaciones empresariales</title>
		<link>http://www.alfrek.net/blog/2009/05/php-para-aplicaciones-empresariales/</link>
		<comments>http://www.alfrek.net/blog/2009/05/php-para-aplicaciones-empresariales/#comments</comments>
		<pubDate>Thu, 07 May 2009 18:31:58 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[empresas]]></category>
		<category><![CDATA[frameworks]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=1105</guid>
		<description><![CDATA[En VivaPHP ví­ el anuncio de un fork de kumbia para desarrollos empresariales, el cual está lidereado por Louder Technology y se llama Kumbia Enterprise Framework, este Framework está especialmente diseñado para aplicaciones basadas en SOA bajo PHP y sus principales caracterí­sticas funcionales son: Contenedor de Aplicaciones Arquitectura Modelo-Vista-Controlador (MVC) Object-Relational-Mapping (ORM) Administrador de Transacciones [...]]]></description>
			<content:encoded><![CDATA[<p>En <a href="http://www.vivaphp.com.ar/frameworks/kumbia-enterprise-framework.html" target="_blank">VivaPHP </a>ví­ el anuncio de un <strong><em>fork</em></strong> de <a href="http://www.kumbiaphp.com/blog/" target="_blank">kumbia</a> para desarrollos empresariales, el cual está lidereado por <a href="http://www.loudertechnology.com/site" target="_blank">Louder Technology</a> y se llama <a href="http://www.loudertechnology.com/site/projects/kumbia_enterprise_framework" target="_blank">Kumbia Enterprise Framework</a>, este Framework está especialmente diseñado para aplicaciones basadas en <a href="http://es.wikipedia.org/wiki/SOA" target="_blank">SOA</a> bajo PHP y sus principales caracterí­sticas funcionales son:</p>
<ul>
<li>Contenedor de Aplicaciones</li>
<li>Arquitectura Modelo-Vista-Controlador (MVC)</li>
<li>Object-Relational-Mapping (ORM)</li>
<li>Administrador de Transacciones</li>
<li>Business Process Management (BPM)</li>
<li>Seguridad Empresarial (Autenticación, Control de Acceso y Auditorí­a)</li>
<li>Servicios Web (Integración y Orquestamiento)</li>
<li>Localización e Internacionalización</li>
<li>Monitoreo de Aplicaciones</li>
<li>Reportes Empresariales (PDF, Excel, HTML)</li>
<li>Clustering</li>
</ul>
<p>Aprovechando la recta del artí­culo, quise hacer mención de otro framework especializado en aplicaciones empresariales, llamado <a href="http://www.atk-framework.com/" target="_blank">ATK Framework</a>, cuenta con mucha documentación y pinta para cumplir muy bien su trabajo, sus areas de aplicación son:</p>
<ul>
<li>CRM</li>
<li>HRM</li>
<li>ERP</li>
<li>Resource Management</li>
<li>Inventory Control</li>
<li>CMS</li>
</ul>
<p>Así­ que, si su intención es desarrollar aplicaciones empresariales utilizando PHP, no le pierdan el ojo a cualquiera de las dos opciones que les presento, seguro alguna de ellas les hará la vida más sencilla.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2009/05/php-para-aplicaciones-empresariales/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 5.3.0 RC1</title>
		<link>http://www.alfrek.net/blog/2009/04/php-530-rc1/</link>
		<comments>http://www.alfrek.net/blog/2009/04/php-530-rc1/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 17:55:16 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=1084</guid>
		<description><![CDATA[Ya se encuentra disponible la primera versión Release Candidate de PHP 5.3, así­ que todos pueden probarla y reportar errores de algunas importantí­simas novedades que han incluí­do en esta versión, entre las que destacan: Namespaces Funciones Lambda y closures (funciones anónimas). Driver nativo de MySQL para PHP. Soporte mejorado para windows incluyendo VC6 y VC9. [...]]]></description>
			<content:encoded><![CDATA[<p>Ya se encuentra disponible la primera versión Release Candidate de PHP 5.3, así­ que todos pueden probarla y reportar errores de algunas importantí­simas novedades que han incluí­do en esta versión, entre las que destacan:</p>
<ul>
<li>Namespaces</li>
<li><a href="http://docs.php.net/functions.anonymous" target="_blank">Funciones Lambda y closures (funciones anónimas).</a></li>
<li><a href="http://php.net/mysqli.mysqlnd" target="_blank">Driver nativo de MySQL para PHP</a>.</li>
<li>Soporte mejorado para windows incluyendo VC6 y VC9.</li>
<li>Nuevas extensiones <a href="http://php.net/phar">ext/phar</a>, <a href="http://php.net/intl">ext/intl</a>, <a href="http://php.net/fileinfo">ext/fileinfo</a>, <a href="http://php.net/sqlite3">ext/sqlite3</a> y <a href="http://php.net/enchant">ext/enchant</a>.</li>
<li>Garbage Collection para referencias cí­clicas.</li>
</ul>
<p>Además hay algunas funciones que quitaron o cambiaron de lugar, para aquellos interesados, PHP puso a disposición una <a href="http://cvs.php.net/viewvc.cgi/php-src/UPGRADING?view=markup&amp;pathrev=PHP_5_3" target="_blank">guia de actualización</a>.</p>
<p><strong>Links</strong></p>
<p>Download: <a href="http://downloads.php.net/johannes/php-5.3.0RC1.tar.bz2">PHP 5.3.0 RC1</a> (Fuentes)</p>
<p>[Via <a href="http://www.vivaphp.com.ar/soft/php-5.3.0-rc1.html" target="_blank">VivaPHP</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2009/04/php-530-rc1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excepciones en PHP Parte II</title>
		<link>http://www.alfrek.net/blog/2008/09/excepciones-en-php-parte-ii/</link>
		<comments>http://www.alfrek.net/blog/2008/09/excepciones-en-php-parte-ii/#comments</comments>
		<pubDate>Mon, 15 Sep 2008 22:44:34 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[ProgramaciÃ³n]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[excepciones]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=706</guid>
		<description><![CDATA[En la entrega anterior vimos de manera sencilla qué son y cómo funcionan las Excepciones en PHP 5. En esta ocasión veremos ejemplos semi-reales y repasaremos algunos detalles que debemos tener en cuenta a la hora de usar excepciones. Las excepciones no te salvan Si estás pensando que las excepciones te salvarán tus errores, ni [...]]]></description>
			<content:encoded><![CDATA[<p>En la <a href="http://www.alfrek.net/blog/2008/07/17/excepciones-en-php/" target="_blank">entrega anterior</a> vimos de manera sencilla qué son y cómo funcionan las Excepciones en PHP 5. En esta ocasión veremos ejemplos semi-reales y repasaremos algunos detalles que debemos tener en cuenta a la hora de usar excepciones.</p>
<h3>Las excepciones no te salvan</h3>
<p>Si estás pensando que las excepciones te salvarán tus errores, ni lo intentes. El uso de excepciones no solventa los errores de programación, eso sácalo de tu mente.</p>
<p>Las excepciones se utilizan para solventar errores en tiempo de ejecución, es decir, cualquier intento fallido lo manejas con excepciones para mostrarle un mensaje bonito al usuario final.</p>
<h3>Ejemplo</h3>
<p>Este código intenta abrir un archivo, en caso que no exista se tirará la excepción, de lo contrario mostrará un mensaje que muestre que el archivo se abrió correctamente.</p>
<pre><code class="php">&lt;?php

	<span class="keyword">try</span>
	{
		<span class="keyword">if</span>( ! fopen( <span class="string">"miarchivo.php"</span>,<span class="string">'r'</span> ) )
		{
			 <span class="keyword">throw</span> <span class="keyword">new</span> <span class="keyword">Exception</span>(<span class="string">'Error al abrir el archivo.'</span>);
		}

		<span class="keyword">echo</span> <span class="string">"El archivo fue abierto correctamente."</span>;
               <span class="keyword">// ...Código para trabajar con el archivo....</span>

	}
	<span class="keyword">catch</span> (<span class="keyword">Exception</span> <span class="variable">$e</span>)
	{
		<span class="keyword">echo</span> <span class="variable">$e</span>-&gt;getMessage(), <span class="string">"<span class="escape">\n</span>"</span>;
	}

?&gt;</code></pre>
<p>Si el archivo no existe o si ocurrió un error al intentar abrirlo, el mensaje que mostrarí­a PHP sin el manejo de excepciones serí­a el siguiente:</p>
<blockquote><p><strong>Warning</strong>: fopen(miarchivo.php) [<a href="http://localhost/to-do/function.fopen">function.fopen</a>]: failed to open stream: No such file or directory in <strong>path</strong><strong>\exception.php</strong> on line <strong>5</strong></p></blockquote>
<p>En cambio, con el manejo de excepciones el Script mostrará el siguiente error:</p>
<blockquote><p><strong>Error al abrir el archivo, es posible que no exista.</strong></p></blockquote>
<p>Claro, <strong>PHP </strong>siempre mostrará sus mensajes de error, mientras no se le indique lo contrario, es decir, además de tu mensaje personalizado también aparecerá el mensaje de error generado por <strong>PHP</strong>.</p>
<p>De hecho, <strong>es recomendable desactivar los mensajes de error del PHP una vez que el software ya esté en manos del usuario final (por motivos de seguridad más que por estética)</strong>.</p>
<p>El ejemplo es sencillo y es utilizable en cualquier caso de uso real, así­ que espero que les sirva de algo.</p>
<h3>Entradas relacionadas</h3>
<p><a href="http://www.alfrek.net/blog/2008/07/17/excepciones-en-php/" target="_blank">Excepciones en PHP Parte I</a></p>
<p>Si tienes alguna duda sobre PHP o igual te interesa el tema y deseas conocer gente del medio, puedes contactarnos en irc desde el servidor: <a href="irc://irc.menosnueve.com/php" target="_blank">69.64.59.193</a> en el canal #php.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2008/09/excepciones-en-php-parte-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excepciones en PHP Parte I</title>
		<link>http://www.alfrek.net/blog/2008/07/excepciones-en-php/</link>
		<comments>http://www.alfrek.net/blog/2008/07/excepciones-en-php/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 21:52:58 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[ProgramaciÃ³n]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[exceptions]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=485</guid>
		<description><![CDATA[La manera simple de manejar un error es usando die( ) cuando éste ocurre, sin embargo, a esto se le conoce como el suicidio del software. Aunque Martin Fowler nos dice que: &#8220;Si el costo de que el programa truene es pequeño y el usuario es tolerante así­ está bien&#8221;. En PHP 5, como en [...]]]></description>
			<content:encoded><![CDATA[<p>La manera simple de manejar un error es usando <strong><em>die( )</em></strong> cuando éste ocurre, sin embargo, a esto se le conoce como el suicidio del software. Aunque Martin Fowler nos dice que: <strong><em>&#8220;Si el costo de que el programa truene es pequeño y el usuario es tolerante así­ está bien&#8221;.</em></strong></p>
<p>En <strong>PHP 5</strong>, como en muchos otros lenguajes, tenemos una alternativa al suicidio: <strong><em>Lanzando una excepción</em></strong>. Si no manejamos la excepción con un <strong><em>catch </em></strong>el sistema terminará el programa de la misma manera que <strong><em>die( )</em></strong>, agregándole un trazado de la pila (<em>stack trace)</em>. Pero si en un futuro decidieramos manejar cierto error, de esta manera ya serí­a más sencillo.</p>
<h2>Â¿Como funcionan?</h2>
<p>El lenguaje de programaciónsabe que exception es una manera de comunicar un error o condiciones de excepción entre diferentes partes del programa. Por ejemplo, imaginemos que tenemos un método para conectar con una base de datos MySQL.</p>
<pre><code class="profile">$db = new DBM;

if <span class="function">( !$<span class="title">db</span>-&gt;<span class="title">connect</span>( )</span> )
	die<span class="function">("<span class="title">Error</span>: <span class="title">no</span> <span class="title">se</span> <span class="title">puede</span> <span class="title">conectar</span>")</span>;
else
{<span class="builtin">
	// .....
	// ---------&gt;
	// .....
</span>}</code></pre>
<p>Esta es la versión suicida usando die( ), ahora veamos la versión utilizando el manejo de excepciones:</p>
<pre><code class="php"><span class="variable">$db</span> = <span class="keyword">new</span> DBM;

<span class="keyword">if</span> ( !<span class="variable">$db</span>-&gt;connect( ) )
{
	<span class="keyword">throw</span> <span class="keyword">new</span> <span class="keyword">Exception</span>(
		<span class="string">"ERROR: no se ha podido conectar"</span>);
}
<span class="keyword">else</span>
{
	<span class="comment">// .....</span>
	<span class="comment">// ---------&gt;</span>
	<span class="comment">// .....</span>
}</code></pre>
<p>Si no hacemos nada para cachar la excepción, esto tiene el mismo efecto que die( ): Para la aplicación, además, este método hace una cosa adicional, imprime un stack trace, la cual puede ser muy usable para el debugging. Puedes obtener un stack trace sin usar excepciones usando las funciones debug_backtrace( ) y debug_print_backtrace( ). Pero lanzando una excepción es aún más sencillo de hacerlo.</p>
<p><code>Fatal error: Uncaught exception 'Exception' with message<br />
'Error: no se ha podido conectar' in /path/exception.php:6<br />
Stack trace:<br />
#0 /path/exception.php(6): DBM::connect()<br />
#1 /path/exception.php(12): DBM-&gt;connect()<br />
#2 {main}<br />
thrown in /path/exception.php on line 6<br />
</code></p>
<p>Si no queremos que los usuarios vean estos errores técnicos (por cierto no deberí­amos por cuestiones de seguridad), estamos en una mejor posición por haber usado excepciones que usar die( ).  Si hemos usado die( ) en muchos lugares, tenemos que encontrar todas las ocurrencias y cambios en cada una. Si usamos excepciones, todo lo que necesitamos es cacharlas en algún lugar conveniente, por ejemplo, pudieramos registrar el mensaje y redireccionar al usuario a una pagina de error.</p>
<pre><code class="php"><span class="variable">$db</span> = <span class="keyword">new</span> DBM;

<span class="keyword">try</span>
{
	<span class="variable">$db</span>-&gt;connect( );
}
<span class="keyword">catch</span> (<span class="keyword">Exception</span> <span class="variable">$e</span>)
{
	<span class="variable">$logger</span>-&gt;log(<span class="variable">$e</span>-&gt;getMessage());
	header(<span class="string">"Location: error.php"</span>);
}</code></pre>
<p>Como podrán ver el manejo de excepciones es algo imprescindible en el desarrollo de aplicaciones, ya que manejas de una manera más elegante los errores que surjan dentro de la aplicación. En próximas entregas les mostraré más ejemplos y profundizaré en el manejo de excepciones en <strong>PHP</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2008/07/excepciones-en-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>DAO: Data Access Object</title>
		<link>http://www.alfrek.net/blog/2008/07/dao-data-access-object/</link>
		<comments>http://www.alfrek.net/blog/2008/07/dao-data-access-object/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 00:05:38 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[Arquitectura de Software]]></category>
		<category><![CDATA[Ingenieria de Software]]></category>
		<category><![CDATA[Patrones de DiseÃ±o]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ProgramaciÃ³n]]></category>
		<category><![CDATA[dao]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[patrones de diseÃ±o]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=460</guid>
		<description><![CDATA[La mayorí­a de aplicaciones requieren de interacción con una base de datos, ya sea del tipo relacional u orientada a objetos y en la mayorí­a de los casos la persistencia de datos está mezclada con la lógica del negocio. Lo que supone un problema a la hora de querer cambiar el motor de base de [...]]]></description>
			<content:encoded><![CDATA[<p>La mayorí­a de aplicaciones requieren de interacción con una base de datos, ya sea del tipo relacional u orientada a objetos y en la mayorí­a de los casos la persistencia de datos está mezclada con la lógica del negocio. Lo que supone un problema a la hora de querer cambiar el motor de base de datos.</p>
<p>Para entenderlo mejor formularemos un ejemplo de la vida real.</p>
<p>Imaginemos que estamos desarrollando una aplicación en la empresa donde trabajamos y estamos utilizando MySQL como motor de base de datos. Estamos en la fase de pruebas (ya a punto de publicar el producto final), y por alguna extraña razón a tu jefe se le ocurre que mejor deberí­amos usar Oracle, por que se lo recomendaron, piensa que es mejor, etc.</p>
<p>Que pasa si tenemos todo mezclado (lógica del negocio, métodos de acceso a datos, etc),  se convierte en una tremenda pesadilla.</p>
<p>Para nuestra suerte existe el patrón de diseño Data Access Object (DAO), que se encarga de encapsular la interacción de una aplicación con la base de datos.</p>
<p><strong>Â¿Como funciona?</strong></p>
<p>DAO encapsula el acceso a la base de datos, de esta manera cuando la capa de lógica de negocio necesite interactuar con la base de datos, ésta utilizará los métodos ofrecidos por DAO. Generalmente la clase de operaciones que ofrece la capa de datos se le conoce como CRUD (Create, Read, Update y Delete).</p>
<p>Cuando la capa de negocios necesite almacenar datos (por ejemplo) solo tendrá que hacer referencia al método correspondiente para insertar los datos de la clase DAO, de esta manera si en algún momento se llegara a optar por usar otro motor de búsquedas, la capa del negocio no se debe preocupar ya que sólo bastará con actualizar la capa de datos. Si hablamos de patrones algunos detectarán por aquí­ que se están delegando responsabilidades, una buena práctica de la orientación a objetos.</p>
<p>De hecho el método de persistencia no debe de interesarle a la capa de negocios, es decir, a él no le importa si los datos se guardan en una tabla MySQL, XML, Texto plano o se imprime, de esto se encarga DAO.</p>
<p>Por cada tabla de una base de datos relacional existirá un DAO. Esto consiste básicamente en una clase que es la que interactúa con la base de datos. Los métodos de esta clase dependen de la aplicación y de lo que queramos hacer. Pero generalmente se implementan las 4 funciones básicas (también conocidas como métodos CRUD).</p>
<p>Una vez entendido el funcionamiento de DAO, es conveniente explicar un nuevo término que nos será de ayuda para completar la implementación de nuestra capa de persistencia. Se trata de los DTO&#8217;s (Data Transfer IObject), los cuáles son utilizados por DAO para transportar los datos desde la base de datos hasta la capa de lógica de negocio o vice versa.</p>
<p>En pocas palabras un DTO es un objeto que en su interior tiene como atributos los mismos atributos del modelo, con sus correspondientes accessors (Setters y Getters).</p>

<a href="http://www.alfrek.net/blog/wp-content/gallery/prueba/dao-diagram.png" title="" class="thickbox" rel="singlepic2" >
	<img class="ngg-singlepic" src="http://www.alfrek.net/blog/index.php?callback=image&amp;pid=2&amp;width=320&amp;height=240&amp;mode=watermark" alt="dao-diagram.png" title="dao-diagram.png" />
</a>

<p>Diagrama DAO</p>
<p><strong>Ahora veamos un ejemplo</strong></p>
<p>Tenemos una aplicación que entre una de sus tantas funciones es controlar los datos de  clientes, y queremos usar DAO para el manejo de la persistencia de dicha aplicación.<br />
Primero que nada de define el modelo 8en este caso de clientes), para después partir con la codificación de los respectivos DTO y DAO.</p>
<p><strong>DTO</strong></p>
<pre><code class="php"><span class="keyword">Class</span> ClientesDTO
{
      <span class="keyword">private</span> <span class="variable">$id</span>;
      prí­vate <span class="variable">$nombre</span>;
      prí­vate <span class="variable">$direccion</span>;

      <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">function</span> getID( )
      {
          <span class="keyword">return</span> <span class="variable">$this</span>-&gt;id;
      }

      <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">function</span> getName( )
      {
          <span class="keyword">return</span> <span class="variable">$this</span>-&gt;nombre;
      }

      <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">function</span> getAddress( )
      {
          <span class="keyword">return</span> <span class="variable">$this</span>-&gt;direccion;
      }

      <span class="comment">/* Setters */</span>
      <span class="keyword">Public</span> <span class="keyword">static</span> <span class="keyword">function</span> setID( <span class="variable">$id</span> )
      {
          <span class="variable">$this</span>-&gt;id = <span class="variable">$id</span>;
      }
      <span class="keyword">Public</span> <span class="keyword">static</span> <span class="keyword">function</span> setName( <span class="variable">$name</span> )
      {
          <span class="variable">$this</span>-&gt;nombre = <span class="variable">$name</span>;
      }
      <span class="keyword">Public</span> <span class="keyword">static</span> <span class="keyword">function</span> setAddress( <span class="variable">$address</span> )
      {
          <span class="variable">$this</span>-&gt;direccion = <span class="variable">$address</span>;
      }
}</code></pre>
<p><strong>DAO</strong></p>
<pre><code class="php"><span class="keyword">class</span> clientesDAO
{
     <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">function</span> create( <span class="variable">$dto</span> )
     {
          <span class="comment">/* implementación para la creación de un nuevo registro */</span>
     }

      <span class="comment">/* aqui van los demás metodos CRUD */</span>
}</code></pre>
<p>Por obvias razones no escribí­ todo el código necesario ya que este artí­culo es meramente informativo, pero pienso que es explicito el ejemplo para comprender el uso del patrón DAO.<br />
En la próxima entrega les mostraré un ejemplo más real, utilizando una mezcla de patrones, como el DAO, Singleton, Factory y Faí§ade.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2008/07/dao-data-access-object/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Por que el Logo de PHP es un Elephante</title>
		<link>http://www.alfrek.net/blog/2008/06/por-que-el-logo-de-php-es-un-elephante/</link>
		<comments>http://www.alfrek.net/blog/2008/06/por-que-el-logo-de-php-es-un-elephante/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 17:43:24 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/?p=394</guid>
		<description><![CDATA[siendo sincero no se si tenga algo que ver, ni tampoco es algo relevante, pero bueno aquí­ se los dejo para los curiosos. Via aNieto2k Start Slide Show with PicLens Lite]]></description>
			<content:encoded><![CDATA[<p><a rel="attachment wp-att-395" href="http://www.alfrek.net/blog/2008/06/04/por-que-el-logo-de-php-es-un-elephante/php-logo-php-721782/"><img class="alignnone size-full wp-image-395" title="php-logo-php-721782" src="http://www.alfrek.net/blog/wp-content/uploads/2008/06/php-logo-php-721782.gif" alt="" width="500" height="114" /></a></p>
<p>siendo sincero no se si tenga algo que ver, ni tampoco es algo relevante, pero bueno aquí­ se los dejo para los curiosos.</p>
<p>Via <a href="http://www.anieto2k.com/2008/06/03/%c2%bfpor-que-la-mascota-de-php-es-un-elefante/" target="_blank">aNieto2k</a></p>
<a href="javascript:toggleStartStop();PicLensLite.start({feedUrl:'http://www.alfrek.net/blog/wp-content/plugins/wp-piclens/mrss.php?id=394'});">Start Slide Show with PicLens Lite <img src="http://www.alfrek.net/blog/wp-content/plugins/wp-piclens/PicLensButton.png" alt="PicLens" width="16" height="12" border="0" align="top"></a>]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2008/06/por-que-el-logo-de-php-es-un-elephante/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pequeño ejemplo de AJAX y PHP</title>
		<link>http://www.alfrek.net/blog/2007/07/pequeno-ejemplo-de-ajax-y-php/</link>
		<comments>http://www.alfrek.net/blog/2007/07/pequeno-ejemplo-de-ajax-y-php/#comments</comments>
		<pubDate>Sun, 15 Jul 2007 00:14:11 +0000</pubDate>
		<dc:creator>alfredojv</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ProgramaciÃ³n]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.alfrek.net/blog/2007/07/14/pequeno-ejemplo-de-ajax-y-php/</guid>
		<description><![CDATA[Estoy seguro que muchos han leí­Â­do y/o escuchado hablar sobre AJAX, el cual es algo viejo, pero relativamente recien descubierto. Mas de alguno (o la mayoriÂ­a) ha leiÂ­do sus conceptos y demas; en este Tutorial no me enfocare a explicar los principios de esta metodologiÂ­a de desarrollo Web. Para los que prefieren leer alguna introduccion [...]]]></description>
			<content:encoded><![CDATA[<p>Estoy seguro que muchos han leí­Â­do y/o escuchado hablar sobre AJAX, el cual es algo viejo, pero relativamente recien descubierto. Mas de alguno (o la mayoriÂ­a) ha leiÂ­do sus conceptos y demas; en este Tutorial no me enfocare a explicar los principios de esta metodologiÂ­a de desarrollo Web.  Para los que prefieren leer alguna introduccion pueden ir <a href="http://www.masternewmedia.org/es/tecnolog%C3%ADas_dise%C3%B1o_de_interfaz/Ajax/Que_Cosa_Es_Ajax_Y_Para_Qu%C3%A9_Es_Bueno_20051101.htm.htm" target="_blank">aquiÂ­</a> (Por cierto en la red existen muchiÂ­simos artiÂ­culos sobre esta metodologiÂ­a o bien si lo prefieren existen muy buenos libros recomendables).<br />
Bien pasemos a lo que nos interesa, que es programar ejemplos en AJAX con ayuda de PHP.</p>
<p><span id="more-55"></span></p>
<h2>La llamada AJAX</h2>
<p>En principio se crea una funcion Multi-Browser, (para los que se preguntan por que multi-browser es simplemente que Microsoft tercamente sigue sin apegarse a los estandares). Pero bueno esa es otra historia.</p>
<pre><code class="javascript"><span class="keyword">var</span> xml = {
	pag:
	<span class="function"><span class="keyword">function</span><span class="params">(url,id,func)</span> {</span>
		<span class="keyword">var</span> pag=<span class="literal">false</span>;
		<span class="keyword">if</span> ( window.XMLHttpRequest ) {
			pag = <span class="keyword">new</span> XMLHttpRequest()
		}
		<span class="keyword">else</span> <span class="keyword">if</span> (window.ActiveXObject) {
			<span class="keyword">try</span>{
				pag = <span class="keyword">new</span> ActiveXObject(<span class="string">"Msxml2.XMLHTTP"</span>)
			}
			<span class="keyword">catch</span>(e) {
				<span class="keyword">try</span> {
					pag = <span class="keyword">new</span> ActiveXObject(<span class="string">"Microsoft.XMLHTTP"</span>)
				}
				<span class="keyword">catch</span>(e){ }
			}
		}
		<span class="keyword">else</span>
			<span class="keyword">return</span> <span class="literal">false</span>;
		<span class="keyword">return</span> pag
	}
}</code></pre>
<p>Una vez creada la llamada AJAX, veamos el primer ejemplo, el cual es enviar datos de un formulario a un arhcivo PHP y obtener respuesta de manera asincrona.</p>
<pre><code class="javascript"><span class="function"><span class="keyword">function</span> <span class="title">sendData</span><span class="params">( nombre_, edad_ )</span>
{</span>
	<span class="keyword">var</span> capa=document.getElementById(â€datosâ€);

	<span class="keyword">var</span> nombre = document.getElementById(nombre_).value;
	<span class="keyword">var</span> edad = document.getElementById(edad_).value;

	<span class="comment">// Creo el objeto AJAX</span>

	<span class="comment">// Coloco el mensaje â€œCargandoâ€¦â€ en la capa</span>
	capa.innerHTML=â€Enviando datos al servidorâ€¦â€;

	send = â€œnombre=â€+nombre+â€&amp;edad=â€+edad;

	pag=xml.pag();
	pag.onreadystatechange=<span class="function"><span class="keyword">function</span><span class="params">()</span>
	{</span>
		<span class="keyword">if</span> (pag.readyState==<span class="number">4</span>)
		{
			<span class="comment">// Cargo la respuesta del archivo llamadoâ€¦</span>

			capa.innerHTML=pag.responseText;
		}
	};

	pag.open(â€POSTâ€,â€ajax_ej1.phpâ€,<span class="literal">true</span>);
	pag.setRequestHeader(â€Content-Typeâ€,â€application/x-www-form-urlencodedâ€);
	pag.send(send);
}</code></pre>
<p>Esta funcion lo que hace es recibir los valores del formulario, procesarlos, y enviarlos al script de lado servidor, de manera asiÂ­ncrona.</p>
<p>El Script de lado servidor (Escrito en PHP, llamado ajax_ej1.php) Recibe los datos, y los procesa dependiendo de la condicion y envia respuesta, la cual es tomada por la funcion anteriormente descrita y a su vez, esta imprime el resultado en la capa (div) &#8220;datos&#8221;Â.</p>
<p>Veamos el Script PHP</p>
<pre><code class="php">&lt;?php
	<span class="variable">$nombre</span> = <span class="variable">$_POST</span>[<span class="string">"nombre"</span>];
	<span class="variable">$edad</span> = <span class="variable">$_POST</span>[<span class="string">"edad"</span>];

	<span class="keyword">if</span> (<span class="variable">$edad</span> &gt;= <span class="number">18</span>)
	{
		<span class="keyword">echo</span> â€œHola â€œ.<span class="variable">$nombre</span>.â€, Eres Bienvenido.â€;
	}
	<span class="keyword">else</span>
	{
		<span class="keyword">echo</span> â€œLo siento â€œ.<span class="variable">$nombre</span>.â€ No puedes entrar.â€;
	}
?&gt;</code></pre>
<p>Para cualquier duda, aclaracion, o criÂ­tica no duden en enviarme un E-mail, con gusto lo respondere.</p>
<p>Ahora si quieren descargar el ejemplo lo pueden hacer dando clic <a href="http://www.alfrek.net/blog/examples/ajax_php/ajax_php.zip" target="_blank">aquiÂ­</a>, o bien si lo quieren ver funcionando den clic <a href="http://www.alfrek.net/blog/examples/ajax_php/ajax_ej1.html" target="_blank">aca</a>.</p>
<p>Tal ves algunos cuantos se dieron cuenta sobre el potencial que tiene este ejemplo para practicas reales, para los que no se dieron cuenta, con unas cuantas modificaciones se puede usar, por ejemplo, para altas de clientes (En un sistema empresarial), solo agregas unos cuantos campos al formulario y los pasas como parametros a la funcion JavaScript, y listo.</p>
<p>Gracias a <a href="http://alfrek.net/~nocrox" target="_blank">nocrox</a>, por la llamada AJAX.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alfrek.net/blog/2007/07/pequeno-ejemplo-de-ajax-y-php/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

