Zend_Loader.xml 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. <sect1 id="zend.loader.load">
  2. <title>Caricamento dinamico di file e classi</title>
  3. <para>
  4. La classe Zend_Loader include metodi per aiutare il caricamento dinamico di file.
  5. </para>
  6. <tip>
  7. <title>Zend_Loader contro require_once()</title>
  8. <para>
  9. I metodi di <code>Zend_Loader</code> sono la scelta migliore se il nome del file da caricare è variabile.
  10. Per esempio, se è basato su un parametro immesso da un utente o l'argomento di un metodo.
  11. Se si sta caricando un file o una classe dove il nome è costante, non c'è alcun beneficio nell'utilizzo di <code>Zend_Loader</code> rispetto all'uso delle funzioni PHP tradizionali come
  12. <ulink url="http://php.net/require_once"><code>require_once()</code></ulink>.
  13. </para>
  14. </tip>
  15. <sect2 id="zend.loader.load.file">
  16. <title>Caricamento di file</title>
  17. <para>
  18. Il metodo statico <code>Zend_Loader::loadFile()</code> carica un file PHP.
  19. Il file caricato può contenere qualsiasi codice PHP.
  20. Questo metodo è un wrapper per la funzione PHP
  21. <ulink url="http://php.net/include"><code>include()</code></ulink>.
  22. Genera un'eccezione <code>Zend_Exception</code> in caso di errore ad esempio se il file specificato non esiste.
  23. </para>
  24. <example id="zend.loader.load.file.example">
  25. <title>Esempio del metodo loadFile()</title>
  26. <programlisting role="php"><![CDATA[<?php
  27. Zend_Loader::loadFile($filename, $dirs=null, $once=false);]]>
  28. </programlisting>
  29. </example>
  30. <para>
  31. Il parametro <code>$filename</code> specifica il nome del file da caricare, che non deve contenere alcuna indicazione di un percorso.
  32. Un controllo di sicurezza è eseguito su <code>$filename</code>.
  33. <code>$filename</code> può contenere unicamente caratteri alfanumerici, trattini ("-"), underscore ("_") o punti (".").
  34. Nessuna di queste restrizioni è applicata al parametro <code>$dirs</code>.
  35. </para>
  36. <para>
  37. Il parametro <code>$dirs</code> specifica le cartelle nelle quali cercare il file.
  38. Se <code>NULL</code>, la ricerca è eseguita solo nei percorsi contenuti in <code>include_path</code>.
  39. Se una stringa o un array, la ricerca è eseguita nella cartella o nelle cartelle specificate, quindi in <code>include_path</code>.
  40. </para>
  41. <para>
  42. Il parametro <code>$once</code> è un booleano.
  43. Se <code>TRUE</code>, <code>Zend_Loader::loadFile()</code> utilizza la funzione PHP
  44. <ulink url="http://php.net/include"><code>include_once()</code></ulink>
  45. per caricare il file, altrimenti è utilizzata la funzione PHP
  46. <ulink url="http://php.net/include_once"><code>include()</code></ulink>.
  47. </para>
  48. </sect2>
  49. <sect2 id="zend.loader.load.class">
  50. <title>Caricamento di classi</title>
  51. <para>
  52. Il metodo statico <code>Zend_Loader::loadClass($class, $dirs)</code> carica un file PHP ed esegue un controllo sull'esistenza della classe.
  53. </para>
  54. <example id="zend.loader.load.class.example">
  55. <title>Esempio del metodo loadClass()</title>
  56. <programlisting role="php"><![CDATA[<?php
  57. Zend_Loader::loadClass('Container_Tree',
  58. array(
  59. '/home/production/mylib',
  60. '/home/production/myapp'
  61. )
  62. );]]>
  63. </programlisting>
  64. </example>
  65. <para>
  66. La stringa che specifica la classe è convertita in un percorso relativo sostituendo i separatori di cartella ai caratteri di underscore ("_") ed appendendo l'estensione '.php'.
  67. Nell'esempio precedente 'Container_Tree' diventa 'Container\\Tree.php'.
  68. </para>
  69. <para>
  70. Se <code>$dirs</code> è una stringa o un array, <code>Zend_Loader::loadClass()</code> esegue la ricerca nelle cartelle nell'ordine indicato.
  71. Il primo file trovato viene caricato.
  72. Se il file non esiste in <code>$dirs</code> allora la ricerca è eseguita in <code>include_path</code>.
  73. </para>
  74. <para>
  75. Se il file non è trovato o la classe non esiste dopo il caricamento, <code>Zend_Loader::loadClass()</code> genera un'eccezione <code>Zend_Exception</code>.
  76. </para>
  77. <para>
  78. Il metodo <code>Zend_Loader::loadFile()</code> è utilizzato per il caricamento del file, dunque il nome della classe può contenere solo caratteri alfanumerici, trattini ("-"), underscore ("_") o punti (".").
  79. </para>
  80. </sect2>
  81. <sect2 id="zend.loader.load.isreadable">
  82. <title>Verifica del permesso di lettura di un file</title>
  83. <para>
  84. Il metodo statico <code>Zend_Loader::isReadable($pathname)</code> restituisce <code>TRUE</code> se il file al percorso specificato esiste ed è leggibile, altrimenti <code>FALSE</code>.
  85. </para>
  86. <example id="zend.loader.load.isreadable.example">
  87. <title>Esempio del metodo isReadable()</title>
  88. <programlisting role="php"><![CDATA[<?php
  89. if (Zend_Loader::isReadable($filename)) {
  90. // fai qualcosa con $filename
  91. }]]>
  92. </programlisting>
  93. </example>
  94. <para>
  95. Il parametro <code>$filename</code> specifica il nome del file da verificare.
  96. Può contenere l'indicazione di un percorso.
  97. Questo metodo è un wrapper per la funzione PHP
  98. <ulink url="http://php.net/is_readable"><code>is_readable()</code></ulink>.
  99. La funzione PHP non esegue la ricerca nelle cartelle indicate da <code>include_path</code>,
  100. contrariamente a <code>Zend_Loader::isReadable()</code>.
  101. </para>
  102. </sect2>
  103. <sect2 id="zend.loader.load.autoload">
  104. <title>Utilizzo dell'autoloader</title>
  105. <para>
  106. La classe <code>Zend_Loader</code> contiene un metodo che è possibile registrare nella libreria PHP SPL autoloader.
  107. <code>Zend_Loader::autoload()</code> è il metodo di callback.
  108. Per comodità, <code>Zend_Loader</code> fornisce la funzione <code>registerAutoload()</code> per registrare automaticamente il proprio metodo <code>autoload()</code>.
  109. Se l'estensione <code>spl_autoload</code> non è presente nell'ambiente PHP, il metodo <code>registerAutoload()</code> genera un'eccezione <code>Zend_Exception</code>.
  110. </para>
  111. <example id="zend.loader.load.autoload.example">
  112. <title>Esempio di registrazione del metodo di callback autoloader</title>
  113. <programlisting role="php"><![CDATA[<?php
  114. Zend_Loader::registerAutoload();]]>
  115. </programlisting>
  116. </example>
  117. <para>
  118. Dopo aver registrato il metodo di callback autoload del Framework Zend, è possibile referenziare le classi del framework senza la necessità di caricarle esplicitamente.
  119. Il metodo <code>autoload()</code> utilizza <code>Zend_Loader::loadClass()</code> in automatico ogni volta che una classe è referenziata.
  120. </para>
  121. <para>
  122. Se si estende la classe <code>Zend_Loader</code> è possibile passare un parametro opzionale al metodo <code>registerAutoload()</code> per specificare la classe dalla quale registrare il metodo <code>autoload()</code>.
  123. </para>
  124. <example id="zend.loader.load.autoload.example-extended">
  125. <title>Esempio di registrazione del metodo di callback autoloader di una classe estesa</title>
  126. <para>
  127. A causa della semantica del referenziamento delle classi statiche in PHP, è necessario implementare il codice per entrambi i metodi <code>loadClass()</code> ed <code>autoload()</code>, ed il metodo <code>autoload()</code> deve chiamare <code>self::loadClass()</code>.
  128. Se il proprio metodo <code>autoload()</code> delega al metodo genitore la chiamata a <code>self::loadClass()</code>, allora chiama il metodo con lo stesso nome nella classe genitore, non nella sottoclasse.
  129. </para>
  130. <programlisting role="php"><![CDATA[<?php
  131. class Mio_Loader extends Zend_Loader
  132. {
  133. public static function loadClass($class, $dirs = null)
  134. {
  135. parent::loadClass($class, $dirs);
  136. }
  137. public static function autoload($class)
  138. {
  139. try {
  140. self::loadClass($class);
  141. return $class;
  142. } catch (Exception $e) {
  143. return false;
  144. }
  145. }
  146. }
  147. Zend_Loader::registerAutoload('Mio_Loader');]]>
  148. </programlisting>
  149. </example>
  150. <para>
  151. E' possibile rimuovere un autoload callback.
  152. Il metodo <code>registerAutoload()</code> ha un secondo parametro opzionale, che corrisponde a <code>TRUE</code> per impostazione predefinita.
  153. Se il parametro ha valore <code>FALSE</code> allora il callback è rimosso dalla pila degli autoload SPL al posto di essere registrato.
  154. </para>
  155. </sect2>
  156. </sect1>
  157. <!--
  158. vim:se ts=4 sw=4 et:
  159. -->