目前,我的课程中有一个非常普通的php自动加载器加载。我已经到了开发的某个阶段,我需要根据变量覆盖另一个类的类。我正在运行一个自定义SaaS应用程序,我们偶尔会有一个组织要求对系统运行方式进行一些奇怪的改变。在过去,我们用orgs的大量IF语句填充我们的代码垃圾,例如
if(ORGID == 'ABCD'){
//do this insane thing
}else{
//Normal code here.
}
所以,我一直在想着动态自动加载器的想法。 ORGID是应用程序中最早的定义之一。整个应用程序在COMPANY \ PRODUCT的固定名称空间下运行;这是我想我能做的代码示例。
class MyLoader {
static public function load($name) {
$temp = explode('\\',$name);
$class = array_pop($temp);
$name = str_replace('_',DIRECTORY_SEPARATOR,$class);
if(file_exists(ROOT.'includes/_classes/' . $name . '.php')){
include(ROOT.'includes/_classes/' . $name . '.php');
}
}
}
spl_autoload_register(__NAMESPACE__ .'\MyLoader::load');
由于ROOT和ORGID是在自动加载器发挥作用之前定义的,所以我考虑过这样做
class MyLoader {
static public function load($name) {
$temp = explode('\\',$name);
$class = array_pop($temp);
$name = str_replace('_',DIRECTORY_SEPARATOR,$class);
if(file_exists(ROOT.'includes/_classes/' . ORGID . '/' . $name . '.php')){
include(ROOT.'includes/_classes/' . ORGID . '/' . $name . '.php');
}elseif(file_exists(ROOT.'includes/_classes/' . $name . '.php')){
include(ROOT.'includes/_classes/' . $name . '.php');
}
}
}
spl_autoload_register(__NAMESPACE__ .'\MyLoader::load');
虽然这有效,但我必须将整个类复制/粘贴到org特定的类文件中,然后进行更改。我无法扩展主类,因为类共享相同的名称。我能够提出的唯一选择是允许我以这种方式扩展我的类是永远不会加载基类。
而不是
$myObj = new myClass();
我打电话
$myObj = new customMyClass();
我有一个名为customMyClass()的文件;它只是扩展myClass而不对其进行任何更改。这样,自动加载器将加载customMyClass,然后加载myClass。如果组织在其组织文件夹中有自己的customMyClass,那么它将加载到该类中,然后将在myClass中正确加载。
虽然这有效,但我们有数百个类文件,如果我们为每个文件都有一个自定义文件,它会加倍。
我见过几个使用eval来处理类似情况的例子。这真的是做这种事情的唯一方法吗?
更新: 所以我很清楚,最终的目标是让我们称之为$ myObj = new myClass()的成千上万个地方;不需要重写。