2012-08-13 66 views
1

我有一個存在的類,我想創建一個系統來爲它加載「插件」。這些「插件」被創建爲文件,然後與主類一起包含在文件中。用php加載一個類「on-the-fly」

現在我認爲主類需要用他們自己的類擴展這些小「插件」。問題是我不知道哪些插件會包含不同的用戶。所以類的擴展是動態的。

我該如何擴展一個類,也許不使用eval(我沒有測試過)?

+1

要動態更改父類?你的插件繼承的類是什麼?這說明了一個非常嚴重的設計缺陷。真的沒有理由你必須這樣做,並且沒有簡單的方法來做到這一點。 – meagar 2012-08-13 22:38:42

+1

你確實做錯了什麼。你的插件設計被破壞了。從技術上講,你可以評估/包含動態字符串數據,所以你可以讓它發生任何你喜歡的事情 - 這只是你做錯了設計而已。 – hakre 2012-08-13 22:41:07

+0

我猜你會從一些以前的javascript原型繼承經驗來到PHP經典繼承?您可能需要閱讀古典繼承。 – 2012-08-13 22:42:58

回答

0

你在說__autoload嗎?

function __autoload($class) { 
    require_once($class.'.php'); 
} 
$object = new Something(); 

這將嘗試require_once(Something.php);

0

你可以通過使用PHP的魔術功能來做到這一點。假設你有類A.你想要一個帶有一些額外方法的「實例」。

class A { 
    public $publicA; 

    public function doA() { 
     $this->publicA = "Apple"; 
    } 
} 

class B { 
    public $publicB; 

    public function doB() { 
     $this->publicB = "Bingo"; 
    } 

    private $object; 

    public function __construct($object) { 
     $this->object = $object; 
    } 

    public function __call($name, $arguments) { 
     return call_user_func_array(array($this->object, $name), $arguments); 
    } 

    public function __get($name) { 
     return $this->object->$name; 
    } 

    public function __set($name, $value) { 
     $this->object->$name = $value; 
    } 
} 

$b = new B(new A); 

$b->doA(); 
$b->doB(); 
echo "$b->publicA, $b->publicB"; 

實例$ b的這種技術可以從任何數目的類可以擴展到聚合官能團的方法A和B兩者的性質。