php实例化多个对象,从单个PDO阵列实例化多个PHP对象(无需样板)

如果您想从数据库中获取单个对象,PDO非常有用:

$obj = $handle->fetchAll(PDO::FETCH_CLASS, $obj_name);

如果您希望在一行中返回多个类类型(例如:在进行JOIN时),则PDO不太有用:

$handle->fetchAll(PDO::FETCH_ASSOC);

我的问题是:当数组的内容可能反映所有,没有,某些或多于类所需的内容时,如何以优雅,健壮的方式从同一数组中实例化多个对象?

例:

给定PDO从数据库返回的数组$vars =(‘a’=> 1,’b’=> 2,’c’=> 3,’x’=> 7,’y’=> ; 8,’z’=> 9),构造对象ABC(需要$a,$b和$c)和XYZ($x,$y,$z),而不需要太多的复制和粘贴.

选项1

class ABC {

private $a, $b, $c;

function __construct ($a = null, $b = null, $c = null) {

$this->$a = $a ? $a : $this->a;

$this->$b = $b ? $b : $this->b;

...

(许多样板代码/复制粘贴/要求实例化代码已按正确顺序准备好所有变量)

选项2

function ABCFactory($vars = array()) {

return new ABC($vars['a'], $vars['b']....

(更好,但如果$vars中不存在数组键,则会抱怨.当然,我们可以使用isset()但这会使样板问题更严重)

选项3

foreach ($vars AS $key => $value) {

eval("if (isset(\$key) && \$value) \$this->$key = '$value';");

}

(它有效,它很整洁,它很整洁,它很容易重复使用,它会反映我添加的任何新类变量……但它是eval(),这让我做噩梦!:])

dockeryZ暗示了它,但mleko提供了答案.我之前没有听说过变量变量,但它们正是我想要的.我终于去了:

$def_vars = get_object_vars($this);

foreach ($vars AS $key => $value) {

if (array_key_exists($key, $def_vars)) $this->{$key}=$value;

}

但是,任何在将来发现这一点的人都应该记住Johan Perez的答案,而不是使用这个片段作为构造函数中的快捷方式…特别是如果输入数组来自用户的GET或POST参数!

最佳答案 干得好

class Name {

public function __construct($data) {

foreach($data as $key=>$val){

$this->{$key}=$val;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值