使用PDO获取对象的新实例时出现问题

时间:2010-11-28 17:22:31

标签: php pdo

我正在为网站添加一个许可部分,我正在遇到一个与PDO讨厌的小问题。我创建了一个ClearanceItem类来保存单个项目的信息。该项的所有属性都受到保护,我为它们创建了访问器和更改器。我用这种方式创建了这个类有两个原因:

  1. 我可以在设置属性时验证它们。这对我来说很重要,因为数据库是根据客户端维护的Excel文件的时间表填充的。使用mutators,我可以验证excel文件中的信息是否在一定范围内。
  2. 由于该网站使用英语和法语,因此访问者可以根据视图的语言正确格式化数据(例如价格)。
  3. 我希望能够遍历PDO结果集,为每一行自动获取我的ClearanceItem类的新实例。通过设置获取模式或使用PDOStatement :: fetchObject()可以轻松完成此操作。虽然属性受到保护,但我遇到了问题。似乎当PDO创建一个类的新实例时,它使用一个名为Reflection Injection的东西来设置属性。这意味着受保护的属性由PDO直接设置,绕过我创建的mutator。由于这些属性应该是数字(并且由mutator设置为这样)被设置为字符串。最糟糕的是,我正在使用MySQL GROUP_CONCAT将多个商店和库存的信息作为单个字符串返回,然后mutator应该拆分成一个数组。因为PDO直接设置此属性,所以它最终为字符串。

    我可以通过使用工厂方法从结果集行返回的数组创建ClearanceItem的新实例来轻松解决此问题。这似乎是一个不必要的额外步骤。有没有人知道PDO是否可以为记录集中的每一行返回一个类的实例,同时让它尊重属性可见性,使用mutator来设置属性?

1 个答案:

答案 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。这似乎是没有疯狂忍者魔法的最佳方式。

相关问题