我正在构建基于现有MVC框架的应用程序。
本机应用程序通过创建一个注册表对象来引导,然后用所需的所有类填充它,这很棒。
$registry = new \App\Registry;
$loader = new \App\Loader;
$registry->set('load', $loader);
但是当后代类需要访问注册表或另一个实例化对象时,它们会传入注册表对象并将其设置为新类对象中的变量。
$theme = new \App\Theme($registry);
$registry->set('theme', $theme);
然后在主题类中:
class Theme {
private $registry;
public function __construct($registry) {
$this->registry = $registry;
}
}
这是在每个实例上创建递归,并且当应用程序到达前端控制器类时,这是一个巨大的膨胀对象,带有大量递归,这是完全没必要的。
我知道使用全局变量是不受欢迎的,除非绝对需要,否则我不会使用它们,但是仅仅将注册表对象作为全局调用它而不是所有它都不会更有效率这个臃肿?
我的解决方案是将注册表作为给定类中方法中的全局调用,我需要访问已注册的对象。
例如在我的例子中,假设我需要从Theme中的方法中访问loader对象。
class Theme {
public function __construct() {
$this->setName();
}
public function setName() {
global $registry;
$loader = $registry->get('load');
$loader->setName();
}
}
这样就无需将注册表设置为主题内的变量,因此每个对象只创建一次。
这种方法有什么问题吗?有安全问题吗?是否有另一种技术可以产生我想要的结果而不使用全局引用?