PHP コールバックと匿名関数

怪我咯
怪我咯オリジナル
2017-06-28 11:50:22933ブラウズ

匿名関数は、厳密には オブジェクト指向 の機能ではありませんが、コールバックを使用するオブジェクト指向アプリケーションで使用される可能性があるため、非常に便利です。

次の 2 つのクラスを見てください:

<?php
class Product
{
    public $name;
    public $price;

    function construct($name, $price)
    {
        $this->name = $name;
        $this->price= $price;
    }
}

class ProcessSale
{
    private $callbacks;

    function register_callback($callback)
    {
        if(!is_callable($callback))    //判断是否可以调用
        {
            throw new Exception(&#39;callback not callable&#39;);
        }

        $this->callbacks[] = $callback;
    }

    function process($product)
    {
        print "{$product->name}: processing\n";

        foreach($this->callbacks as $callback)
        {
            call_user_func($callback, $product);
        }
    }
}

?>

このコードの目的は、さまざまなコールバックを実行することです。製品には $name と $price のみが保存されます。 Processsale は 2 つのメソッドで構成されます。 registercallback() はサイレント スカラーを受け入れ、スカラーをテストし、それをコールバック配列に追加します。

組み込み関数is_callable() 関数はテスト関数を実装します。この関数は、渡された値が call_user_func() や array_walk() などの関数によって呼び出されることを保証します。

process() メソッドは製品オブジェクトを受け取り、そのオブジェクトに関連する情報を出力します。次に、$callbacks 配列プロパティを繰り返し処理します。

コールバックの利点: コールバックを使用すると、コンポーネントのコアタスクに直接関係しない関数を実行時にコンポーネントに挿入できます。コンポーネント コールバックを使用すると、自分が知らないコンテキストでコードを拡張する権限を他の人に与えることができます。

次に、ユーザーが販売記録を作成したいとします。そのユーザーがクラスに直接アクセスできる場合は、process() メソッドにロギング ロジックを追加できますが、これは悪い習慣となる場合があります。彼がクラスのメンテナでない場合、クラスに対する変更は次回の更新で上書きされます。たとえ彼がこのコンポーネントの管理者であっても、 process() メソッドに非常に多くの追加タスクを追加することは本末転倒であり、このメソッドの中核となる機能を反映できません。そのため、このメソッドがプロジェクトを横断する可能性が低下する可能性があります。

幸いなことに、プロセス コールバックを作成しました。

<?php
class Product
{
    public $name;
    public $price;

    function construct($name, $price)
    {
        $this->name = $name;
        $this->price= $price;
    }
}

class ProcessSale
{
    private $callbacks;

    function register_callback($callback)
    {
        if(!is_callable($callback))    //判断是否可以调用
        {
            throw new Exception(&#39;callback not callable&#39;);
        }

        $this->callbacks[] = $callback;
    }

    function process($product)
    {
        print "{$product->name}: processing\n";

        foreach($this->callbacks as $callback)
        {
            call_user_func($callback, $product);
        }
    }
}

$logger = create_function(&#39;$product&#39;, &#39;print " logging ({$product->name})\n";&#39;);
$p1 = new ProcessSale();
$p1->register_callback($logger);

$p1->process(new Product("shoes", 8));
print "\n";

$p1->process(new Product("coffee", 9));
?>

結果は自動的に実行されます。

PHP 5.3 以降のバージョンでは、匿名関数を実装するためのより良い方法が提供されています。

$logger = function($product)
{
     print " logging ({$product->name})\n";
};

$p1 = new ProcessSale();
$p1->register_callback($logger);

$p1->process(new Product("shoes", 8));
print "\n";

$p1->process(new Product("coffee", 9));

このメソッドは関数キーワードをインラインで使用しており、関数名はありません。これはインライン ステートメントであるため、コード ブロックの最後にセミコロンが必要であることに注意してください。

コールバックは匿名である必要はなく、

関数名 (またはオブジェクト参照やメソッド) をコールバックとして使用できます。

以上がPHP コールバックと匿名関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。