Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扩展同名类的PHP变通方法?_Php_Oop - Fatal编程技术网

扩展同名类的PHP变通方法?

扩展同名类的PHP变通方法?,php,oop,Php,Oop,我知道用相同的名称扩展一个类是不可能的,但我很好奇是否有人知道加载一个类然后重命名它的方法,这样我以后可以用原始名称扩展它。希望能像下面这样: <?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

我知道用相同的名称扩展一个类是不可能的,但我很好奇是否有人知道加载一个类然后重命名它的方法,这样我以后可以用原始名称扩展它。希望能像下面这样:

<?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插件(例如:Users插件),您必须通过添加前缀(如AppUsers)来扩展所有具有不同名称的模型、视图和控制器类,然后再进行一些编码以重命名变量名,然后必须对重命名的url路由进行编码,等等,最终回到“用户名”约定


由于MVC框架代码组织良好,如果能够实现上述内容,那么它在代码中很容易理解

我正试图弄明白为什么这是必要的。我只能想到以下例子:

在您无法控制的上下文中,将初始化对象:

// 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();
因此,现在您希望在不编辑任何不可变类的情况下向另一个ThermMutableClass添加方法

这是绝对不可能的。

在该上下文中,您所能做的就是将该对象包装在装饰器中,或者运行一个助手函数,传递该对象

// Helper function
doSomethingToMyObject($immutable->myObject);
// Or decorator method
$myDecoratedObject = new objectDecorator($immutable->myObject);
$myDecoratedObject->doSomethingToMyObject();
对不起,如果我把棍子的一端弄错了

有关装饰者的更多信息,请参见以下问题:
.

我正在努力弄清楚为什么这是必要的。我只能想到以下例子:

在您无法控制的上下文中,将初始化对象:

// 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();
因此,现在您希望在不编辑任何不可变类的情况下向另一个ThermMutableClass添加方法

这是绝对不可能的。

在该上下文中,您所能做的就是将该对象包装在装饰器中,或者运行一个助手函数,传递该对象

// Helper function
doSomethingToMyObject($immutable->myObject);
// Or decorator method
$myDecoratedObject = new objectDecorator($immutable->myObject);
$myDecoratedObject->doSomethingToMyObject();
对不起,如果我把棍子的一端弄错了

有关装饰者的更多信息,请参见以下问题:
.

我碰巧理解了您为什么要这样做,并且想出了一种实现最终目标的方法。对于其他人来说,这是作者可能正在处理的一个例子

在整个CakePHP应用程序中,您可能有对帮助器类的引用(例如>$this->Form->input();)

然后,在某个时候,您可能希望向该input()函数添加一些内容,但仍然使用表单类名,因为表单类名贯穿于您的应用程序。同时,尽管您不想重写整个表单类,而只是更新其中的一小部分。鉴于这一要求,实现这一目标的方法是

您确实需要将现有类从Cake核心中复制出来,但不需要对其进行任何更改,然后在升级Cake时只需将其精确复制到这个新目录。(例如,将lib/Cake/View/Helper/FormHelper.php复制到app/View/Helper/CakeFormHelper.php)

然后,您可以添加一个名为app/View/Helper/FormHelper.php的新文件,并让FormHelper扩展CakeFormHelper,即

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

FormHelper extends CakeFormHelper {
    // over write the individual pieces of the class here
}

我碰巧理解了你为什么要这么做,并且想出了一个实现最终目标的方法。对于其他人来说,这是作者可能正在处理的一个例子

在整个CakePHP应用程序中,您可能有对帮助器类的引用(例如>$this->Form->input();)

然后,在某个时候,您可能希望向该input()函数添加一些内容,但仍然使用表单类名,因为表单类名贯穿于您的应用程序。同时,尽管您不想重写整个表单类,而只是更新其中的一小部分。鉴于这一要求,实现这一目标的方法是

您确实需要将现有类从Cake核心中复制出来,但不需要对其进行任何更改,然后在升级Cake时只需将其精确复制到这个新目录。(例如,将lib/Cake/View/Helper/FormHelper.php复制到app/View/Helper/CakeFormHelper.php)

然后,您可以添加一个名为app/View/Helper/FormHelper.php的新文件,并让FormHelper扩展CakeFormHelper,即

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

FormHelper extends CakeFormHelper {
    // over write the individual pieces of the class here
}

真的再也不要想这种事了!这几乎与所有的好习惯都背道而驰,尽管我没有真正理解你的问题,但我可以说,这听起来像是一个坏主意,源于对所讨论的技术的一些基本错误理解。@markus:简而言之,他想用一个新的类替换现有的类,这应该扩展前一个类。坏主意,是的。你为什么不重命名这个类呢<代码>类基类\u扩展扩展基类?我不想说任何反对蛋糕的话。我不想说太多,因此只想简短地说:“而且可能值得超越正统的OOP基础知识”。问题是,这个蛋糕是建立在这个“正统的PHP基础知识”之上的。我向你保证,你迟早会破坏你的应用程序,即使是考虑到这样的黑客行为。真的再也不要想这样的事情了!这几乎与所有的好习惯都背道而驰,尽管我没有真正理解你的问题,但我可以说,这听起来像是一个坏主意,源于对所讨论的技术的一些基本错误理解。@markus:简而言之,他想用一个新的类替换现有的类,这应该扩展前一个类。坏主意,是的。你为什么不重命名这个类呢<代码>类基类\u扩展扩展基类?我不想说任何反对蛋糕的话。我不想说得太多,所以简短地说:“也许值得超越正统的OOP基础知识”。问题是,蛋糕是建立在o之上的