[英]Call a protected method from outside a class in PHP
我有一個非常特殊的情況,我需要從類外部調用受保護的方法。 我非常清楚我的編程方式,但我不會完全反對我這樣做的一個特例。 在所有其他情況下,我需要繼續禁止訪問內部方法,因此我希望保護該方法。
在課堂外訪問受保護方法的一些優雅方法是什么? 到目前為止,我已經找到了這個 。
我想有可能創建某種目標類的雙代理實例,它會偷偷地提供對內部的訪問......
在PHP中,您可以使用Reflections執行此操作。 要調用protected或private方法,請使用setAccessible()方法http://php.net/reflectionmethod.setaccessible (只需將其設置為TRUE)
我認為在這種情況下,重構所以你不需要這種東西可能是最優雅的方式。 在說一個選項是使用__call
並在該解析debug_backtrace
中查看哪個類調用該方法。 然后檢查朋友最白
class ProtectedClass {
// Friend list
private $friends = array('secret' => array('FriendClass'));
protected function secret($arg1, $arg2) {
// ...
}
public function __call($method, $args) {
$trace = debug_backtrace();
$class = $trace[1]['class'];
if(in_array($class, $this->friends[$method]))
return $this->$method($args[0], $args[1]);
throw new Exception();
}
}
我想我需要淋浴。
這是一個小小的kludgy,但可能是一個選擇。
為了訪問受保護的功能,添加子類
public class Child extends Parent {
public function protectedFunc() {
return parent::protectedFunc();
}
}
然后,在需要調用該函數的地方實例化Child
而不是Parent
的實例。
我只是把它扔到那里因為我兩年沒用PHP編程了。 你能不能像這樣調用受保護方法的類添加一個函數?
$obj->publicFunc = create_function('$arg', 'return $this->protectedFunc($arg);');
編輯 : 我認為Tom在查看create_function的文檔時是正確的。 當您嘗試使用此示例調用它時,看起來$ this的范圍將是“錯誤的”。
看起來自PHP 5.3.0以來也支持傳統的匿名函數(我的第一個解決方案可能不起作用),所以我可能會這樣寫:
$obj->publicFunc = function($arg) {
return $this->protectedFunc($arg);
};
因為我認為它看起來更清潔(當然你選擇的IDE會更好地突出它)。
呃,我嘗試使用Reflection調用方法,但PHP也不允許你這樣做。 看起來你將不得不像其他海報所建議的那樣使用某種兒童類。 如果您發現一種有效的方法,開發人員可能會將其歸類為未來的錯誤,並在升級到下一版本時破壞您的代碼。
我建議擴展課程。
如果我必須調用私有函數,我會考慮程序設計的問題是什么?
曾經是這樣的情況
通過尋找任何方式步行解決這個問題,你會無處更接近真正的解決方案。
假設您的方法聲明如下:
protected function getTheFoo() {
...
}
protected function setTheFoo($val) {
...
}
用法:
$obj->__get('the_foo');
$obj->__set('the_foo', 'myBar');
這繞過了受保護的方法,直接轉到實例變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.