關於php closure bindTo

<?php
class Grandparents{ private $__status1 = 'married'; }
class Parents extends Grandparents{ private $__status2 = 'divorced'; }
class Me extends Parents{ private $__status3 = 'single'; }
class My extends Parents{ public $__status3 = 'my_status';}

$status1_3 = function()
{
	$this->__status1 = "happy";
	$this->__status2 = "happy";
	$this->__status3 = "happy";
};

$status1_2 = function()
{
	$this->__status1 = "happy";
	$this->__status2 = "happy";
};


// 因爲指定了scope ,在parents scope是沒有$this->__staatus3; 
$c  =  $status1_3->bindTo($R = new Me(),Parents::class);
#$c();


//  
$c1  = $status1_3->bindTo($R = new Me(),Me::class);
$c1();
var_dump($R);


$c2  =  $status1_2->bindTo($S = new Me(),Parents::class);
$c2();
var_dump($S);


$c3  =  $status1_2->bindTo($T = new Me(),Me::class);
$c3();
var_dump($T);



var_dump(new My());
$c4  = $status1_3->bindTo($X = new My(),Parents::class);
$c4();
var_dump($X);


$c5  = $status1_3->bindTo($Y = new My(),My::class);
$c5();
var_dump($Y);


$c6  = $status1_3->bindTo($Z = new My(),Grandparents::class);
$c6();
var_dump($Z);

/**
	總結 :  這個問題,須要考慮2個點
	1  scope所在的層級,最後一個參數會限制閉包中$this的層級
	2  scope所在層級中, 屬性的可訪問性 .若是$this 層級的屬性的訪問權限是非private, 則該屬性會被修改, 

**/
相關文章
相關標籤/搜索