簡體   English   中英

在PHP中從類外部調用受保護的方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM