关于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, 则该属性会被修改, 

**/
相关文章
相关标签/搜索