通过扩展的PHP动态自动加载程序

通过扩展的PHP动态自动加载程序,php,oop,Php,Oop,目前,我的类中有一个相当普通的php自动加载程序。在开发过程中,我需要用另一个基于变量的类重写一个类。我正在运行一个定制的SaaS应用程序,我们偶尔会有一个组织要求对系统的运行方式进行一些奇怪的更改。在过去,我们用大量的IF语句来填充代码中的垃圾,比如 if(ORGID == 'ABCD'){ //do this insane thing }else{ //Normal code here. } 所以,我一直在玩弄动态自动装载机的想法。ORGID是应用程序中最早的定义之一。整个

目前,我的类中有一个相当普通的php自动加载程序。在开发过程中,我需要用另一个基于变量的类重写一个类。我正在运行一个定制的SaaS应用程序,我们偶尔会有一个组织要求对系统的运行方式进行一些奇怪的更改。在过去,我们用大量的IF语句来填充代码中的垃圾,比如

if(ORGID == 'ABCD'){
    //do this insane thing
}else{
    //Normal code here.
}
所以,我一直在玩弄动态自动装载机的想法。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/' . $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');
虽然这样做有效,但我必须将整个类复制/粘贴到特定于组织的类文件中,然后进行更改。我无法扩展主类,因为这些类共享相同的名称。我能想到的唯一一个允许我以这种方式扩展类的选项是永远不要加载基类

而不是

$myObj = new myClass();
我打电话

$myObj = new customMyClass();
我有一个名为customMyClass的文件;它只是扩展了myClass而没有对其进行任何更改。这样,自动加载程序将加载customMyClass,然后加载myClass。如果一个组织在其组织文件夹中有自己的customMyClass,那么它将加载到该类中,然后该类将正确加载到myClass中

虽然这样做有效,但我们有数百个类文件,如果每个类文件都有一个自定义文件,那么这些类文件的数量将增加一倍

我已经看到了几个使用eval处理类似情况的示例。这真的是做这类事情的唯一方法吗

更新:
我很清楚,最终目标是让我们称之为$myObj=newmyclass的数千个地方;不需要重写。

参考提交:public_html/includes/_classes/*建议您将php类放在可公开访问的目录中。这不是一个好的做法…当您定义类时,请尝试使用use操作符为类指定一个不同的名称。请看:@GameCharmer我道歉,我上面的评论确实让人觉得很粗鲁。我想建议你的是,在事态进一步恶化之前,现在就把它清理干净。依靠自动加载器,目录切换的魔力只会变成维护的噩梦。你的课程应该遵守和principals@GameCharmer是的,如果你做了类似的事情,用这个类作为那个类;然后你可以这样做:class这个类扩展了这个类,应该可以解决你的问题。正如@Phil所指出的,我认为这只是一个暂时的解决办法。我了解旧代码库的不稳定情况,正在缓慢升级,并祝您在崇高的任务中好运。