問1:
class Test{
private $aa=1;
function __get($proName){return $this->proName;}
}
class subTest extends Test{
private $aa=2;
}
$test=new subTest();
echo $test->aa;
求解釋,為啥輸出1?
答:當試圖從類的外部訪問私有屬性時,__get方法會被調用,如果它存在的話subTest繼承了Test類,並試圖重載aa,但是沒有__get()方法,當實例化subTest類後訪問它的私有屬性,由於__get()方法,所以默認將調用父類的__get方法,當然訪問的也是父類的aa屬性,如果要輸出2可以為subTest類添加__get()
追問:那繼承父類的方法能不能訪問子類的成員屬性
class Test{
protected $aa=1; function __get($proName){return $this->$proName;}
}
class subTest extends Test{
protected $aa=2;
}
$test=new subTest();
echo $test->aa;
答:這裡輸出2,因為子類覆蓋了從父類繼承來的屬性aa,因為他們都是protected的,所以可以覆蓋
追問:
class Test{
private $aa=1;
function __get($proName){
return $this->$proName;
}
class subTest extends Test{
protected $aa=2;
}
$test=new subTest();
echo $test->aa;
答:這次輸出1,是因為子類並沒有覆蓋父類的屬性而且沒有自己的__get方法,當訪問同一個屬性時,php默認將其識別為private,也就是以父類的訪問限定符為標准,識別private後就會調用__get()方法,所以輸出1
對應的__set()是設置屬性的值,原理相似。
*