Zend_CodeGenerator-Examples.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.codegenerator.examples">
  5. <title>Zend_CodeGenerator Beispiele</title>
  6. <example id="zend.codegenerator.examples.class">
  7. <title>Erzeugung von PHP Klassen</title>
  8. <para>
  9. Das folgende Beispiel erzeugt eine leere Klasse mit einem Klassen-level DocBlock.
  10. </para>
  11. <programlisting language="php"><![CDATA[
  12. $foo = new Zend_CodeGenerator_Php_Class();
  13. $docblock = new Zend_CodeGenerator_Php_Docblock(array(
  14. 'shortDescription' => 'Beispiel einer erzeugten Klasse',
  15. 'longDescription' => 'Das ist eine mit Zend_CodeGenerator '
  16. . 'erzeugte Klasse.',
  17. 'tags' => array(
  18. array(
  19. 'name' => 'version',
  20. 'description' => '$Rev:$',
  21. ),
  22. array(
  23. 'name' => 'license',
  24. 'description' => 'New BSD',
  25. ),
  26. ),
  27. ));
  28. $foo->setName('Foo')
  29. ->setDocblock($docblock);
  30. echo $foo->generate();
  31. ]]></programlisting>
  32. <para>
  33. Der obige Code führt zu dem folgenden:
  34. </para>
  35. <programlisting language="php"><![CDATA[
  36. /**
  37. * Beispiel einer erzeugten Klasse
  38. *
  39. * Das ist eine mit Zend_CodeGenerator erzeugte Klasse.
  40. *
  41. * @version $Rev:$
  42. * @license New BSD
  43. *
  44. */
  45. class Foo
  46. {
  47. }
  48. ]]></programlisting>
  49. </example>
  50. <example id="zend.codegenerator.examples.class-properties">
  51. <title>Erzeugung von PHP Klassen mit Klassen-Eigenschaften</title>
  52. <para>
  53. Aufbauend auf dem vorherigen Beispiel, fügen wir jetzt Eigenschaften in unsere erzeugte
  54. Klasse ein.
  55. </para>
  56. <programlisting language="php"><![CDATA[
  57. $foo = new Zend_CodeGenerator_Php_Class();
  58. $docblock = new Zend_CodeGenerator_Php_Docblock(array(
  59. 'shortDescription' => 'Beispiel einer erzeugten Klasse',
  60. 'longDescription' => 'Das ist eine mit Zend_CodeGenerator '
  61. . 'erzeugte Klasse.',
  62. 'tags' => array(
  63. array(
  64. 'name' => 'version',
  65. 'description' => '$Rev:$',
  66. ),
  67. array(
  68. 'name' => 'license',
  69. 'description' => 'New BSD',
  70. ),
  71. ),
  72. ));
  73. $foo->setName('Foo')
  74. ->setDocblock($docblock)
  75. ->setProperties(array(
  76. array(
  77. 'name' => '_bar',
  78. 'visibility' => 'protected',
  79. 'defaultValue' => 'baz',
  80. ),
  81. array(
  82. 'name' => 'baz',
  83. 'visibility' => 'public',
  84. 'defaultValue' => 'bat',
  85. ),
  86. array(
  87. 'name' => 'bat',
  88. 'const' => true,
  89. 'defaultValue' => 'foobarbazbat',
  90. ),
  91. ));
  92. echo $foo->generate();
  93. ]]></programlisting>
  94. <para>
  95. Das obige führt zu der folgenden Klassen-Definition:
  96. </para>
  97. <programlisting language="php"><![CDATA[
  98. /**
  99. * Beispiel einer erzeugten Klasse
  100. *
  101. * Das ist eine mit Zend_CodeGenerator erzeugte Klasse.
  102. *
  103. * @version $Rev:$
  104. * @license New BSD
  105. *
  106. */
  107. class Foo
  108. {
  109. protected $_bar = 'baz';
  110. public $baz = 'bat';
  111. const bat = 'foobarbazbat';
  112. }
  113. ]]></programlisting>
  114. </example>
  115. <example id="zend.codegenerator.examples.class-methods">
  116. <title>Erzeugung von PHP Klassen mit Klassen-Methoden</title>
  117. <para>
  118. <classname>Zend_CodeGenerator_Php_Class</classname> erlaubt es Methoden mit optionalem
  119. Inhalt zur Klasse hinzuzufügen. Methoden können entweder als Array oder als konkrete
  120. Instanzen von <classname>Zend_CodeGenerator_Php_Method</classname> hinzugefügt werden.
  121. </para>
  122. <programlisting language="php"><![CDATA[
  123. $foo = new Zend_CodeGenerator_Php_Class();
  124. $docblock = new Zend_CodeGenerator_Php_Docblock(array(
  125. 'shortDescription' => 'Beispiel einer erzeugten Klasse',
  126. 'longDescription' => 'Das ist eine mit Zend_CodeGenerator '
  127. . 'erzeugte Klasse.',
  128. 'tags' => array(
  129. array(
  130. 'name' => 'version',
  131. 'description' => '$Rev:$',
  132. ),
  133. array(
  134. 'name' => 'license',
  135. 'description' => 'New BSD',
  136. ),
  137. ),
  138. ));
  139. $foo->setName('Foo')
  140. ->setDocblock($docblock)
  141. ->setProperties(array(
  142. array(
  143. 'name' => '_bar',
  144. 'visibility' => 'protected',
  145. 'defaultValue' => 'baz',
  146. ),
  147. array(
  148. 'name' => 'baz',
  149. 'visibility' => 'public',
  150. 'defaultValue' => 'bat',
  151. ),
  152. array(
  153. 'name' => 'bat',
  154. 'const' => true,
  155. 'defaultValue' => 'foobarbazbat',
  156. ),
  157. ))
  158. ->setMethods(array(
  159. // Methoden als Array übergeben
  160. array(
  161. 'name' => 'setBar',
  162. 'parameters' => array(
  163. array('name' => 'bar'),
  164. ),
  165. 'body' => '$this->_bar = $bar;' . "\n" . 'return $this;',
  166. 'docblock' => new Zend_CodeGenerator_Php_Docblock(array(
  167. 'shortDescription' => 'Setzt die bar Eigenschaft',
  168. 'tags' => array(
  169. new Zend_CodeGenerator_Php_Docblock_Tag_Param(array(
  170. 'paramName' => 'bar',
  171. 'datatype' => 'string'
  172. )),
  173. new Zend_CodeGenerator_Php_Docblock_Tag_Return(array(
  174. 'datatype' => 'string',
  175. )),
  176. ),
  177. )),
  178. ),
  179. // Methoden als konkrete Instanz übergeben
  180. new Zend_CodeGenerator_Php_Method(array(
  181. 'name' => 'getBar',
  182. 'body' => 'return $this->_bar;',
  183. 'docblock' => new Zend_CodeGenerator_Php_Docblock(array(
  184. 'shortDescription' => 'Empfängt die bar Eigenschaft',
  185. 'tags' => array(
  186. new Zend_CodeGenerator_Php_Docblock_Tag_Return(array(
  187. 'datatype' => 'string|null',
  188. )),
  189. ),
  190. )),
  191. )),
  192. ));
  193. echo $foo->generate();
  194. ]]></programlisting>
  195. <para>
  196. Das obige erzeugt die folgende Ausgabe:
  197. </para>
  198. <programlisting language="php"><![CDATA[
  199. /**
  200. * Beispiel einer erzeugten Klasse
  201. *
  202. * Das ist eine mit Zend_CodeGenerator erzeugte Klasse.
  203. *
  204. * @version $Rev:$
  205. * @license New BSD
  206. */
  207. class Foo
  208. {
  209. protected $_bar = 'baz';
  210. public $baz = 'bat';
  211. const bat = 'foobarbazbat';
  212. /**
  213. * Setzt die bar Eigenschaft
  214. *
  215. * @param string bar
  216. * @return string
  217. */
  218. public function setBar($bar)
  219. {
  220. $this->_bar = $bar;
  221. return $this;
  222. }
  223. /**
  224. * Empfängt die bar Eigenschaft
  225. *
  226. * @return string|null
  227. */
  228. public function getBar()
  229. {
  230. return $this->_bar;
  231. }
  232. }
  233. ]]></programlisting>
  234. </example>
  235. <example id="zend.codegenerator.examples.file">
  236. <title>Erzeugung von PHP Dateien</title>
  237. <para>
  238. <classname>Zend_CodeGenerator_Php_File</classname> kann verwendet werden um den Inhalt
  239. einer <acronym>PHP</acronym> Datei zu erzeugen. Man kann Klassen inkludieren als auch
  240. eigene Inhalte. Wenn Klassen angegängt werden sollte man entweder eine konkrete Instanz
  241. von <classname>Zend_CodeGenerator_Php_Class</classname> oder ein Array das die Klasse
  242. definiert anhängen.
  243. </para>
  244. <para>
  245. Das folgende Beispiel nimmt an das wir <varname>$foo</varname> mit einer der
  246. Klassen-Definitionen der vorherigen Beispiele definiert haben.
  247. </para>
  248. <programlisting language="php"><![CDATA[
  249. $file = new Zend_CodeGenerator_Php_File(array(
  250. 'classes' => array($foo);
  251. 'docblock' => new Zend_CodeGenerator_Php_Docblock(array(
  252. 'shortDescription' => 'Foo Klassen Datei',
  253. 'tags' => array(
  254. array(
  255. 'name' => 'license',
  256. 'description' => 'New BSD',
  257. ),
  258. ),
  259. )),
  260. 'body' => 'define(\'APPLICATION_ENV\', \'testing\');',
  261. ));
  262. ]]></programlisting>
  263. <para>
  264. Der Aufruf von <methodname>generate()</methodname> erzeugt den Code -- schreibt Ihn
  265. aber nicht in die Datei. Man muß den Inhalt holen und Ihn selbst in eine Datei
  266. schreiben. Als Beispiel:
  267. </para>
  268. <programlisting language="php"><![CDATA[
  269. $code = $file->generate();
  270. file_put_contents('Foo.php', $code);
  271. ]]></programlisting>
  272. <para>
  273. Das obige erzeugt die folgende Datei:
  274. </para>
  275. <programlisting language="php"><![CDATA[
  276. <?php
  277. /**
  278. * Foo Klassen Datei
  279. *
  280. * @license New BSD
  281. */
  282. /**
  283. * Beispiel einer erzeugten Klasse
  284. *
  285. * Das ist eine mit Zend_CodeGenerator erzeugte Klasse.
  286. *
  287. * @version $Rev:$
  288. * @license New BSD
  289. */
  290. class Foo
  291. {
  292. protected $_bar = 'baz';
  293. public $baz = 'bat';
  294. const bat = 'foobarbazbat';
  295. /**
  296. * Set the bar property
  297. *
  298. * @param string bar
  299. * @return string
  300. */
  301. public function setBar($bar)
  302. {
  303. $this->_bar = $bar;
  304. return $this;
  305. }
  306. /**
  307. * Retrieve the bar property
  308. *
  309. * @return string|null
  310. */
  311. public function getBar()
  312. {
  313. return $this->_bar;
  314. }
  315. }
  316. define('APPLICATION_ENV', 'testing');
  317. ]]></programlisting>
  318. </example>
  319. <example id="zend.codegenerator.examples.reflection-file">
  320. <title>Sähen der Code Erzeugung einer PHP Datei über Reflection</title>
  321. <para>
  322. Man kann <acronym>PHP</acronym> Code zu einer existierenden <acronym>PHP</acronym>
  323. Datei hinzufügen indem der Code Generator verwendet wird. Um das Durchzuführen muß man
  324. auf diesem zuerst Reflection ausführen. Die statische Methode
  325. <methodname>fromReflectedFileName()</methodname> erlaubt es das zu tun.
  326. </para>
  327. <programlisting language="php"><![CDATA[
  328. $generator = Zend_CodeGenerator_Php_File::fromReflectedFileName($path);
  329. $body = $generator->getBody();
  330. $body .= "\n\$foo->bar();";
  331. file_put_contents($path, $generator->generate());
  332. ]]></programlisting>
  333. </example>
  334. <example id="zend.codegenerator.examples.reflection-class">
  335. <title>Sähen der Erzeugung einer PHP Klasse über Reflection</title>
  336. <para>
  337. Man kann Code zu einer bestehenden Klasse hinzufügen. Um das Durchzuführen muß die
  338. statische <methodname>fromReflection()</methodname> Methode verwendet werden um die
  339. Klasse in ein Generator Objekt zu mappen. Von dort, kann man zusätzliche Eigenschaften
  340. oder Methoden hinzufügen und die Klasse neu erstellen.
  341. </para>
  342. <programlisting language="php"><![CDATA[
  343. $generator = Zend_CodeGenerator_Php_Class::fromReflection(
  344. new Zend_Reflection_Class($class)
  345. );
  346. $generator->setMethod(array(
  347. 'name' => 'setBaz',
  348. 'parameters' => array(
  349. array('name' => 'baz'),
  350. ),
  351. 'body' => '$this->_baz = $baz;' . "\n" . 'return $this;',
  352. 'docblock' => new Zend_CodeGenerator_Php_Docblock(array(
  353. 'shortDescription' => 'Die baz Eigenschaft setzen',
  354. 'tags' => array(
  355. new Zend_CodeGenerator_Php_Docblock_Tag_Param(array(
  356. 'paramName' => 'baz',
  357. 'datatype' => 'string'
  358. )),
  359. new Zend_CodeGenerator_Php_Docblock_Tag_Return(array(
  360. 'datatype' => 'string',
  361. )),
  362. ),
  363. )),
  364. ));
  365. $code = $generator->generate();
  366. ]]></programlisting>
  367. </example>
  368. </sect1>