PHP反射 強行訪問乙個受保護的方法

2021-10-02 00:06:36 字數 903 閱讀 7317

我們知道,類的protected方法是無法通過物件來訪問的,這是處於安全考慮。

如果要訪問這個方法,通常的做法是在建立乙個public方法來間接呼叫。

這裡我們使用反射來實現訪問。

class

test

}$obj

=new

test()

;var_dump

($obj

->

meth()

);

php fatal error: uncaught error: call to protected method test::meth() from context 『』

修改後

class

test

}$obj

=new

test()

;$refclass

=new

reflectionclass

(test:

:class);

// 傳入物件或類名,得到reflectionclass物件

$refmeth

=$refclass

->

getmethod

('meth');

// 得到reflectionmethod物件

$refmeth

->

setaccessible

(true);

// 設定為可見,也就是可訪問

$ret

=$refmeth

->

invoke

($obj);

// 傳入物件來訪問這個方法

var_dump

($ret);

// string(4) "test"

如何訪問乙個類的保護變數

或許很多人看了我這個標題,很想打我 類的變數都私有了。你訪問個p啊。不過事實上地球還真有類似的需求。記得2004年的時候,那會做個小的遊戲引擎,大部分的資料都是私有或者保護的,這些在應付遊戲本身的時候已經完全足夠了。但是後來做編輯器的時候,發現絕大部分私有或者保護的成員都是需要被外部訪問到的。但是實...

C 乙個類訪問另乙個類的私有成員和保護成員

友元類 class a friend class b private int aa class b public void output cout a.aa endl private a a 使用友元類時注意 1 友元關係不能被繼承。2 友元關係是單向的,不具有交換性。若類b是類a的友元,類a不一定...

乙個簡易的反射類庫NMSReflector

以前看過一些 是簡單的讀取sqlreader然後賦值給model,我不是不贊同這種做法,只是看到大篇幅的賦值操作真的有點浪費時間和精力,尤其是一些老專案居多。我看到的還好,多的也就60多個欄位且不用其他orm,如果涉及到變更的話,那麼對維護人員來說可能不僅僅是眼力活甚至還是.體力活。另外就是 的操作...