我有一個存在的類,我想創建一個系統來爲它加載「插件」。這些「插件」被創建爲文件,然後與主類一起包含在文件中。用php加載一個類「on-the-fly」
現在我認爲主類需要用他們自己的類擴展這些小「插件」。問題是我不知道哪些插件會包含不同的用戶。所以類的擴展是動態的。
我該如何擴展一個類,也許不使用eval(我沒有測試過)?
我有一個存在的類,我想創建一個系統來爲它加載「插件」。這些「插件」被創建爲文件,然後與主類一起包含在文件中。用php加載一個類「on-the-fly」
現在我認爲主類需要用他們自己的類擴展這些小「插件」。問題是我不知道哪些插件會包含不同的用戶。所以類的擴展是動態的。
我該如何擴展一個類,也許不使用eval(我沒有測試過)?
你在說__autoload嗎?
function __autoload($class) {
require_once($class.'.php');
}
$object = new Something();
這將嘗試require_once(Something.php);
你可以通過使用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兩者的性質。
要動態更改父類?你的插件繼承的類是什麼?這說明了一個非常嚴重的設計缺陷。真的沒有理由你必須這樣做,並且沒有簡單的方法來做到這一點。 – meagar 2012-08-13 22:38:42
你確實做錯了什麼。你的插件設計被破壞了。從技術上講,你可以評估/包含動態字符串數據,所以你可以讓它發生任何你喜歡的事情 - 這只是你做錯了設計而已。 – hakre 2012-08-13 22:41:07
我猜你會從一些以前的javascript原型繼承經驗來到PHP經典繼承?您可能需要閱讀古典繼承。 – 2012-08-13 22:42:58