-
Symfony + Doctrine Model 方法覆盖 - [PHP]
2010-01-26
Symfony 1.4 集成的 Doctrine 是一款超强的 ORM 组件,提供了很多方便的功能,如针对字段自动生成的 get、set 方法。
但是如果在子类直接覆盖 get 方法后,一般做法是 parent::getXXX() 来获取原始值,如:
class Comment extends BaseComment { public function getContent() { $content = parent::getContent(); return htmlspecialchars($content); } }但是这样的结果却是程序死循环,最终崩溃。
分析 sfDoctrineRecord 源代码后可发现,__call 方法实际调用的是 $this->get($method),这个方法来自更上一级的 Doctrine_Record 类,但是上面的 getContent 方法若直接调用 $this->get('content') 结果依然是死循环,原来 Doctrine 在这里自作聪明的判断了下本类是否拥有 getXXXX 方法,如上例则是 getContent,若存在则直接调用 getContent,如此就造成了死循环。
分析 Doctrine_Record::get 方法可得知,若不存在 getContent 方法则调用 Doctrine_Record::_get 这么一个 protected 方法,如此我们便可将上例改成如下形式:
class Comment extends BaseComment { public function getContent() { $content = $this->_get('content'); return htmlspecialchars($content); } }这样虽然看起来不太好看,但也只能这样先用着。
评论