我目前正在开发一个核心系统分布到许多不同客户端的项目 - 然后,如果客户端请求更改,我们必须在每个系统上单独制作它们,这意味着最终核心代码与客户端不同客户端,并使其保持最新并在整个系统中复制新功能很困难。
我建议我们转移到(我正在调用的)一个'覆盖模型',它具有代码的外部骨架结构。有点像:
|- controllers
|- models
|- views
|- core
|- controllers
|- Controller1.php
|- models
|- views
如果你想对Controller1.php进行更改,你可以将它复制到外部结构并进行更改 - 然后自动加载器会通过首先检查它们的Skeleton结构来加载相应的文件,即
Loader::controller('Controller1');
但是我想知道是否有可能比这更进一步 - 如果需要进行更改,它会很好地覆盖控制器,但随后可能不会添加任何未来的核心添加或修复。所以我认为你可以可能会创建该文件的副本,并仅覆盖单数方法调用。我的意思的一个例子如下:
class Override {
public function __call($method, $args) {
return call_user_func_array(array('Something', $method), $args);
}
public static function __callStatic($method, $args){
return call_user_func_array(array('Something', $method), $args);
}
}
// Core class
class Something {
static function doTest() {
echo "Class something <br/>";
}
static function doOtherTest() {
echo "That works <br/>";
self::doTest();
}
}
// Overriding class - named differently for ease of example and reasons explained later
class SomethingElse extends Override {
private static function doTest() {
echo "Success <br/>";
}
}
// Actual function calling
SomethingElse::doTest();
SomethingElse::doOtherTest();
一般的想法是,如果该方法在原始类中不存在,则从“父”类(在此处硬编码)中对其进行操作。但是我对这个方法有两个问题:
目前我正在尝试使用加载器来完成全班覆盖的初始解决方案,这种方法有效且不太复杂。
但是我想知道StackOverflow上的任何一个好主意是否可能知道任何答案或设置可能有助于解决方法覆盖想法的问题 - 请记住我正在使用现有的系统设置,虽然骨架结构的想法是我试图实现的,以便对改变的内容进行某种形式的“控制”。理想情况下,当有人想要覆盖方法或类似方法时,核心中的任何内容都不会改变(至少不会太多)。
答案 0 :(得分:3)
我们刚刚解决了它。这是特质!
但严重的是将版本化代码转换为特征,然后在上述结构中的非版本化文件中调用它们。这样就不需要加载器类和其他冲突防护层,并允许更新,测试和提交核心代码,而不会影响每个客户端的自定义代码。
答案 1 :(得分:1)
严格的OO种类解决方案肯定会将您的控制器作为抽象接口传播,可以通过几种不同的现实世界方法实现,然后通过组合而不是继承原则汇集在一起。
据我所知,你现在已经有了想要覆盖或扩展的现有代码。如果您的PHP版本允许您使用Traits,这也可能对您有所帮助:
PHP 5.4: why can classes override trait methods with a different signature?