【问题标题】:Init another class in construct method?在构造方法中初始化另一个类?
【发布时间】:2014-05-02 09:52:00
【问题描述】:

我正在考虑尝试进一步简化我的 PHP 代码,但我的团队成员之一正在使用这种方法,我还没有找到答案。我也从未在网络上的任何地方看到过这样做。

这是他正在和我一起开发的我们的 Web 应用程序的代码示例。

<?php

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

?>

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

对我来说,这似乎不是让类一起工作的适当标准。

【问题讨论】:

    标签: php class oop constructor


    【解决方案1】:

    是和不是。它可以工作,但是这个特定的代码可能会导致许多问题。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        这是我通常做的。

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

        【讨论】:

        • 语法错误:if(empty($this-&gt;_models[$model)){ 应该是:if(empty($this-&gt;_models[$model])){。但是无法编辑您的帖子:(
        • @briosheje 感谢您指出错误。修改了代码。
        • 在实例化类之后您正在requireing 文件...?!
        • @deceze 哎呀。另一个错误。感谢您指出。我已经更正了。
        • @halfer 谢谢。完成。
        【解决方案4】:

        似乎是对的。
        对我来说,这似乎不是让类一起工作的适当标准。

        如果您想在ArticlesHandler 中使用Articles 类,可以扩展Articles

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-04
          • 2016-01-08
          • 1970-01-01
          • 2013-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多