我正在编写一个轻量级ORM,它可以将数据库列映射到具有不同名称的实例字段
例如。
数据库
对象
要做到这一点,我原来的设计是这样的
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
指针,它确实知道它的类。
是否有针对此行为的解决方法或更好的架构?
答案 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);
}