3

我有一个命名空间(例如\App\),其中包含我封装的所有应用程序,目前我正在使用 composer 使用 PSR-0 自动加载此命名空间并检查两个不同的文件夹,“Main”“Client”。(优先考虑客户端文件夹,允许我通过仅在客户端文件夹中创建必要的覆盖文件来覆盖主应用程序功能以满足客户端的请求)

现在,我想如果客户端的覆盖类扩展原来的类会更好,因为我意识到这样做的主要用途是只编辑一些类方法,我想在未来证明“覆盖类" 用于可能出现在“主类”中的新方法。我一直在努力寻找一种方法来实现这一点,即保留命名空间。

示例:销售控制器类 ==> \App\Controller\Sale

  • 如果没有“Client/App/Controller/Sale.php”文件,则使用默认的“Main/App/Controller/Sale.php”
  • 但如果有,我想要的是“Client/App/Controller/Sale.php”可以扩展“Main/App/Controller/Sale.php”

    <?php 
      namespace App\Controller
      use \Main\Controller\Sale as OriginalClass //The Sale class in Main Folder
    
      class Sale extend OriginalClass {...}
    
  • 这样,我可以只覆盖客户端类中的一些方法,如果主类得到更新,它将反映在客户端的应用程序中。

问题是,由于客户端和主类都在\App\命名空间中,我想不出一种方法来让上面的“use”语句工作。主要原因是我放入的任何前置命名空间(在示例中为"\Main + namespace)都不起作用,因为文件的命名空间会有所不同。

我认为它可以工作的另一种方法是修改作曲家自动加载,并检查命名空间是否以“Main”或“Original”开头,然后从命名空间中删除该部分并强制使用“Main”文件夹。但我找不到可以实施的地方。

我考虑的另一个解决方案是在子类中细分主类功能,可以使用当前的自动加载方案覆盖,但我不知道将这么多类和文件分散在系统中是否明智。

任何帮助或指导总是受欢迎的。

4

1 回答 1

1

没有解决方案,但有解决方法

我最终将客户端和主类命名空间分开。然后,我创建了一个函数来接收类名并检查该类是否存在于客户端的文件夹中,并在“Client\”命名空间之前添加,或者在初始化之前添加“Main\”命名空间。

所以

$class = "Path\\To\\My\\Class";
$class = checkClass($class);
// Now class is either "Client\\Path\\To\\My\\Class; or Main\\Path\\To\\My\\Class;

//Uses:
$object = new $class();
$static = $class::StaticMethod();

此外,类的“客户端”版本扩展了它们的“主”--base-- 类。

例如:Client\MyClass extends Main\MyClass

于 2014-05-27T13:48:00.343 回答