• 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);
        }
    }

    这样虽然看起来不太好看,但也只能这样先用着。

    评论

发表评论

记住我