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

怪我咯
リリース: 2023-03-11 18:02:02
オリジナル
897 人が閲覧しました

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

次の 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート