<?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>Oh My Blog! &#187; Programación</title>
	<atom:link href="http://oscaralcala.com/category/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://oscaralcala.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 07 Nov 2011 23:54:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>El mejor consejo de programación de la historia</title>
		<link>http://oscaralcala.com/el-mejor-consejo-de-programacion-de-la-historia/</link>
		<comments>http://oscaralcala.com/el-mejor-consejo-de-programacion-de-la-historia/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 03:17:34 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
				<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://oscaralcala.com/?p=104</guid>
		<description><![CDATA[ 

Siempre escribe tu código como si la persona que lo vaya a mantener fuera un asesino serial que sabe donde vives.

Esto debería instituirse como mantra para muchos programadores. 
]]></description>
			<content:encoded><![CDATA[<p> <img src="http://oscaralcala.com/wp-content/uploads/2009/01/mantra_prog.jpg" alt="mantra" class="borde centro" /></p>
<blockquote><p>
Siempre escribe tu código como si la persona que lo vaya a mantener fuera un asesino serial que sabe donde vives.
</p></blockquote>
<p>Esto debería instituirse como mantra para muchos programadores. </p>
]]></content:encoded>
			<wfw:commentRss>http://oscaralcala.com/el-mejor-consejo-de-programacion-de-la-historia/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Como manejar objetos y sesiones de PHP cuando se usa AJAX</title>
		<link>http://oscaralcala.com/como-manejar-objetos-y-sesiones-de-php-cuando-se-usa-ajax/</link>
		<comments>http://oscaralcala.com/como-manejar-objetos-y-sesiones-de-php-cuando-se-usa-ajax/#comments</comments>
		<pubDate>Fri, 09 May 2008 20:03:47 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
				<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://oscaralcala.com/?p=49</guid>
		<description><![CDATA[ He estado trabajando en un pequeño proyecto personal ultimamente y me topé con el siguiente problema. Lo encontré muy mal documentado (al menos al momento de agregar AJAX) y ya que me costó un buen dolor de cabeza así pensé que sería buena idea publicar la solución. Ojalá este artículo ayude a alguien más [...]]]></description>
			<content:encoded><![CDATA[<p> He estado trabajando en un pequeño proyecto personal ultimamente y me topé con el siguiente problema. Lo encontré muy mal documentado (al menos al momento de agregar AJAX) y ya que me costó un buen dolor de cabeza así pensé que sería buena idea publicar la solución. Ojalá este artículo ayude a alguien más a ahorrarse un par de horas y un derrame innecesario de bilis.</p>
<p><strong>El problema 1.0</strong></p>
<p>Este es el escenario. Estoy usando PHP orientado a objetos con el fin de poder guardar instancias en variables de sesión y asi poder pasar información constantemente entre documentos sin muchas complicaciones.</p>
<p>Hasta aquí nada especial pero tiene un pequeño detalle a tomar en cuenta, y es que cada que intentas hacer una operación con un objeto, PHP necesita tener a la mano la definición de la clase en la que está basado. Un ejemplo con código para explicarme mejor:</p>
<p>Supongan que tenemos una clase ‘usuario’ definida como:</p>
<p><code>
<p>
&lt;?php<br />
// Archivo: usuario.php<br />
class usuario {<br />
&nbsp;&nbsp;&nbsp;	public $nombre;<br />
&nbsp;&nbsp;&nbsp;	public $apellido;<br />
&nbsp;&nbsp;&nbsp;	public function sayMyName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;		echo $this->nombre . ‘ ‘ . $this->apellido;<br />
&nbsp;&nbsp;&nbsp;	}<br />
}<br />
?&gt;
</p>
<p></code></p>
<p>En un segundo archivo creamos una instancia, la llenamos de datos y la asignamos a una variable de sesión para usarla más tarde:</p>
<p><code>
<p>
&lt;?php<br />
// Archivo pag1.php<br />
include(‘usuario.php’);<br />
session_start();<br />
$usuario = new usuario();<br />
$usuario->nombre = ‘Gregory’;<br />
$usuario->apellido = ‘House’;<br />
$_SESSION[‘usuario’] = $usuario;<br />
?&gt;
</p>
<p></code></p>
<p>Para terminar, en la siguiente página queremos desplegar el nombre de nuestro usuario:</p>
<p><code>
<p>
&lt;?php<br />
// Archivo pag2.php<br />
session_start();<br />
$usuario = $_SESSION[‘usuario’];<br />
$usuario->sayMyName();<br />
?&gt;
</p>
<p></code></p>
<p>Parece lógico no? pues si, lo es hasta que lo ejecutamos y nos encontramos con un error pidiendonos la definición de la clase en <em>pag2.php</em> lo cual hasta cierto punto tiene sentido si entendemos como funciona PHP. Como nota, la definición debe de ir incluida antes de que llamemos a <em>session_start(</em>). Lo siguiente funcionaría correctamente:</p>
<p><code>
<p>
&lt;?php<br />
// Archivo pag2.php<br />
include(‘usuario.php’);<br />
session_start();<br />
$usuario = $_SESSION[‘usuario’];<br />
$usuario->sayMyName();<br />
//salida: “Gregory House”<br />
?&gt;
</p>
<p></code></p>
<p>Simple y se resolvió con una sola linea extra de código, pero ese no era el verdadero problema, ahora viene lo interesante, que pasa cuando agregamos AJAX a la mezcla?</p>
<p><strong>El problema 2.0</strong></p>
<p>Cada que hacemos una llamada asíncrona a una página php tenemos que asumir que todos los archivos que incluimos están perdidos y que hay que llamarlos de nuevo si necesitamos usarlos&#8230;a excepción de la sesiones que se quedan almacenadas por su propia naturaleza.</p>
<p>Supongan que estamos usando el mismo código de arriba, pero ahora queremos ejecutar <em>pag2</em> desde pag1 usando AJAX, entonces nos encontramos con un obstáculo extra, y es que gracias a que la sesión ya fue definida en <em>pag1</em>, al momento de que se llama a <em>pag2</em>, <em>session_start(</em>) va a regresar un error diciendo que ya hay una sesión iniciada y que la ordén será ignorada.</p>
<p>Entonces solo eliminamos <em>session_start()</em> no? Nope por que resulta entonces que nos vamos a encontrar con otro error:</p>
<p><code>
<p>
<strong>Fatal error:</strong> Unknown: The script tried to execute a method or access a<br />
property of an incomplete object. Please ensure that the class<br />
definition CLASE of the object you are trying to operate on was<br />
loaded _before_ the session was started in Command line code on line #
</p>
<p></code></p>
<p>El problema es que aunque tenemos la sesión inicializada, la definición de la clase no existe en nuestar segunda página, e incluso si tenemos el <em>include()</em> dentro del archivo, no le sirve a PHP por que no está antes del inicio de sesión y no hay manera de ponerla en el lugar correcto por que la sesión viene desde el primer archivo.</p>
<p>Después de estar intentando con todas las ideas que me encontraba en la red como modificar el valor de <em>session_auto_start</em> en la configuración de php y otros trucos de vudú muy poco prácticos y que no sirvieron de nada, por fin encontre una forma de hacer que funcione.</p>
<p>El truco es hacer lo mismo que hace <em>session_start()</em> con las variables de sesión pero manualmente, serializar.</p>
<p>Regresando al ejemplo de arriba, vamos a modificar <em>pag1.php</em> para serializar la instancia</p>
<p><code>
<p>
&lt;?php<br />
// Archivo pag1.php<br />
include(‘usuario.php’);<br />
session_start();<br />
$usuario = new usuario();<br />
$usuario->nombre = ‘Gregory’;<br />
$usuario->apellido = ‘House’;<br />
<strong>$_SESSION[‘usuario’] = serialize($usuario);</strong><br />
?&gt;
</p>
<p></code></p>
<p>Y en <em>pag2.php</em> regresamos la variable a su forma original con <em>unserialize()</em></p>
<p><code>
<p>
&lt;?php<br />
// Archivo pag2.php<br />
<strong>$usuario = unserialize($_SESSION[‘usuario’]);</strong><br />
$usuario->sayMyName();<br />
//salida: “Gregory House”<br />
?&gt;
</p>
<p></code></p>
<p>Noten que no incluí el archivo de definición de la clase (<em>usuario.php</em>).<br />
Por alguna razón que aún no termino de entender, el include sigue sin funcionar, afortunadamente <em>unserialize()</em> es una de las funciones de PHP que permite declarar una función callback a la que llama como último recurso si está manejando un objeto y no encuentra la definición de la clase, se usa de la siguiente forma:</p>
<p><code>
<p>
&lt;?php<br />
// Archivo pag2.php<br />
<strong>ini_set('unserialize_callback_func', 'incluirClase');<br />
function incluirClase($clase) {<br />
&nbsp;&nbsp;&nbsp;	include(‘usuario.php’);<br />
}</strong><br />
$usuario = unserialize($_SESSION[‘usuario’]);<br />
$usuario->sayMyName();<br />
//salida: “Gregory House”<br />
?&gt;
</p>
<p></code></p>
<p>El parametro $clase es regresado automáticamente por PHP e incluye el nombre de la clase para la que no encontró definición.</p>
<p>Ahora si, eso resuleve todo y como este artículo ya se extendió mucho aquí lo termino. Si tienen alguna duda dejenla en los comentarios.</p>
<p><strong>Nota: </strong> El código en el artículo no está depurado asi que no intenten ejecutarlo directamente, solo tomenlo como ejemplo. </p>
]]></content:encoded>
			<wfw:commentRss>http://oscaralcala.com/como-manejar-objetos-y-sesiones-de-php-cuando-se-usa-ajax/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

