关于具有单一入口点的应用程序的基本OOP架构 - PHP?

时间:2012-07-21 19:47:36

标签: php oop

我的应用程序只有一个入口点,我们称之为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';
    }
}

3 个答案:

答案 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}访问您可能需要的所有内容}} 在某一点。如果您认为链条很长,您可以随时使用便利设备。