<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.codegenerator.examples">
    <title>Zend_CodeGenerator Beispiele</title>

    <example id="zend.codegenerator.examples.class">
        <title>Erzeugung von PHP Klassen</title>

        <para>
            Das folgende Beispiel erzeugt eine leere Klasse mit einem Klassen-level DocBlock.
        </para>

        <programlisting language="php"><![CDATA[
$foo      = new Zend_CodeGenerator_Php_Class();
$docblock = new Zend_CodeGenerator_Php_Docblock(array(
    'shortDescription' => 'Beispiel einer erzeugten Klasse',
    'longDescription'  => 'Das ist eine mit Zend_CodeGenerator '
                        . 'erzeugte Klasse.',
    'tags'             => array(
        array(
            'name'        => 'version',
            'description' => '$Rev:$',
        ),
        array(
            'name'        => 'license',
            'description' => 'New BSD',
        ),
    ),
));
$foo->setName('Foo')
    ->setDocblock($docblock);
echo $foo->generate();
]]></programlisting>

        <para>
            Der obige Code führt zu dem folgenden:
        </para>

        <programlisting language="php"><![CDATA[
/**
 * Beispiel einer erzeugten Klasse
 *
 * Das ist eine mit Zend_CodeGenerator erzeugte Klasse.
 *
 * @version $Rev:$
 * @license New BSD
 *
 */
class Foo
{

}
]]></programlisting>
    </example>

    <example id="zend.codegenerator.examples.class-properties">
        <title>Erzeugung von PHP Klassen mit Klassen-Eigenschaften</title>

        <para>
            Aufbauend auf dem vorherigen Beispiel, fügen wir jetzt Eigenschaften in unsere erzeugte
            Klasse ein.
        </para>

        <programlisting language="php"><![CDATA[
$foo      = new Zend_CodeGenerator_Php_Class();
$docblock = new Zend_CodeGenerator_Php_Docblock(array(
    'shortDescription' => 'Beispiel einer erzeugten Klasse',
    'longDescription'  => 'Das ist eine mit Zend_CodeGenerator '
                        . 'erzeugte Klasse.',
    'tags'             => array(
        array(
            'name'        => 'version',
            'description' => '$Rev:$',
        ),
        array(
            'name'        => 'license',
            'description' => 'New BSD',
        ),
    ),
));
$foo->setName('Foo')
    ->setDocblock($docblock)
    ->setProperties(array(
        array(
            'name'         => '_bar',
            'visibility'   => 'protected',
            'defaultValue' => 'baz',
        ),
        array(
            'name'         => 'baz',
            'visibility'   => 'public',
            'defaultValue' => 'bat',
        ),
        array(
            'name'         => 'bat',
            'const'        => true,
            'defaultValue' => 'foobarbazbat',
        ),
    ));
echo $foo->generate();
]]></programlisting>

        <para>
            Das obige führt zu der folgenden Klassen-Definition:
        </para>

        <programlisting language="php"><![CDATA[
/**
 * Beispiel einer erzeugten Klasse
 *
 * Das ist eine mit Zend_CodeGenerator erzeugte Klasse.
 *
 * @version $Rev:$
 * @license New BSD
 *
 */
class Foo
{

    protected $_bar = 'baz';

    public $baz = 'bat';

    const bat = 'foobarbazbat';

}
]]></programlisting>
    </example>

    <example id="zend.codegenerator.examples.class-methods">
        <title>Erzeugung von PHP Klassen mit Klassen-Methoden</title>

        <para>
            <classname>Zend_CodeGenerator_Php_Class</classname> erlaubt es Methoden mit optionalem
            Inhalt zur Klasse hinzuzufügen. Methoden können entweder als Array oder als konkrete
            Instanzen von <classname>Zend_CodeGenerator_Php_Method</classname> hinzugefügt werden.
        </para>

        <programlisting language="php"><![CDATA[
$foo      = new Zend_CodeGenerator_Php_Class();
$docblock = new Zend_CodeGenerator_Php_Docblock(array(
    'shortDescription' => 'Beispiel einer erzeugten Klasse',
    'longDescription'  => 'Das ist eine mit Zend_CodeGenerator '
                        . 'erzeugte Klasse.',
    'tags'             => array(
        array(
            'name'        => 'version',
            'description' => '$Rev:$',
        ),
        array(
            'name'        => 'license',
            'description' => 'New BSD',
        ),
    ),
));
$foo->setName('Foo')
    ->setDocblock($docblock)
    ->setProperties(array(
        array(
            'name'         => '_bar',
            'visibility'   => 'protected',
            'defaultValue' => 'baz',
        ),
        array(
            'name'         => 'baz',
            'visibility'   => 'public',
            'defaultValue' => 'bat',
        ),
        array(
            'name'         => 'bat',
            'const'        => true,
            'defaultValue' => 'foobarbazbat',
        ),
    ))
    ->setMethods(array(
        // Methoden als Array übergeben
        array(
            'name'       => 'setBar',
            'parameters' => array(
                array('name' => 'bar'),
            ),
            'body'       => '$this->_bar = $bar;' . "\n" . 'return $this;',
            'docblock'   => new Zend_CodeGenerator_Php_Docblock(array(
                'shortDescription' => 'Setzt die bar Eigenschaft',
                'tags'             => array(
                    new Zend_CodeGenerator_Php_Docblock_Tag_Param(array(
                        'paramName' => 'bar',
                        'datatype'  => 'string'
                    )),
                    new Zend_CodeGenerator_Php_Docblock_Tag_Return(array(
                        'datatype'  => 'string',
                    )),
                ),
            )),
        ),
        // Methoden als konkrete Instanz übergeben
        new Zend_CodeGenerator_Php_Method(array(
            'name' => 'getBar',
            'body'       => 'return $this->_bar;',
            'docblock'   => new Zend_CodeGenerator_Php_Docblock(array(
                'shortDescription' => 'Empfängt die bar Eigenschaft',
                'tags'             => array(
                    new Zend_CodeGenerator_Php_Docblock_Tag_Return(array(
                        'datatype'  => 'string|null',
                    )),
                ),
            )),
        )),
    ));

echo $foo->generate();
]]></programlisting>

        <para>
            Das obige erzeugt die folgende Ausgabe:
        </para>

        <programlisting language="php"><![CDATA[
/**
 * Beispiel einer erzeugten Klasse
 *
 * Das ist eine mit Zend_CodeGenerator erzeugte Klasse.
 *
 * @version $Rev:$
 * @license New BSD
 */
class Foo
{

    protected $_bar = 'baz';

    public $baz = 'bat';

    const bat = 'foobarbazbat';

    /**
     * Setzt die bar Eigenschaft
     *
     * @param string bar
     * @return string
     */
    public function setBar($bar)
    {
        $this->_bar = $bar;
        return $this;
    }

    /**
     * Empfängt die bar Eigenschaft
     *
     * @return string|null
     */
    public function getBar()
    {
        return $this->_bar;
    }

}
]]></programlisting>
    </example>

    <example id="zend.codegenerator.examples.file">
        <title>Erzeugung von PHP Dateien</title>

        <para>
            <classname>Zend_CodeGenerator_Php_File</classname> kann verwendet werden um den Inhalt
            einer <acronym>PHP</acronym> Datei zu erzeugen. Man kann Klassen inkludieren als auch
            eigene Inhalte. Wenn Klassen angegängt werden sollte man entweder eine konkrete Instanz
            von <classname>Zend_CodeGenerator_Php_Class</classname> oder ein Array das die Klasse
            definiert anhängen.
        </para>

        <para>
            Das folgende Beispiel nimmt an das wir <varname>$foo</varname> mit einer der
            Klassen-Definitionen der vorherigen Beispiele definiert haben.
        </para>

        <programlisting language="php"><![CDATA[
$file = new Zend_CodeGenerator_Php_File(array(
    'classes'  => array($foo);
    'docblock' => new Zend_CodeGenerator_Php_Docblock(array(
        'shortDescription' => 'Foo Klassen Datei',
        'tags'             => array(
            array(
                'name'        => 'license',
                'description' => 'New BSD',
            ),
        ),
    )),
    'body'     => 'define(\'APPLICATION_ENV\', \'testing\');',
));
]]></programlisting>

        <para>
            Der Aufruf von <methodname>generate()</methodname> erzeugt den Code -- schreibt Ihn
            aber nicht in die Datei. Man muß den Inhalt holen und Ihn selbst in eine Datei
            schreiben. Als Beispiel:
        </para>

        <programlisting language="php"><![CDATA[
$code = $file->generate();
file_put_contents('Foo.php', $code);
]]></programlisting>

        <para>
            Das obige erzeugt die folgende Datei:
        </para>

        <programlisting language="php"><![CDATA[
<?php
/**
 * Foo Klassen Datei
 *
 * @license New BSD
 */

/**
 * Beispiel einer erzeugten Klasse
 *
 * Das ist eine mit Zend_CodeGenerator erzeugte Klasse.
 *
 * @version $Rev:$
 * @license New BSD
 */
class Foo
{

    protected $_bar = 'baz';

    public $baz = 'bat';

    const bat = 'foobarbazbat';

    /**
     * Set the bar property
     *
     * @param string bar
     * @return string
     */
    public function setBar($bar)
    {
        $this->_bar = $bar;
        return $this;
    }

    /**
     * Retrieve the bar property
     *
     * @return string|null
     */
    public function getBar()
    {
        return $this->_bar;
    }

}

define('APPLICATION_ENV', 'testing');
]]></programlisting>
    </example>

    <example id="zend.codegenerator.examples.reflection-file">
        <title>Sähen der Code Erzeugung einer PHP Datei über Reflection</title>

        <para>
            Man kann <acronym>PHP</acronym> Code zu einer existierenden <acronym>PHP</acronym>
            Datei hinzufügen indem der Code Generator verwendet wird. Um das Durchzuführen muß man
            auf diesem zuerst Reflection ausführen. Die statische Methode
            <methodname>fromReflectedFileName()</methodname> erlaubt es das zu tun.
        </para>

        <programlisting language="php"><![CDATA[
$generator = Zend_CodeGenerator_Php_File::fromReflectedFileName($path);
$body = $generator->getBody();
$body .= "\n\$foo->bar();";
file_put_contents($path, $generator->generate());
]]></programlisting>
    </example>

    <example id="zend.codegenerator.examples.reflection-class">
        <title>Sähen der Erzeugung einer PHP Klasse über Reflection</title>

        <para>
            Man kann Code zu einer bestehenden Klasse hinzufügen. Um das Durchzuführen muß die
            statische <methodname>fromReflection()</methodname> Methode verwendet werden um die
            Klasse in ein Generator Objekt zu mappen. Von dort, kann man zusätzliche Eigenschaften
            oder Methoden hinzufügen und die Klasse neu erstellen.
        </para>

        <programlisting language="php"><![CDATA[
$generator = Zend_CodeGenerator_Php_Class::fromReflection(
    new Zend_Reflection_Class($class)
);
$generator->setMethod(array(
    'name'       => 'setBaz',
    'parameters' => array(
        array('name' => 'baz'),
    ),
    'body'       => '$this->_baz = $baz;' . "\n" . 'return $this;',
    'docblock'   => new Zend_CodeGenerator_Php_Docblock(array(
        'shortDescription' => 'Die baz Eigenschaft setzen',
        'tags'             => array(
            new Zend_CodeGenerator_Php_Docblock_Tag_Param(array(
                'paramName' => 'baz',
                'datatype'  => 'string'
            )),
            new Zend_CodeGenerator_Php_Docblock_Tag_Return(array(
                'datatype'  => 'string',
            )),
        ),
    )),
));
$code = $generator->generate();
]]></programlisting>
    </example>
</sect1>
