0

我正在编写一个轻量级 ORM,它可以将数据库列映射到具有不同名称的实例字段

例如。

数据库

  • 用户身份
  • 用户名
  • 另一个名不见经传的田野

目的

  • 用户身份
  • 用户名
  • another_poorly_named_field

为此,我的原始设计是这样的

abstract class DbObj {
    /* In a subclass the author would provide the mapping of fileds
     * from the database to the object
     * e.g.
     * array('userid' => 'user_id', 'username' => 'username'....
     */
    protected static $db_to_obj = array();

    /* This would be auto popuplated from $db_to_obj in reverse */
    protected static $obj_to_db = array();

    /* Many Methods truncated... */

    /* Used by magic methods to make sure a field is legit */
    public function isValidField($name) {
         return in_array(strtolower($name), self::$db_to_obj);
    }
}

然后我将其子类化

class Cat extends DbObj {
     protected static $db_to_obj = array(
         'catsname' => 'name',
         'itsage' => 'age'
     );
}

isValidField方法没有按预期工作。使用调试器或老式的var_dump,您会发现 的值self::$db_to_obj是父类的值。如果isValidField是,我会理解static,但事实并非如此。它确实有一个$this指针,并且它确实知道它的类。

是否有解决此行为的方法或使用更好的架构?

4

2 回答 2

1

使用继承时不要同时创建受保护和静态的变量。

如果您使用继承,您可以/应该执行以下操作:

parent::isValidField($name) {
  // code here
}
于 2012-06-26T16:24:38.613 回答
1

这是一个解决方案:

public function isValidField($name) {
  $class = get_class($this);
  return in_array(strtolower($name), $class::$db_to_obj);
}
于 2012-06-26T16:27:43.523 回答