php:类懒惰加载?

Tim*_*nen 5 php

我有一个问题,这是我过去几天一直在考虑的问题.在php应用程序中,您需要执行以下操作:

  1. 定义它
  2. 像这样运行一个函数:(使用自动加载和注册表对象)
  3. $ registry-> obj = new mathClass($ var1,$ var2); //创建对象,其中$ var1保存数据库对象,$ var2保存值1
  4. $登记处送交> obj->计算( '值'); //获取产品行并返回其总值.这样在脚本中的任何时候我都可以简单地运行我事先定义的计算函数(或其他一些函数).

想象一下,一个Web应用程序有数百个类,这些类可能需要或可能不需要这个特定的页面加载,但只能在应用程序的开头定义.我想要的解决方案就是运行

$obj->calculate('price'); 
Run Code Online (Sandbox Code Playgroud)

没有创建对象,例如像这样

mathclass::calculate('price'); 
Run Code Online (Sandbox Code Playgroud)

然后根据需要自动加载数学类而不需要主要开销,这里的问题是我不能再在数学类中给出任何变量

($var1,$var2).
Run Code Online (Sandbox Code Playgroud)

我想要的是能够伪造对象而不需要对类发生任何自动加载,以免增加开销,但是对象用变量创建自己,但只有当我真的需要用它做什么时.

我的意思是php真的希望我在开始时定义每个类,以便我以后可以使用它们吗?这是懒人装吗?急切加载?

我可能会解释这个问题,所以请指出我正确的方向.

编辑2015:简单的伪代码示例解决方案:

class Service {
    private $cb, $instance;
    public function __construct($cb){
        $this->cb = $cb;
    }
    public function __invoke() {
        if(!$this->instance){
            $this->instance = call_user_func($this->cb);
        }
        return $this->instance;
    }
}

// setup autoloading
set_include_path(__DIR__.'/vendor'. PATH_SEPARATOR .get_include_path()); // optional
spl_autoload_register(function($c){
    include preg_replace('#\\\|_(?!.+\\\)#','/',$c).'.php';
});

// simple dependency injection
$service['db'] = new Service(function(){
    return new Database('sqlite::filename.sqlite');
});
$service['config'] = function() use(&$service){
    return new Config($service['db']());
};
$service['math'] = function() use(&$service){
    return new Math($service['config']());
};

// usage
$service['math']()->calculate('price');
Run Code Online (Sandbox Code Playgroud)

Gor*_*don 5

使用依赖注入框架。它使您可以从配置文件中配置类,并且在需要一个类时,只需通过服务构建器对其进行调用。