php类定位器或类路由
我正在寻找使用php类定位器的简单方法 我开发的应用程序适用于不同的客户,客户的要求非常相似,但有一些小的差异和例外。因此,所有客户机的代码几乎相同,但在为每个客户机实现例外方面存在一些差异 我希望对所有客户机使用相同的基本代码,我希望保持简单,但仍然允许为每个客户机进行自定义。它需要易于维护,我想降低圈复杂度 例如,假设我有这样一个a级:php类定位器或类路由,php,oop,design-patterns,Php,Oop,Design Patterns,我正在寻找使用php类定位器的简单方法 我开发的应用程序适用于不同的客户,客户的要求非常相似,但有一些小的差异和例外。因此,所有客户机的代码几乎相同,但在为每个客户机实现例外方面存在一些差异 我希望对所有客户机使用相同的基本代码,我希望保持简单,但仍然允许为每个客户机进行自定义。它需要易于维护,我想降低圈复杂度 例如,假设我有这样一个a级: namespace src; class A { public function f1() { // do something
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类。。。您建议的任何代码都不是我想要的,但比我使用的代码要好。。谢谢我的朋友@克鲁兹德尔苏尔-如果这是你一直在寻找的代码,接受我的答案。谢谢