动态地将正确数量的参数传递给类构造函数

时间:2017-05-17 08:19:50

标签: php mysqli

我在这里这样做:

public function fetch($className) 
{ 
   $rows = array();
   while($r = $this->result->fetch_object() { 
      $rows[] = new $className($r);
   }
   return $rows;
}

构造

class User
{
   public $dbh;
   public $row; 
   public function __construct($dbh, $row = null) 
   {
      $this->dbh = $dbh;
      $this->row = $row;
   }
   public function getAll()
   { 
      return $this->dbh->query('SELECT * FROM users')->fetchAll();
   }
   public function getFirstName()
   {
      return $this->row->first_name;
   }
}

如果我的类构造函数只有一个参数,这一切都很好。

如何使这个动态化,以便我可以在构造函数中包含其他参数。希望这是有道理的。

任何帮助都会很棒: - )

1 个答案:

答案 0 :(得分:0)

取决于。

嗯,这确实取决于你的通用代码风格。例如。我不喜欢在我的SQL代码附近使用new。似乎很多SRP违规。

我倾向于做的事情看起来像这样:

public function applyValues($instance, array $parameters)
{
    foreach ((array) $parameters as $key => $value) {
        $method = 'set' . str_replace('_', '', $key);
        if (method_exists($instance, $method)) {
            $instance->{$method}($value);
        }
    }
}

我个人认为这是一个黑客攻击,但它可以很好地解决我的其余代码的设计问题。

如果您使用的是PHP 5.6+,则可以使用variadics

这看起来像是:

public function fetch($className) 
{ 
   $rows = array();
   while($parameters = $this->result->fetch_object() { 
      $rows[] = new $className(...$parameters);
   }
   return $rows;
}

但是这种方法非常脆弱,需要$parameters数组中的严格顺序。

还有第三种选择:以这种方式设计代码,在所有域实体中都有populate()方法。但这似乎是一个坏主意,因为实体不应该包含自己的工厂。