PHP中的反射

2021-08-19 08:06:05 字數 3223 閱讀 6842

目錄
php5 具有完整的反射api,新增對類、介面、函式、方法和擴充套件進行反向工程的能力。

反射是什麼?

它是指在php執行狀態中,擴充套件分析php程式,匯出或提取出關於類、方法、屬性、引數等的詳細資訊,包括注釋。這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為反射api。反射是操縱物件導向范型中元模型的api,其功能十分強大,可幫助我們構建複雜,可擴充套件的應用。

其用途如:自動載入外掛程式,自動生成文件,甚至可用來擴充php語言。

php反射api由若干類組成,可幫助我們用來訪問程式的元資料或者同相關的注釋互動。借助反射我們可以獲取諸如類實現了那些方法,建立乙個類的例項(不同於用new建立),呼叫乙個方法(也不同於常規呼叫),傳遞引數,動態呼叫類的靜態方法。

反射api是php內建的oop技術擴充套件,包括一些類,異常和介面,綜合使用他們可用來幫助我們分析其它類,介面,方法,屬性,方法和擴充套件。這些oop擴充套件被稱為反射。

平常我們用的比較多的是 reflectionclass類 和 reflectionmethod類,例如:

**如下:

<?php 

class

person

public

function setid($v)

public

function

getname()

public

function setname($v)

public

function

getbiography()

public

function setbiography($v

) }

一、通過reflectionclass,我們可以得到person類的以下資訊:

1.常量 contants

2.屬性 property names

3.方法 method names靜態

4.屬性 static properties

5.命名空間 namespace

6.person類是否為final或者abstract

7.person類是否有某個方法

接下來反射它,只要把類名"person"傳遞給reflectionclass就可以了:

**如下:

$class = new reflectionclass('person'); //

建立 person這個類的反射類

$instance = $class->newinstanceargs($args); //

相當於例項化person 類

1)獲取屬性(properties):

**如下:

$properties = $class->getproperties();

foreach ($properties

as$property

) //

輸出:// _allowdynamicattributes

// id

// name

// biography

預設情況下,reflectionclass會獲取到所有的屬性,private 和 protected的也可以。如果只想獲取到private屬性,就要額外傳個引數:

**如下:

$private_properties = $class->getproperties(reflectionproperty::is_private);
可用引數列表:

**如下:

reflectionproperty::is_static

reflectionproperty::is_public

reflectionproperty::is_protected

reflectionproperty::is_private

通過$property->getname()可以得到屬性名。

2)獲取注釋:

通過getdoccomment可以得到寫給property的注釋。

**如下:

foreach ($properties

as$property) }

//output:

// primary_autoincrement

// varchar

// text

3)獲取類的方法

**如下:

getmethods()       來獲取到類的所有methods。

hasmethod(

string

) 是否存在某個方法

getmethod(

string) 獲取方法

4)執行類的方法:

**如下:

$instance->getname(); //

執行person 裡的方法getname

// 或者:

$method = $class->getmethod('getname'); //

獲取person 類中的getname方法

$method->invoke($instance); //

執行getname 方法

// 或者:

$method = $class->getmethod('setname'); //

獲取person 類中的setname方法

$method->invokeargs($instance, array('snsgou.com'));

二、通過reflectionmethod,我們可以得到person類的某個方法的資訊:

1.是否「public」、「protected」、「private」 、「static」型別

2.方法的引數列表

3.方法的引數個數

4.反呼叫類的方法

**如下:

//

執行detail方法

$method = new reflectionmethod('person', 'test');

if ($method->ispublic() && !$method->isstatic())

echo

$method->getnumberofparameters(); //

引數個數

echo

$method->getparameters(); //

引數物件陣列

----->>>

PHP中的反射

物件導向編輯中物件被賦予了自省的能力,而這個自省的過程就是反射.反射,直觀理解應時根據到達地找出出發地和 比方說,我給你乙個光禿禿的物件,我可以僅僅通過這個物件就能知道它所屬的類,擁有哪些方法.反射指在php執行狀態中,擴充套件分析php程式,匯出或提取出關於類,方法,屬性,引數等詳細資訊,包括注釋...

php中的反射機制

php 5 具有完整的反射 api,新增了對類 介面 函式 方法和擴充套件進行反向工程的能力。此外,反射 api 提供了方法來取出函式 類和方法中的文件注釋。請注意部分內部 api 丟失了反射擴充套件工作所需的 例如,乙個內建的 php 類可能丟失了反射屬性的資料。這些少數的情況被認為是錯誤,不過,...

php反射應用場景 詳解php中反射的應用

反射是在php執行狀態中,擴充套件分析php程式,匯出或提取出關於類 方法 屬性 引數等的詳細資訊,包括注釋。這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為反射api。反射是操縱物件導向范型中元模型的api,其功能十分強大,可幫助我們構建複雜,可擴充套件的應用。其用途如 自動載入外掛程式,自動生...