PHP类继承和静态成员,正确的做事方式

时间:2012-06-26 16:17:57

标签: php inheritance static-members

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

例如。

数据库

  • 用户ID
  • 用户名
  • anotherpoorlynamedfield

对象

  • USER_ID
  • 用户名
  • 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的值是父类的值。如果isValidFieldstatic,我会理解这一点,但事实并非如此。它确实有一个$this指针,它确实知道它的类。

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

2 个答案:

答案 0 :(得分:1)

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

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

parent::isValidField($name) {
  // code here
}

答案 1 :(得分:1)

这是一个解决方案:

public function isValidField($name) {
  $class = get_class($this);
  return in_array(strtolower($name), $class::$db_to_obj);
}