Composer使用命名空间覆盖/扩展类

时间:2014-04-30 06:51:39

标签: php namespaces composer-php autoload psr-0

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

现在,我认为如果客户端的覆盖类扩展了原始类会更好,因为我意识到这个的主要用途是仅编辑一些类方法,我希望将来证明“覆盖类”用于可能出现在“主类”中的新方法。我一直在努力实现这一目标,保留命名空间。

示例:销售控制器类==> \ APP \控制器\出售

  • 如果没有“Client / App / Controller / Sale.php”文件,则使用默认的“Main / App / Controller / Sale.php”
  • 但如果有,我想要的是“Client / App / Controller / Sale.php”能够扩展“主要/应用程序/控制器/销售.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”文件夹。但我无法找到可以实施的地方。

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

随时欢迎任何帮助或指导。

1 个答案:

答案 0 :(得分:1)

无解决方案,但解决方法

我最终分离了客户端和主类名称空间。然后,我创建了一个函数,它返回一个类名,并检查该类是否存在于客户端的文件夹中并添加&#34; Client \&#34;命名空间,或附加&#34; Main \&#34;初始化之前的命名空间

因此

$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();

此外,&#34;客户&#34;这些类的版本扩展了他们的&#34; Main&#34; --base-- class。

例如:Client\MyClass extends Main\MyClass