PHP中的反射

2022-01-10 16:36:58 字數 2101 閱讀 7730

物件導向編輯中物件被賦予了自省的能力,而這個自省的過程就是反射.

反射,直觀理解應時根據到達地找出出發地和**.比方說,我給你乙個光禿禿的物件,我可以僅僅通過這個物件就能知道它所屬的類,擁有哪些方法.

反射指在php執行狀態中,擴充套件分析php程式,匯出或提取出關於類,方法,屬性,引數等詳細資訊,包括注釋.這種動態獲取資訊以及動態呼叫物件方法的功能稱為反射api

以下面**為例

class handsonboy

public 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實現外掛程式功能呢?或者是作動態**呢?拋磚引玉,以下**是個簡單的例子

<?php

class 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,其功能十分強大,可幫助我們構建複雜,可擴充套件的應用。其用途如 自動載入外掛程式,自動生...