2011-08-11 95 views
2

我知道用相同的名字擴展類是不可能的,但我很好奇,如果有人知道加載類的方法,然後重命名它,所以我可以稍後用原來的名稱擴展它。希望像下面的東西:PHP解決方法來擴展相同名稱的類?

<?php 
//function to load and rename Class1 to Class2: does something like this exist? 
load_and_rename_class('Class1', 'Class2'); 

//now i can extend the renamed class and use the original name: 
class Class1 extends Class2{ 
} 
?> 

編輯: 嗯,我明白,這將是可怕的做法在有類文件的大文庫的基本OOP環境。但是我使用的是CakePHP MVC框架,能夠以這種方式擴展插件類是非常有意義的,因爲框架遵循完善的命名約定(模型名稱,視圖名稱,控制器名稱,URL路徑(http:///site.com/users)等)。到目前爲止,爲了擴展一個CakePHP插件(例如:用戶插件),你必須通過添加一個前綴(像AppUsers)來擴展每個不同名稱的模型,視圖和控制器類,然後再做一些編碼重命名變量名稱,然後你必須編碼重命名的URL路由等等,最終返回到「用戶名」約定。

由於MVC框架代碼組織良好,如果能夠實現上述某些功能,它在代碼中很容易理解。

+2

真的__never__再想想這樣的事情!其對幾乎所有的好習慣 – KingCrunch

+0

即使我真的不明白你問我能說什麼這聽起來像一個壞主意,從技術的問題的一些基本missunderstanding而產生。 – markus

+0

@markus:簡而言之,他想用一個新的替代現有的類,這個類應該擴展前一個類。壞主意,是的。 – KingCrunch

回答

0

我想解決爲什麼這將是必要的。我只能想到下面的例子:

在你無法控制的背景下,一個對象被初始化:

// A class you can't change 
class ImmutableClass { 
    private function __construct() { 
     $this->myObject = new AnotherImmutableClass(); 
    } 
} 

$immutable = new ImmutableClass(); 

// And now you want to call a custom, currently non existing method on myObject 
// Because for some reason you need the context that this instance provides 
$immutable->myObject->yourCustomMethod(); 

所以現在你要添加的方法來AnotherImmutableClass沒有編輯不可變類。

這是絕對不可能的。

您可以從該上下文中完成的所有操作都是將該對象包裝在裝飾器中,或者運行輔助函數,傳遞該對象。

// Helper function 
doSomethingToMyObject($immutable->myObject); 
// Or decorator method 
$myDecoratedObject = new objectDecorator($immutable->myObject); 
$myDecoratedObject->doSomethingToMyObject(); 

對不起,如果我得到了棒的錯誤結束。

欲瞭解更多裝修信息,請參閱此問題: how to implement a decorator in PHP?

0

我碰巧明白你爲什麼想要這樣做,並想出了一個方法來實現最終目標是什麼。對於其他人,這是你可能有作者可與...

打交道,通過了一個CakePHP程序是什麼(以輔助類的引用作爲一個例子爲例> $這個 - >形式 - >輸入() ;)

然後在某些時候,您可能需要添加一些內容到input()函數,但仍然使用Form類名稱,因爲它遍佈您的應用程序。同時,儘管你不想重寫整個Form類,而只是更新它的小部分。因此,考慮到這一要求,實現它的方法是...

您必須將現有類從Cake核心中複製出來,但您不需要對其進行任何更改,然後在您升級蛋糕時你只需將一個確切的副本複製到這個新目錄中。 (例如將lib/Cake/View/Helper/FormHelper.php複製到app/View/Helper/CakeFormHelper。PHP)

然後,您可以添加一個名爲app /查看/助手/ FormHelper.php新的文件,並有一個表單助手擴展CakeFormHelper,即。

App::uses('CakeFormHelper', 'View/Helper'); 

FormHelper extends CakeFormHelper { 
    // over write the individual pieces of the class here 
} 
相關問題