物件導向編輯中物件被賦予了自省的能力,而這個自省的過程就是反射.
反射,直觀理解應時根據到達地找出出發地和**.比方說,我給你乙個光禿禿的物件,我可以僅僅通過這個物件就能知道它所屬的類,擁有哪些方法.
反射指在php執行狀態中,擴充套件分析php程式,匯出或提取出關於類,方法,屬性,引數等詳細資訊,包括注釋.這種動態獲取資訊以及動態呼叫物件方法的功能稱為反射api
以下面**為例
class handsonboypublic function __get($name)
return $this->$name;
}}$boy = new handsonboy();
echo $boy->name.'
';$boy->hair = 'short';
現在,要獲取這個student物件的方法和屬性列表該怎麼做?可以用反射來實現,**如下
$reflect = new reflectionobject($boy);$props = $reflect->getproperties();
//獲取屬性的名字
foreach($props as $prop)
//獲取物件方法列表
$methos = $reflect->getmethods();
foreach($methos as $method)
也可以不用反射api,使用class函式,返回物件屬性的關聯陣列以及更多的資訊:(針對於公開的屬性和):
//返回物件屬性的關聯陣列var_dump(get_object_vars($boy));
//類屬性
var_dump(get_class_vars(get_class($boy)));
//返回由類的屬性的方法名組成的陣列
var_dump(get_class_methods(get_class($boy)));
反射api的功能顯然更強大,甚至能還原這個類的原型,包括方法的訪問許可權,以下簡單封裝了乙個列印類的**
/*** @param $classobject 物件或者類名
*/function getclass($classobject)
foreach($object->getmethods() as $v)
echo "class \n\n";
}echo "\n";
if(is_array($methods)) ksort($methods);
foreach($methods as $k=>$v)
()\n";
}echo "}\n";
}
不僅如此,php手冊中關於反射api更是有幾十個,可以說,反射完整地描述了乙個類或者物件的原型.反射不僅可以用於類和物件,還可以用於函式,擴充套件模組,異常等.
反射可以用於文件生成,因此可以用它對檔案裡的類進行掃瞄,逐個生成描述文件.
既然反射可以探知類內部結構, 那麼是不是 可以用它做hook實現外掛程式功能呢?或者是作動態**呢?拋磚引玉,以下**是個簡單的例子
<?phpclass mysql
".php_eol;
}}class sqlproxy
public function __call($name,$args)}}
}}$obj = new sqlproxy('mysql');
$obj->connect('chenqionghe');
這裡真正操作類是mysql類,但是sqlproxy實現了根據動態傳入引數,代替實際的類執行,並且在方法執行前後進行攔截,並且動態地改變類中的方法和屬性.這就是簡單的動態**.
在平常的開發中用到反射的地方並不多: 乙個是對物件進行除錯,別乙個是獲取類的資訊.在mvc和外掛程式開發中,使用反射很常見,但是反射的消耗也很大,在可以找到替代方案的情況下,就不要濫用.
php有token函式,可以通過這個機制實現一些反射功能.從簡單靈活的角度講,使用已經提供的反射api是可取的.
很多時候,善用反射能保持**的優雅和簡潔,但反射也會破壞類的封裝性,因為反射可以使本不應該暴露的方法或屬性被強制暴露了出來,這既是優點也是缺點.
PHP中的反射
目錄php5 具有完整的反射api,新增對類 介面 函式 方法和擴充套件進行反向工程的能力。反射是什麼?它是指在php執行狀態中,擴充套件分析php程式,匯出或提取出關於類 方法 屬性 引數等的詳細資訊,包括注釋。這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為反射api。反射是操縱物件導向范型中...
php中的反射機制
php 5 具有完整的反射 api,新增了對類 介面 函式 方法和擴充套件進行反向工程的能力。此外,反射 api 提供了方法來取出函式 類和方法中的文件注釋。請注意部分內部 api 丟失了反射擴充套件工作所需的 例如,乙個內建的 php 類可能丟失了反射屬性的資料。這些少數的情況被認為是錯誤,不過,...
php反射應用場景 詳解php中反射的應用
反射是在php執行狀態中,擴充套件分析php程式,匯出或提取出關於類 方法 屬性 引數等的詳細資訊,包括注釋。這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為反射api。反射是操縱物件導向范型中元模型的api,其功能十分強大,可幫助我們構建複雜,可擴充套件的應用。其用途如 自動載入外掛程式,自動生...