0

我的应用程序有一个单一的入口点,我们称之为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吗?或者考虑到我的应用程序在输出任何内容之前可以深入 10 个类,是否将传递Griff给每个类是一种有效的做事方式?

我希望我说得通,谢谢

编辑

换一种方式,我想这样做,

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';
    }
}
4

3 回答 3

1

您正在寻找的问题的答案被命名为“依赖注入”或“依赖注入容器”。这是一本题材广泛的填书书籍。如果你对这个话题感兴趣,我可以建议你:Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin)

于 2012-07-21T20:49:08.710 回答
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访问您可能需要的所有内容。Griff如果你觉得链条太长,你总是可以做方便的吸气剂。

于 2012-07-21T20:52:55.663 回答
0

如果您正在谈论全局应用程序设置(我认为您是),只需使用常量。

它们是全局的,但无法更改,并且易于编写和使用。

于 2012-07-21T20:10:16.997 回答