2011-08-11 62 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 
} 
相关问题