2017-01-03 9 views
5

PHP 7.0 changesを経由して、Closure Callを見つけました。 ドキュメントのコードは次のとおりです。PHP - 関数スコープで参照されたときのカプセル化

<?php 
class A {private $x = 1;} 

// Pre PHP 7 code 
$getXCB = function() {return $this->x;}; // this line 
$getX = $getXCB->bindTo(new A, 'A'); // intermediate closure 
echo $getX(); 

私の質問は、最初のコメントの後にx値を返すことができますか?これでカプセル化が破られることはありませんか?

xが関数クロージャ内で参照されているようで、何らかの理由で実際にクラススコープに入っているようです。

+0

http://stackoverflow.com/questions/40772386/how-can-i-invoke-a-reflectionfunction-rapping-a-closure-that-utilizes-this/40772588#40772588それはあなたにいくつかのヒントを与えることができます。 –

答えて

3

実際、bindToで作成された新しい関数は、その新しい関数のスコープをAに設定します。これはdocumentation on bindToで説明したとおりである。

はなく、おそらく異なるバインドされたオブジェクトと、新しいクラスのスコープと、作成し、この1と同じボディとバインド変数を使用して新しい匿名関数を返します。

"バインドされたオブジェクト"は、thisが関数本体に持つ値を決定し、 "クラススコープ"は、無名関数がアクセスできるプライベートメンバーと保護されたメンバーを決定するクラスを表します。つまり、表示されるメンバーは、無名関数がnewscopeパラメータの値として与えられたクラスのメソッドである場合と同じです。

最後のフレーズ"... if if ..."に注意してください。

関連する問題