我的应用程序只有一个入口点,我们称之为index.php
。
在index.php
中,它实例化如下的类;
final class Griff {
public $a, $b, $c, $d, $e;
public function __construct() {
spl_autoload_register(array($this, 'autoload',));
$this->a = 'a';
// blah blah blah
new RouterGriff($this);
}
private function autoload($name) {
// autoload function
}
}
new Griff();
您会注意到RouterGriff
内部Griff::__construct()
被实例化,RouterGriff
如下所示:
final class RouterGriff {
private $griff;
public function __construct(Griff $griff) {
$this->griff = $griff;
$this->griff->b = 'b';
$this->griff->c = 'c';
}
}
我的问题如下;你会注意到我正在为Griff
RouterGriff
中存储的属性设置变量,因为我想要一个注册表类型的结构到我的应用程序但不想使用单例。
如果我只是在RouterGriff
而不是Griff
中设置属性会更好吗?或者正在将Griff
传递给每个类有效的做事方式,考虑到我的应用程序在输出任何内容之前可以进入10个类?
我希望我有道理并感谢你
修改
另一方面,我这样做,
final class Griff {
public $a;
public function __construct() {
spl_autoload_register(array($this, 'autoload',));
$this->a = 'a';
// blah blah blah
new RouterGriff();
}
private function autoload($name) {
// autoload function
}
}
new Griff();
final class RouterGriff {
public $b, $c;
public function __construct() {
$this->b = 'b';
$this->c = 'c';
}
}
答案 0 :(得分:1)
您正在寻找的问题的答案被命名为“依赖注入”或“依赖注入容器”。这是一本填充书籍的广泛主题。如果您对此主题感兴趣,我建议您:Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin)
答案 1 :(得分:0)
如果你在谈论全局应用程序设置(我认为你是这样),只需使用常量。
它们是全球性的,但不能改变,它们易于编写和使用。
答案 2 :(得分:0)
我不认为将Griff
注入一切正常的事情是错误的。至于什么类可以获得哪些属性,我认为这取决于属性的性质。例如,我将在此示例中包含一个GriffRequest
,您将访问/存储路由器提供的已解析的参数,例如:
final class Griff {
protected $_request,
$_response,
$_router;
public function __construct() {
spl_autoload_register(array($this, 'autoload',));
$this->_request = new GriffRequest($this);
$this->_response = new GriffResponse($this);
$this->_router = new RouterGriff($this);
}
private function autoload($name) {
// autoload function
}
public function getRequest() { return $this->_request; }
public function getResponse() { return $this->_response; }
public function getRouter() { return $this->_router; }
}
final class RouterGriff {
protected $_application;
public function __construct(Griff $application) {
$this->_application = $application;
}
public function route() {
// do stuff with request
// assign params
$request = $application->getRequest();
$request->a = 'value';
$request->b = 'value2';
}
}
如果您使Griff
存储对应用程序的所有重要子模块的引用,然后将Griff
注入所有这些模块,那么您可以通过{{1}访问您可能需要的所有内容}} 在某一点。如果您认为链条很长,您可以随时使用便利设备。