<?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>Adrián Navarro &#187; programacion</title>
	<atom:link href="http://adrian.navarro.at/blog/tag/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://adrian.navarro.at/blog</link>
	<description>Esperando a que alguien me parta las piernas desde 1994</description>
	<lastBuildDate>Sat, 03 Apr 2010 10:48:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Objetos maestros en PHP</title>
		<link>http://adrian.navarro.at/blog/2009/08/16/objetos-maestros-en-php/</link>
		<comments>http://adrian.navarro.at/blog/2009/08/16/objetos-maestros-en-php/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 17:00:20 +0000</pubDate>
		<dc:creator>Adrián</dc:creator>
				<category><![CDATA[Enredando]]></category>
		<category><![CDATA[Infinitos monos aporreando infinitos teclados]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[objetos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://adrian.navarro.at/blog/?p=194</guid>
		<description><![CDATA[Ya comenté el tema de usar clases &#8220;principales&#8221; para un proyecto&#8230; y ahora vuelvo con el mismo tema. Muy creativo, sí&#8230;
La idea es la de tener un objeto principal (maestro) con un constructor que crea dentro del propio objeto tantos objetos &#8220;internos&#8221; como hagan falta, pasándole por referencia su propio objeto al constuctor de los [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adrian.navarro.at/blog/2009/02/07/php-estirar-el-objeto/">Ya comenté el tema</a> de usar clases &#8220;principales&#8221; para un proyecto&#8230; y ahora vuelvo con el mismo tema. Muy creativo, sí&#8230;</p>
<p>La idea es la de tener un objeto principal (<em>maestro</em>) con un constructor que crea dentro del propio objeto tantos objetos &#8220;internos&#8221; como hagan falta, pasándole por referencia su propio objeto al constuctor de los &#8220;objetos internos&#8221;.</p>
<p>Los &#8220;objetos internos&#8221; extienden a una plantilla de objeto, y esa plantilla contiene un constructor que a su vez &#8220;guarda&#8221; como referencia el parámetro pasado por el objeto principal.</p>
<p>Sí, es un lío, así que mejor verlo en código:<br />
<blockquote><code>class AppObjectSkel {<br />
&nbsp;&nbsp;function __construct(&#038;$parent) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;$this->_parent = $parent;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(is_callable(array($this, 'init'))) $this->init();<br />
&nbsp;&nbsp;}<br />
}</p>
<p>class AppDatabase extends AppObjectSkel {<br />
&nbsp;&nbsp;function init() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* Aquí se inicializa la DB */<br />
&nbsp;&nbsp;}<br />
}</p>
<p>class AppCache extends AppObjectSkel {<br />
&nbsp;&nbsp;/* Elemento de cache, no lo inicializamos en este ejemplo */<br />
}</p>
<p>class Application {<br />
&nbsp;&nbsp;function __construct() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;$this->database = new AppDatabase($this);<br />
&nbsp;&nbsp;&nbsp;&nbsp;$this->cache = new AppCache($this);<br />
&nbsp;&nbsp;}<br />
}</code></p></blockquote>
<p>De esta manera se puede acceder de un elemento a otro. Por ejemplo, desde <code>AppCache</code> se puede acceder a <code>AppDatabase</code> pasando por <code>Application</code>, simplemente usando <code>$this->_parent->database</code>. Al tratarse de un valor pasado por referencia, se puede acceder desde <code>AppDatabase</code> a <code>AppCache</code> y reflejar cambios en tiempo real.</p>
<p>Pero hay que tener en cuenta un pequeño detalle: los constructores. Debido a que se hereda de una clase maestra (<code>AppObjectSkel</code>), no se puede poner constructor de ningún tipo (ya sea <code>__constructor</code> o una función con el nombre de la clase), ya que PHP ejecutará únicamente el del objeto creado (<code>AppCache</code>, por ejemplo) y no el de <code>AppObjectSkel</code> (y mucho menos va a ejecutar dos constructores). Se puede evitar esto de varias formas: evitando <code>AppObjectSkel</code> en todos los casos y copiando el construct a cada vez, copiando el construct sólo cuando lo necesitamos (por que pisamos el construct de <code>AppObjectSkel</code>) o simplemente usar una función opcional (llamada init), como pongo en el ejemplo, que sólo se ejecuta si existe y se llama desde <code>AppObjectSkel</code>, a modo de constructor (un constructor invoca a otro).</p>
<p>Desde la propia aplicación simplemente hay que crear una nueva instancia del objeto <code>Application</code> (<code>$app = new Application</code>) y acceder a los diferentes objetos a partir del maestro (<code>$app->db, $app->cache</code>).</p>
<p>Esto llega a ser muy útil cuando la aplicación entera está divida en objetos (<code>AppUsers, AppForums, AppProfiles...</code>) y es necesario hacer transacciones entre los objetos. En lugar de crear una instancia para cada objeto cada vez que se necesitan (por ejemplo, instanciar <code>AppCache</code> desde <code>AppUsers</code> cuando hace falta usar memcache), se pueden instanciar una sola vez y acceder en un <em>entorno protegido</em> (<code>Application</code>, que vendría a ser un &#8220;contenedor&#8221; relativamente protegido de variables pisadas y globales erradas), a todos los objetos o variables que haga falta.</p>
<p>Con esto después se pueden hacer montones de cambios (instanciar una clase poco usada sólo cuando se necesita, hacer una especie de <em>namespace</em> para tener un cache durante la ejecución del programa&#8230;). Y es que ahí, la imaginación es el límite.</p>
]]></content:encoded>
			<wfw:commentRss>http://adrian.navarro.at/blog/2009/08/16/objetos-maestros-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.298 seconds -->
