覆盖PHP类实例

gbu*_*m89 1 php class object

我目前正在开发一个项目,我们正在开发一个应用程序,用于从一组文件/托管环境中为多个站点上的内容供电.

没有与名称,如一些PHP类model_account和model_vehicle其在指定的保存为类名单独的文件中定义.我们spl_autoload_register用来加载类文件如下(简化):

function my_autoloader($class_name) {
    if(substr($class_name, 0, 6)=='model_') {
        require_once('models/'.$class_name.'.php');
    }
}
Run Code Online (Sandbox Code Playgroud)

我们想要做的是,如果访问者正在访问站点xxx并且我们创建了一个类的实例,例如$account = new model_account();- model_xxx_account如果文件存在(models/model_xxx_account.php),实际创建一个类实例,但如果没有,则只包括models/model_account.php文件和创建一个实例model_account.

同样,如果访问者来自网站yyy,我们会想要使用model_yyy_accountif存在,但model_account如果不存在则完全返回.

基本上我们希望做的是在满足条件的情况下创建不同类的实例,但是从同一实例化调用创建.

我们没有使用像CI或Cake这样的现成框架.另外,我略微简化了这篇文章的命名约定.对不起,如果我的OO术语没有出现.

Ant*_*her 5

实际上听起来你应该使用某种工厂模式来处理你的类加载.

如果你这样做$account = new SomeClass(),那么真正最终得到一个对象是没有任何意义的class Bumblebee.

你应该在技术上有某种帐户工厂,决定给你哪个班级.

您的代码最终会看起来更像$account = AccountFactory::retrieveModel(),然后可以确定您要加载哪个模型而不委托给自动加载器.

自动加载器的要点是基本上说"我想要这个确切的类",并且不要轻易摇晃或特别是做出那种类型的决定.您的工厂实际上可以浏览您的文件结构并确定在函数调用中传回哪个类,并且在您的代码中您不依赖于new获取所需的模型,因为从理论上讲,您的所有帐户模型似乎都是共享相同的界面或至少扩展model_account.

AccountFactory基本上可以说," model_yyy_account存在,因此return new model().