我正在为网站添加一个许可部分,我正在遇到一个与PDO讨厌的小问题。我创建了一个ClearanceItem类来保存单个项目的信息。该项的所有属性都受到保护,我为它们创建了访问器和更改器。我用这种方式创建了这个类有两个原因:
我希望能够遍历PDO结果集,为每一行自动获取我的ClearanceItem类的新实例。通过设置获取模式或使用PDOStatement :: fetchObject()可以轻松完成此操作。虽然属性受到保护,但我遇到了问题。似乎当PDO创建一个类的新实例时,它使用一个名为Reflection Injection的东西来设置属性。这意味着受保护的属性由PDO直接设置,绕过我创建的mutator。由于这些属性应该是数字(并且由mutator设置为这样)被设置为字符串。最糟糕的是,我正在使用MySQL GROUP_CONCAT将多个商店和库存的信息作为单个字符串返回,然后mutator应该拆分成一个数组。因为PDO直接设置此属性,所以它最终为字符串。
我可以通过使用工厂方法从结果集行返回的数组创建ClearanceItem的新实例来轻松解决此问题。这似乎是一个不必要的额外步骤。有没有人知道PDO是否可以为记录集中的每一行返回一个类的实例,同时让它尊重属性可见性,使用mutator来设置属性?
答案 0 :(得分:1)
我刚刚验证过,它将为每个属性集调用函数__set()。
class test { function __construct() { print "Constructor\n"; var_dump(func_get_args()); } function __get($x) { print "In get\n"; var_dump($x); } function __set($x, $y) { print "In set\n"; var_dump($x); } } $m = getMasterPDODB(); $stm = $m->prepare("SELECT * FROM users"); if( $stm && $stm->execute() ) { while( $cls = $stm->fetchObject("test") ) { var_dump($cls); } }
给了我
Constructor array empty In set string 'id' (length=2) In set string 'active' (length=6) In set string 'email' (length=5) In set string 'passphrase' (length=10) In set string 'details' (length=7) object(test)[5] Constructor array empty In set string 'id' (length=2) In set string 'active' (length=6) In set string 'email' (length=5) In set string 'passphrase' (length=10) In set string 'details' (length=7) object(test)[6] Constructor array empty In set string 'id' (length=2) In set string 'active' (length=6) In set string 'email' (length=5) In set string 'passphrase' (length=10) In set string 'details' (length=7) object(test)[5] Constructor array empty In set string 'id' (length=2) In set string 'active' (length=6) In set string 'email' (length=5) In set string 'passphrase' (length=10) In set string 'details' (length=7) object(test)[6] Constructor array empty In set string 'id' (length=2) In set string 'active' (length=6) In set string 'email' (length=5) In set string 'passphrase' (length=10) In set string 'details' (length=7) object(test)[5]
由于我的细节是一个json对象,我可以从那里解析它到所需的字段。你可以让它调用你从那里创建的mutators。这似乎是没有疯狂忍者魔法的最佳方式。