<?xml version="1.0"?>
     <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
     <channel>
      <link>http://www.bitacora.gesbit.com/</link>
      <title>Bitácora de Gesbit - Entrada "La función "autoload" en Gesbit" de la bitácora</title>
      <generator>Gesbit</generator>
      <description>Bitácora del gestor de bitácoras Gesbit</description>
      <atom:link href="http://www.bitacora.gesbit.com/rss/" rel="self"
       type="application/rss+xml" />
    
      <item>
       <link>http://www.bitacora.gesbit.com/la-funcion-autoload-en-gesbit/</link>
       <guid>http://www.bitacora.gesbit.com/la-funcion-autoload-en-gesbit/</guid>
       <pubDate>Fri, 18 Jan 2008 02:38:00 +0100</pubDate>
       <title><![CDATA[ La función "autoload" en Gesbit ]]></title>
       <description><![CDATA[<p>
Uno de los beneficios de requerir <a href="http://www.php.net/" title="PHP.net">PHP 5</a> en Gesbit es que se hace uso de la función "mágica" <a href="http://es2.php.net/autoload" title="Más información en PHP.net">"autoload()"</a>, que, como sabes, permite a PHP "requerir" las clases necesarias según estas se necesitan, sin necesidad de requerirlas una a una por nuestra cuenta y riesgo, como se hace en PHP 4.
</p>
<p>
Además dicha función da más juego, porque, al dejarnos requerir en el cuerpo de la función un "script" (el de la clase que se precisa) podemos hacer otras cosas además. En Gesbit, por ejemplo, la clase "Input" definida en "input.class.php", se apoya en otro "script" "input.const.php", que es requerido en la propia función "autoload()".
</p>
<p>
Sin embargo me planteo cambios en Gesbit para evitar algo que empieza a preocuparme. Las clases de Gesbit se guardan todas en "/gb-auxiliar/classes/", las que pertenecen a Gesbit, por decirlo así, porque las clases de terceros, se guardan en subdirectorios del directorio "classes".
</p>
<p>
Esto hace que la función "autoload()" de Gesbit quede tal que así en el archivo "/gb-auxiliar/requires/gb-autoload.php":
</p><div class="gbhighlighcode"><div class="sourcecode"><pre class="php"><span style="color: #000000; font-weight: bold;">function</span> __autoload<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$className</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
  <span style="color: #0000ff;">$className</span> = <a href="http://www.php.net/strtolower"><span style="color: #000066;">strtolower</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$className</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #0000ff;">$classFile</span> = <span style="color: #0000ff;">$className</span>.GB_AUTOLOAD_CLASS_EXT;
  <span style="color: #0000ff;">$constFile</span> = <span style="color: #0000ff;">$className</span>.GB_AUTOLOAD_CONST_EXT;
  <span style="color: #808080; font-style: italic;">// Test if the class is a Gesbit main class</span>
  <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/file_exists"><span style="color: #000066;">file_exists</span></a><span style="color: #66cc66;">&#40;</span>GB_CLASSES_DIR.<span style="color: #0000ff;">$classFile</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>    
    <span style="color: #b1b100;">require</span><span style="color: #66cc66;">&#40;</span>GB_CLASSES_DIR.<span style="color: #0000ff;">$classFile</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #808080; font-style: italic;">// Find a possible &quot;class constants&quot; file</span>
    <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/file_exists"><span style="color: #000066;">file_exists</span></a><span style="color: #66cc66;">&#40;</span>GB_CLASSES_DIR.<span style="color: #0000ff;">$constFile</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">require</span><span style="color: #66cc66;">&#40;</span>GB_CLASSES_DIR.<span style="color: #0000ff;">$constFile</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #808080; font-style: italic;">// Maybe is a KSes class</span>
  <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">elseif</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/file_exists"><span style="color: #000066;">file_exists</span></a><span style="color: #66cc66;">&#40;</span>GB_KSES_DIR.<span style="color: #0000ff;">$classFile</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">require</span><span style="color: #66cc66;">&#40;</span>GB_KSES_DIR.<span style="color: #0000ff;">$classFile</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #808080; font-style: italic;">// Maybe a PHPASS class</span>
  <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">elseif</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/file_exists"><span style="color: #000066;">file_exists</span></a><span style="color: #66cc66;">&#40;</span>GB_PHPASS_DIR.<span style="color: #0000ff;">$classFile</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">require</span><span style="color: #66cc66;">&#40;</span>GB_PHPASS_DIR.<span style="color: #0000ff;">$classFile</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #808080; font-style: italic;">// Maybe a Snoopy class</span>
  <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">elseif</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/file_exists"><span style="color: #000066;">file_exists</span></a><span style="color: #66cc66;">&#40;</span>GB_SNOOPY_DIR.<span style="color: #0000ff;">$classFile</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">require</span><span style="color: #66cc66;">&#40;</span>GB_SNOOPY_DIR.<span style="color: #0000ff;">$classFile</span><span style="color: #66cc66;">&#41;</span>;        
  <span style="color: #808080; font-style: italic;">// Maybe a PHP Gettext class</span>
  <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">elseif</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/file_exists"><span style="color: #000066;">file_exists</span></a><span style="color: #66cc66;">&#40;</span>GB_PHPGETTEXT_DIR.<span style="color: #0000ff;">$classFile</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">require</span><span style="color: #66cc66;">&#40;</span>GB_PHPGETTEXT_DIR.<span style="color: #0000ff;">$classFile</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>
<p>
Como ves se comprueba la existencia de la clase requerida en el directorio de clases de Gesbit. Si existe ahí la clase requerida, se busca su "script" de "constantes", y, si existe se requiere también. En otros casos se busca la clase requerida dentro de los subdirectorios de las clases de terceros.
</p>
<p>
Ahora bien, si se añaden más clases de terceros, más subdirectorios en el directorio de clases, el cuerpo de la función "autoload" tendrá que crecer, mientras que, y este es el cambio que estoy considerando, si todas las clases se guardan en el directorio de clases, la función "autoload" podría quedar así "para siempre":
</p><div class="gbhighlighcode"><div class="sourcecode"><pre class="php"><span style="color: #000000; font-weight: bold;">function</span> __autoload<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$className</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
  <span style="color: #0000ff;">$className</span> = <a href="http://www.php.net/strtolower"><span style="color: #000066;">strtolower</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$className</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #0000ff;">$classFile</span> = <span style="color: #0000ff;">$className</span>.GB_AUTOLOAD_CLASS_EXT;
  <span style="color: #0000ff;">$constFile</span> = <span style="color: #0000ff;">$className</span>.GB_AUTOLOAD_CONST_EXT;
  <span style="color: #808080; font-style: italic;">// Test if the class is a Gesbit main class</span>
  <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/file_exists"><span style="color: #000066;">file_exists</span></a><span style="color: #66cc66;">&#40;</span>GB_CLASSES_DIR.<span style="color: #0000ff;">$classFile</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>    
    <span style="color: #b1b100;">require</span><span style="color: #66cc66;">&#40;</span>GB_CLASSES_DIR.<span style="color: #0000ff;">$classFile</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #808080; font-style: italic;">// Find a possible &quot;class constants&quot; file</span>
    <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/file_exists"><span style="color: #000066;">file_exists</span></a><span style="color: #66cc66;">&#40;</span>GB_CLASSES_DIR.<span style="color: #0000ff;">$constFile</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">require</span><span style="color: #66cc66;">&#40;</span>GB_CLASSES_DIR.<span style="color: #0000ff;">$constFile</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>
<p>
Ahora bien, si así parece mejor, ¿dónde está mi duda entonces? Pues que en mantener las clases de terceros separadas del resto no parece una mala idea. Hay clases de terceros que son en realidad una sola clase, pero, hay otras, que cuentan con varias. Creo que mezclar todas las clases en un solo directorio no es tan "limpio" como si se separan en subdirectorios.
</p>
<p>
Y, sin embargo, ahí está el problema: si se ve bien dejar el asunto como está, la función "autoload" crecerá irremediablemente, según se añadan clases de terceros en Gesbit. Y también será preciso definir nuevas constantes. En definitiva, un trabajo extra y que al cabo puede llegar a contar con una función "autoload" de dos mil líneas.
</p>
<p>
Pues en esas estamos. Lo mismo ocurre con los "script" JavaScript. Estos se guardan en el directorio "/gb-auxiliar/jscripts/", y los "scripts" de terceros se guardan en subdirectorios de este directorio. Si bien aquí no hay función "autoload" de por medio: cuando se precisa un "script" se requiere allí donde está, sin más, no se da el "problema" descrito arriba.
</p>
<p>
En fin, ya veremos en qué queda esto. Si se te ocurre alguna idea y quieres hacérmela saber, que sepas que te la agradezco de antemano, que será bienvenida, en todo caso. Lo que más me retiene de hacer los cambios necesarios es que puede haber clases de terceros que sean más bien completas "librerías", y que estas estén en sus propios directorio no me parece mal.
</p>
<p>
Mira, por ahí pueden ir los tiros: discriminar las clases que verdaderamente se merezcan un subdirectorio (porque usen otros "scripts" propios, por ejemplo) y no solamente en función de si son de terceros o no lo son.
</p>]]></description>
      </item>
      
     </channel>
    </rss>