PHP反射類ReflectionClass和ReflectionObject的使用方法

PHP中的擴展反射類,該擴展用來分析php程序,導出或提取出關於類、方法、屬性、參數等的詳細信息,包括註釋。
看一個這樣的問題,php類的成員變量沒有在類中聲明,而是在函數中聲明,有什麼不同?

代碼如下:


class test{

    private $name;
    private $sex;
    function __construct(){
        $this->aaa='aaa';
    }
}

$test=new test();

$reflect=new ReflectionClass($test);
$pro=$reflect->getDefaultProperties();
print_r($pro); //打印結果:Array ( [name] => [sex] => )

echo $test->aaa; //打印結果:aaa


在這個test類中,聲明瞭兩個成員變量$name和$sex,但是在構造函數中,又聲明瞭一個變量$aaa,初始化類,使用反射類打印默認成員屬性只有聲明的兩個成員變量屬性,但是打印類的$aaa變量發現還是可以輸出結果。
請問類的成員變量不用聲明,在函數中聲明也是可以的嗎,有什麼區別?
在你這個例子中,使用ReflectionClass是不恰當的,因爲__construct只有在實例化class時,纔會執行。
也就是說ReflectionClass更多的是反射類聲明時的結構,而不是類實例化後的結構,所以沒有輸出屬性aaa是正確,因爲屬性aaa確實是(在類聲明時)不存在的。
那麼怎麼看屬性aaa呢,應該用ReflectionObject反射實例化後的結構,例如

代碼如下:


<?php
class test{
    private $name;
    private $sex;
    function __construct(){
        $this->aaa='aaa';
    }
}
$test=new test();

$reflect=new ReflectionObject($test);
$pro=$reflect->getProperties();
print_r($pro);
 


經過實例化以後,屬性aaa纔會存在,這時你就能看到屬性aaa了
因爲php是“動態”語言,所以可以類的成員變量不用聲明,在函數中聲明也是可以的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章