<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect2 id="zend.validate.set.callback">
    <title>Callback</title>

    <para>
        <classname>Zend_Validate_Callback</classname> erlaubt es einen Callback anzugeben der
        verwendet wird um einen angegebenen Wert zu prüfen.
    </para>

    <sect3 id="zend.validate.set.callback.options">
        <title>Unterstützte Optionen für Zend_Validate_Callback</title>

        <para>
            Die folgenden Optionen werden für <classname>Zend_Validate_Callback</classname>
            unterstützt:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis><property>callback</property></emphasis>: Setzt den Callback welcher
                    für die Prüfung aufgerufen wird.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><property>options</property></emphasis>: Setzt zusätzliche Optionen
                    welche an den Callback übergeben werden.
                </para>
            </listitem>
        </itemizedlist>
    </sect3>

    <sect3 id="zend.validate.set.callback.basic">
        <title>Grundsätzliche Verwendung</title>

        <para>
            Der einfachste Anwendungsfall besteht darin eine einzelne Funktion zu haben und diese
            als Callback zu verwenden. Angenommen wir haben die folgende Funktion.
        </para>

        <programlisting language="php"><![CDATA[
function myMethod($value)
{
    // einige Prüfungen
    return true;
}
]]></programlisting>

        <para>
            Um diese in <classname>Zend_Validate_Callback</classname> zu verwenden muss man Sie
            nur auf folgende Weise aufrufen:
        </para>

        <programlisting language="php"><![CDATA[
$valid = new Zend_Validate_Callback('myMethod');
if ($valid->isValid($input)) {
    // Input scheint gültig zu sein
} else {
    // Input ist ungültig
}
]]></programlisting>
    </sect3>

    <sect3 id="zend.validate.set.callback.closure">
        <title>Verwendung mit Closures</title>

        <para>
            <acronym>PHP</acronym> 5.3 führt <ulink
                url="http://php.net/functions.anonymous">Closures</ulink> ein,
            welche grundsätzlich selbst-enthaltene oder <emphasis>anonyme</emphasis> Funktionen
            sind. <acronym>PHP</acronym> nimmt an das Closures eine andere Form eines Callbacks
            sind, und können daher als solche mit <classname>Zend_Validate_Callback</classname>
            verwendet werden. Als Beispiel:
        </para>

        <programlisting language="php"><![CDATA[
$valid = new Zend_Validate_Callback(function($value){
    // einige Prüfungen
    return true;
});

if ($valid->isValid($input)) {
    // Input scheint gültig zu sein
} else {
    // Input ist ungültig
}
]]></programlisting>
    </sect3>

    <sect3 id="zend.validate.set.callback.class">
        <title>Verwendung mit klassenbasierten Callbacks</title>

        <para>
            Natürlich ist es auch möglich eine Klassenmethode als Callback zu verwenden. Angenommen
            wir haben die folgende Klassenmethode:
        </para>

        <programlisting language="php"><![CDATA[
class MyClass
{
    public function myMethod($value)
    {
        // einige Prüfungen
        return true;
    }
}
]]></programlisting>

        <para>
            Die Definition des Callbacks ist in diesem Fall fast die gleiche. Man muss nur eine
            Instanz der Klasse vor der Methode erstellen und ein Array das den Callback beschreibt:
        </para>

        <programlisting language="php"><![CDATA[
$object = new MyClass;
$valid = new Zend_Validate_Callback(array($object, 'myMethod'));
if ($valid->isValid($input)) {
    // Input scheint gültig zu sein
} else {
    // Input ist ungültig
}
]]></programlisting>

        <para>
            Man kann auch eine statische Methode als Callback definieren. Angenommen wir haben die
            folgende Klassendefinition dann ist die Verwendung des Prüfers wie folgt:
        </para>

        <programlisting language="php"><![CDATA[
class MyClass
{
    public static function test($value)
    {
        // Einige Prüfungen
        return true;
    }
}

$valid = new Zend_Validate_Callback(array('MyClass', 'test'));
if ($valid->isValid($input)) {
    // Input scheint gültig zu sein
} else {
    // Input ist ungültig
}
]]></programlisting>

        <para>
            Letztendlich kann man, wenn man <acronym>PHP</acronym> 5.3 verwendet, die magische
            Methode <methodname>__invoke()</methodname> in der eigenen Klasse definieren. Wenn man
            das tut dann funktioniert die Angabe einer Instanz der Klasse genauso:
        </para>

        <programlisting language="php"><![CDATA[
class MyClass
{
    public function __invoke($value)
    {
        // some validation
        return true;
    }
}

$object = new MyClass();
$valid = new Zend_Validate_Callback($object);
if ($valid->isValid($input)) {
    // Input scheint gültig zu sein
} else {
    // Input ist ungültig
}
]]></programlisting>
    </sect3>

    <sect3 id="zend.validate.set.callback.options2">
        <title>Optionen hinzufügen</title>

        <para>
            <classname>Zend_Validate_Callback</classname> erlaubt auch die Verwendung von Optionen
            welche als zusätzliche Argumente dem Callback übergeben werden.
        </para>

        <para>
            Nehmen wir die folgende Klassen und Methoden Definition an:
        </para>

        <programlisting language="php"><![CDATA[
class MyClass
{
    function myMethod($value, $option)
    {
        // einige Prüfungen
        return true;
    }
}
]]></programlisting>

        <para>
            Es gibt zwei Wege um den Prüfer über zusätzliche Optionen zu informieren: Diese im
            Constructor übergeben, oder Sie mit der Methode <methodname>setOptions()</methodname>
            übergeben.
        </para>

        <para>
            Um Sie im Contructor zu übergeben, muss ein Array übergeben werden das die zwei
            Schlüssel "callback" und "options" enthält:
        </para>

        <programlisting language="php"><![CDATA[
$valid = new Zend_Validate_Callback(array(
    'callback' => array('MyClass', 'myMethod'),
    'options'  => $option,
));

if ($valid->isValid($input)) {
    // Input scheint gültig zu sein
} else {
    // Input ist ungültig
}
]]></programlisting>

        <para>
            Andererseits können Sie dem Prüfer auch nach der Instanzierung übergeben werden:
        </para>

        <programlisting language="php"><![CDATA[
$valid = new Zend_Validate_Callback(array('MyClass', 'myMethod'));
$valid->setOptions($option);

if ($valid->isValid($input)) {
    // Input scheint gültig zu sein
} else {
    // Input ist ungültig
}
]]></programlisting>

        <para>
            Wenn zusätzliche Werte an <methodname>isValid()</methodname> übergeben werden, dann
            werden diese Werte unmittelbar nach <varname>$value</varname> hinzugefügt.
        </para>

        <programlisting language="php"><![CDATA[
$valid = new Zend_Validate_Callback(array('MyClass', 'myMethod'));
$valid->setOptions($option);

if ($valid->isValid($input, $additional)) {
    // Input scheint gültig zu sein
} else {
    // Input ist ungültig
}
]]></programlisting>

        <para>
            Wenn der Aufruf zu einem Callback durchgeführt wird, dann wird der Wert der zu
            überprüfen ist als erstes Argument an den Callback übergeben gefolgt von allen anderen
            Werten die an <methodname>isValid()</methodname> übergeben wurden; alle anderen Optionen
            folgen Ihm. Die Anzahl und der Typ der Optionen welche verwendet werden ist nicht
            limitiert.
        </para>
    </sect3>
</sect2>
<!--
vim:se ts=4 sw=4 et:
-->
