在阅读了答案之后,我重写了我的问题。
假设我有一个理论上的PHP应用程序,它使用做不同事情的对象。
对于应用程序加载的每个页面,将运行不同的脚本。
现在我制作了一个简单的PHP脚本,创建了一个简单的对象。
(这都是编造的,我只是想在编代码之前理解它)
$user = new userClass($db);
$user->login($credentials);
一切都很好,我甚至可以在创建用户类之后重复这个过程几次
$user = new userClass($db);
$user->login($credentials);
...
$user->login($credentials2);
现在想象一下,如果这两个部分被分成两个不同的PHP文件。
file1:
$user = new userClass($db);
$user->login($credentials);
file2:
$user->login($credentials2);
include file1
include file2
如果按顺序运行,那么一切都可以,但是如果没有,或者如果根本不包括file1…
file2:
$user->login($credentials);
file1:
$user = new userClass($db);
$user->login($credentials2);
include file2
include file1
那它就不起作用了…它们必须保持顺序,所以让我们创建一个主PHP文件,不管加载什么。
main file:
$user = new userClass($db);
file1:
$user->login($credentials);
file2:
$user->login($credentials2);
(例如,包括自动加载的文件)
包括主要
包含文件1
包含文件2
或
包括主要
包含文件2
包含文件1
或
包括主要
包含文件2
现在,文件1和2可以按任意顺序加载,其中一个不依赖于另一个,但是如果文件1和文件2都是不必要的呢?
main file:
$user = new userClass($db);
//nothing else gets loaded
那么,主文件也是不必要的,并且将被证明是一个资源占用者,当然,如果它的一个类没有问题,但是如果主文件加载了数百个从未使用过的类呢?
一点也不优雅。
然后,让我们尝试另一种方式,让我们完全废弃主文件,然后这样做(下面是我想要实现的目标的基本示例):
file1:
if(!is_object($user)){
$user = new userClass($db);
}
$user->login($credentials);
file2:
if(!is_object($user)){
$user = new userClass($db);
}
$user->login($credentials2);
当然可以,但它不优雅,现在是吗?
让我们试试方法重载…
class loader {
private $objects;
private $db;
function __construct($db){
$this->objects = array();
$this->db = $db;
}
function __get($name){
if(!isset($this->objects[$name])){
return $this->objects[$name] = new $name($this->db);
}
}
}
main file:
$loader = new loader($db);
file1:
$loader->user->login($credentials);
file3:
$loader->user->login($credentials3);
file2:
$loader->user->login($credentials2);
file4:
$loader->user->login($credentials4);
似乎可以工作,直到你意识到你不能再给任何以这种方式创建的对象任何其他变量,除了$db。
这意味着加载器类仅限于与用户类一起使用(例如)
因为将加载器类与任何其他类一起使用将需要编辑加载器类
简单的脚本如下:
$user = new userClass($this->db);
$user->login($credentials);
$form = new formClass($_POST);
$form->process($info);
将需要两个单独的加载程序类或加载程序类中至少两个方法
class loader {
private $objects;
private $db;
function __construct($db){
$this->objects = array();
$this->db = $db;
}
function getuserclass($name){
if(!isset($this->objects[$name])){
return $this->objects[$name] = new $name($this->db);
}
}
function getformclass($name){
if(!isset($this->objects[$name])){
return $this->objects[$name] = new $name($_POST);//just an unrealistic example.
}
}
}
main file:
$loader = new loader($db);
file1:
$loader->getuserclass('user')->login($credentials);
file3:
$loader->getformclass('form')->process($info);
但这也不优雅。
这是怎么回事
真正地
应该完成吗?