在构造方法中启动另一个类?

时间:2014-05-02 09:52:01

标签: php class oop constructor

我正在尝试更多地简化我的PHP代码,我还没有找到我的团队成员之一正在使用的这种方法的答案。我也没有在网上的任何地方看到过这种情况。

以下是我正在处理的Web应用程序中的代码示例。

<?php

class ArticlesHandler {
   public function __construct() {
      require 'Articles.php';
      $articles = new Articles;
   } 
}

?>

在另一个类中初始化一个类是否合适?

对我来说,这似乎不是init类一起工作的正确标准。

4 个答案:

答案 0 :(得分:2)

是和否。它有效,但这个特殊的代码可能会导致许多问题。

  1. 您应该使用require_once而不是require来避免两次包含同一文件的错误。因为这里的代码将使您的应用程序完全停止:

    new ArticlesHandler;
    new ArticlesHandler;
    
  2. 这会创建与Articles类的硬耦合。您应该可能使用dependency injection并将Article的实例传递给ArticlesHandler的构造函数。请参阅How Not To Kill Your Testability Using Statics

答案 1 :(得分:1)

是的,在构造函数中调用构造函数是正确和正常的。没有什么奇怪/不好的。

答案 2 :(得分:1)

这就是我通常做的事情。

class Repository {

     protected $_models = array();

     public function getModel($model, array $params = array()){
        require_once $model.'.php'; //Replace this with an autoloader
        if(empty($this->_models[$model])){

             if(!empty($params)){
                    $this->_models[$model] = new $model($params);
             } else {
                   $this->_models[$model] = new $model();
             }

         }

        return $this->_models[$model];
     }
} 

并像这样打电话给另一个班级。

   class ArticlesHandler extends Repository {
       public function __construct() {
          $articles = $this->getModel('Articles');
       } 
    }

答案 3 :(得分:0)

似乎是对的。
对我来说,这似乎不是init类一起工作的正确标准。

如果您想在Articles

中使用Articles课程,可以延长ArticlesHandler课程