10

我目前正在开展一个项目,其中核心系统分发给许多不同的客户 - 然后如果客户请求更改,我们必须在每个系统上单独制作它们,这意味着最终核心代码因客户而异,保持最新并在整个系统中复制新功能是很困难的。

我建议我们转向(我所说的)一个“覆盖模型”,它具有代码的外部骨架结构。有点像:

|- controllers
|- models
|- views
|- core
    |- controllers
         |- Controller1.php
    |- models
    |- views

如果您想更改 Controller1.php,您可以将其复制到外部结构中并进行更改 - 如果存在相应的文件,自动加载器将首先通过检查骨架结构来加载相应的文件,即

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 上是否有任何伟大的思想家可能知道任何可能有助于解决方法覆盖思想问题的答案或设置 - 请记住我正在使用现有系统设置,尽管骨架结构理念是我试图实现的,以对改变的内容进行某种形式的“控制”。理想情况下,当有人想要重写方法或类似方法时,核心中的任何内容都不会改变(至少不会改变太多)。

4

2 回答 2

3

好吧,我们刚刚解决了它。特点就是!

但认真地通过将版本化代码转换为特征,然后在上述结构中的非版本化文件中调用它们。然后,这消除了对加载器类和其他冲突预防层的需求,并允许更新、测试和提交核心代码,而不会影响每个客户端的自定义代码。

于 2012-12-21T11:04:11.770 回答
1

好吧,严格的 OO 类型的解决方案肯定是将您的控制器作为抽象接口传播,这些接口可以通过几种不同的现实世界方法实现,然后通过继承原则组合在一起。

据我了解,您在这里有想要覆盖或扩展的现有代码。如果您的 PHP 版本允许您使用 Traits,这也可能对您有所帮助:

PHP 5.4:为什么类可以覆盖具有不同签名的特征方法?

于 2012-12-20T13:13:23.047 回答