クロージャ匿名関数に関して、JS
でよくある問題は、それを this
スコープにバインドすることです。実際、この問題は、次のコードのような PHP
にも存在します。
$func = function($say){ echo $this->name, ':', $say, PHP_EOL; }; $func('good'); // Fatal error: Uncaught Error: Using $this when not in object context
この匿名関数では、$this->name
を使用して取得します。現在のスコープ内の $name
属性ですが、この $this
は誰ですか?定義していないため、エラーはここで直接報告されます。エラー メッセージは次のとおりです。 $this
は使用されていますが、オブジェクト コンテキストがありません。つまり、$this 参照のスコープが指定されていません。
1.bindTo() メソッド バインディング $this
$func = $func->bindTo($lily, 'Lily'); // $func = $func->bindTo($lily, Lily::class); // $func = $func->bindTo($lily, $lily); $func1('cool');
今度は正常に出力できました。 bindTo()
このメソッドは、現在のクロージャ オブジェクトをコピーし、それを $this
スコープとクラス スコープにバインドします。
$lily パラメーターは object $newthis
パラメーターであり、このコピーされた匿名関数に対して $this
を指定します。
private:
$func1 = $func->bindTo($lily); $func1('cool2'); // Fatal error: Uncaught Error: Cannot access private property Lily::$name
2.call() の $name 属性にアクセスできません。メソッド バインディング $this
$func->call($lily, 'well'); // Lily:well
推奨: 《2021 PHP 面接の質問まとめ (コレクション) 》《php ビデオ チュートリアル》
以上がPHP の匿名関数にこれを指定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。