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_Design Patterns - Fatal编程技术网

php类定位器或类路由

php类定位器或类路由,php,oop,design-patterns,Php,Oop,Design Patterns,我正在寻找使用php类定位器的简单方法 我开发的应用程序适用于不同的客户,客户的要求非常相似,但有一些小的差异和例外。因此,所有客户机的代码几乎相同,但在为每个客户机实现例外方面存在一些差异 我希望对所有客户机使用相同的基本代码,我希望保持简单,但仍然允许为每个客户机进行自定义。它需要易于维护,我想降低圈复杂度 例如,假设我有这样一个a级: namespace src; class A { public function f1() { // do something

我正在寻找使用php类定位器的简单方法

我开发的应用程序适用于不同的客户,客户的要求非常相似,但有一些小的差异和例外。因此,所有客户机的代码几乎相同,但在为每个客户机实现例外方面存在一些差异

我希望对所有客户机使用相同的基本代码,我希望保持简单,但仍然允许为每个客户机进行自定义。它需要易于维护,我想降低圈复杂度

例如,假设我有这样一个a级:

namespace src;

class A
{
   public function f1()
   {
       // do something  
   }

   public function f2()
   {
       // do something  
   }

   public function F()
   {
       return $this->f1() + $this->f2();
   }
}

类实现默认行为或最常用的路径。对于一些客户来说,这是有效的

其他客户机在一个或多个方法中需要特殊的行为,所以我的第一个方法是在每个方法中使用一些if,就像这样

class A
{
   public function f1()
   {
       if (CLIENT === 'peter') {
           // do something for client peter  
       } elseif (CLIENT === 'mary') {
           // do something for client mary  
       } else {
           // default client
       }
   }
}
它可以工作,但我不喜欢,因为我有很多客户机,并且变得难以阅读、测试和维护,每个方法的代码都变得很长

第二种方法,我尝试为每个客户机扩展主类,比如

namespace src\peter;

class A extends \src\A
{
    public function f1()
    {
        // do something for client peter
    }
}

当我需要使用它时:

if (CLIENT === 'peter') {
    $className = src\peter\A::class;
} elseif (CLIENT === 'mary') {
    $className = src\mary\A::class;
} else {
   $className = src\A::class;
}

$object = new $className();
$object->f();

它工作得更好,因为在分离的类上为每个客户机分离方法实现,看起来更干净,但我仍然有两个问题:

1-在像phpstorm这样的IDE中,我无法通过单击方法或类名来导航代码,这是因为类名现在是可变的

2-我仍然有那个if on代码

我正在寻找更干净的解决方案,在配置文件和我只想编写的代码中将当前客户机定义为CONST

$a=新a

A可以是src\peter\A;或src\mary\A;取决于我如何配置它,如果没有为配置的客户端定义类A,则默认类src\A;应该使用

可以使用这样的类定位器吗

谢谢

这个代码呢

$clientClassName = 'src\\'.CLIENT.'\A';
$baseClassName = 'src\A';

if (class_exists($clientClassName) && is_subclass_of($clientClassName, $baseClassName)) {
    $className = $clientClassName;
} else {
    $className = $baseClassName;
}

$object = new $className();
$object->f();

您必须检查是否没有隐藏的php/namespace/etc错误,但它应该可以工作。

是的,它可以工作,但我仍然有一个问题:当您单击方法或变量时,无法从phpstorm导航…@CruzDelSur-因为phpstorm不知道$className result的值是多少,它在运行时填充。但是你可以试着把这个放在$baseClassName之前:/**var$baseClassName src\A*/我明白你的观点@shaggy,我理解问题是因为$className是在运行时填充的,这就是我寻找某种不需要变量的类定位器的方式。。。不确定是否可能,about/**@var$baseClassName src\A*/适用于basename类,但不适用于clintes类。。。您建议的任何代码都不是我想要的,但比我使用的代码要好。。谢谢我的朋友@克鲁兹德尔苏尔-如果这是你一直在寻找的代码,接受我的答案。谢谢