我有一个问题,这是我过去几天一直在考虑的问题.在php应用程序中,您需要执行以下操作:
想象一下,一个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真的希望我在开始时定义每个类,以便我以后可以使用它们吗?这是懒人装吗?急切加载?
我可能会解释这个问题,所以请指出我正确的方向.
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)
| 归档时间: |
|
| 查看次数: |
6584 次 |
| 最近记录: |