我在这里这样做:
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;
}
}
如果我的类构造函数只有一个参数,这一切都很好。
如何使这个动态化,以便我可以在构造函数中包含其他参数。希望这是有道理的。
任何帮助都会很棒: - )
答案 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()
方法。但这似乎是一个坏主意,因为实体不应该包含自己的工厂。