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

    <para>
        <classname>Zend_Validate_Callback</classname> は
        与えられた値に対してバリデートを行うコールバックを供給することができます。
    </para>

    <sect3 id="zend.validate.set.callback.options">
        <title>Zend_Validate_Callback にてサポートされるオプション</title>

        <para>
            次のオプションは <classname>Zend_Validate_Callback</classname> にてサポートされます:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis><property>callback</property></emphasis>: バリデーションにて
                    呼び出されるコールバックのセット
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><property>options</property></emphasis>: コールバックに
                    与えられる追加オプションのセット
                </para>
            </listitem>
        </itemizedlist>
    </sect3>

    <sect3 id="zend.validate.set.callback.basic">
        <title>基本的な使用法</title>

        <para>
            もっとも単純なユースケースは単なる関数を持ち、コールバックとして使用します。
            次の関数を持ったつもりになりましょう。
        </para>

        <programlisting language="php"><![CDATA[
function myMethod($value)
{
    // some validation
    return true;
}
]]></programlisting>

        <para>
            <classname>Zend_Validate_Callback</classname>内で使用するにはちょうどこの通り
            呼び出さなければなりません:
        </para>

        <programlisting language="php"><![CDATA[
$valid = new Zend_Validate_Callback('myMethod');
if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}
]]></programlisting>
    </sect3>

    <sect3 id="zend.validate.set.callback.closure">
        <title>クロージャとの使用方法</title>

        <para>
         <acronym>PHP</acronym> 5.3 は基本的には、内包あるいは <emphasis>匿名</emphasis> 関数の
         <ulink
             url="http://php.net/functions.anonymous">無名関数</ulink>を導入しています。
            <acronym>PHP</acronym> にて <classname>Zend_Validate_Callback</classname> とともに
            使用される別の形式の次のようなクロージャを考えましょう。 例として:
        </para>

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

if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}
]]></programlisting>
    </sect3>

    <sect3 id="zend.validate.set.callback.class">
        <title>クラスに基づくコールバックの使用方法</title>

        <para>
            もちろんクラスメソッドをコールバックとして使用することは可能です。 次のクラスメソッド
            を持ったつもりになりましょう:
        </para>

        <programlisting language="php"><![CDATA[
class MyClass
{
    public function myMethod($value)
    {
        // いくつかのバリデーション
        return true;
    }
}
]]></programlisting>

        <para>
            コールバックの定義はこのケースとほぼ同様です。メソッドより前にクラスインスタンス化して
            おいて、コールバックを取得する配列を生成します:
        </para>

        <programlisting language="php"><![CDATA[
$object = new MyClass;
$valid = new Zend_Validate_Callback(array($object, 'myMethod'));
if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}
]]></programlisting>

        <para>
            スタティックメソッドをコールバックとして定義することが可能です。 次のクラス定義を
            考慮し、バリデータの使用方法は:
        </para>

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

$valid = new Zend_Validate_Callback(array('MyClass', 'test'));
if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}
]]></programlisting>

        <para>
            最終的に、あなたが <acronym>PHP</acronym> 5.3を使用しているならば、あなたのクラスにおいて
            <methodname>__invoke()</methodname> マジックメソッドを定義できます。 もしそうしたならば、
            コールバックとして機能するクラスをインスタンス化したものを単に用意します。
        </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 appears to be valid
} else {
    // input is invalid
}
]]></programlisting>
    </sect3>

    <sect3 id="zend.validate.set.callback.options2">
        <title>オプションの追加</title>

        <para>
            <classname>Zend_Validate_Callback</classname> は
            コールバックへ追加引数として提供されるオプションの使用を許容します。
        </para>

        <para>
            次のクラスとメソッド定義を考えてみましょう:
        </para>

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

        <para>
            バリデータに追加引数として通知する２つの方法があります: 追加引数をコンストラクタに渡すか
            <methodname>setOptions()</methodname> メソッドへ渡します。
        </para>

        <para>
            コンストラクタに渡すには、"callback" と "options" を二つのキーにもつ配列を
            渡す必要があります:
        </para>

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

if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}
]]></programlisting>

        <para>
            一方で、インスタンス化した後のバリデータへ渡せます:
        </para>

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

if ($valid->isValid($input)) {
    // input appears to be valid
} else {
    // input is invalid
}
]]></programlisting>

        <para>
            追加引数が <methodname>isValid()</methodname> へ渡されたとき、これらの
            値は <varname>$value</varname> のすぐあとに追加されるでしょう。
        </para>

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

if ($valid->isValid($input, $additional)) {
    // input appears to be valid
} else {
    // input is invalid
}
]]></programlisting>

        <para>
            コールバックを呼び出す際には、
            <methodname>isValid()</methodname> に渡される他の値全てを後ろに従えたコールバックに
            バリデートされる値が第一引数として常に渡されます。
            他のオプションは全てその後に続きます。使用できるオプションの量と型は無制限です。
           </para>
    </sect3>
</sect2>
<!--
vim:se ts=4 sw=4 et:
-->