Php Doctrine2代理getId魔术方法?

Php Doctrine2代理getId魔术方法?,php,doctrine-orm,Php,Doctrine Orm,Doctrine2似乎在为其代理对象添加延迟加载的魔力。这使得我的结果不正确,我无法找出原因 这是我的班级模型: 类“RedProduct”继承自抽象类“Product”,后者实现接口“BaseProduct” 抽象类产品拥有主键: abstract class Product implements BaseProduct { /** @Id @Column (type="integer", name="ID") @GeneratedValue */ protected $id;

Doctrine2似乎在为其代理对象添加延迟加载的魔力。这使得我的结果不正确,我无法找出原因

这是我的班级模型:

类“RedProduct”继承自抽象类“Product”,后者实现接口“BaseProduct”

抽象类产品拥有主键:

abstract class Product implements BaseProduct {
   /** @Id @Column (type="integer", name="ID") @GeneratedValue */
    protected $id;

    public function getId() {    
        return $this->id;        
    }                            
}
我希望RedProduct在返回id之前在id前面加上字母“R”

class RedProduct extends Product {
    public function getId() {
       return 'R' . $this->id;
    }
}
但是在proxy类中,getId()方法(并且只有getId()方法)被修改为:

public function getId()
{
    if ($this->__isInitialized__ === false) {
        return $this->_identifier["id"];
    }
    $this->__load();
    return parent::getId();
}
这意味着我的对象在未初始化时不会返回正确的id! “getId”是Doctrine2的保留方法还是神奇方法?当我在基类和继承类中创建其他方法时,它对代理没有这种影响。如果在代理上检查getId()方法,您将看到它有以下行:

return parent::getId();
这意味着它将调用在模型类(RedProduct)上定义的getId()函数,因为所有代理都扩展了相应的模型。问题出在别处


我不确定您试图通过修改模型返回的id来实现什么,但Doctrine在持久化实体时不调用getter,它使用反射,因此如果问题是您的id在数据库中不正确,这可能就是原因。

感谢您的响应。你是对的,除了对象没有初始化之外,这种情况下RedProduct对象是一个延迟加载的关联引用,比如说ProductReview对象。从代理方法中,如果对象没有初始化,它只返回主键。我的问题仍然是——getId()是否有特殊的案例行为?我应该补充一点,如果我调用$review->getProduct()->getName();首先,然后调用$review->getProduct()->getId();,这是正确的,因为getName()强制产品对象“load()”不,据我所知,getId()不是保留方法或类似的东西。知道为什么它是唯一一个获得“if not initialized,return id”子句的方法吗?其他方法都不是这样的。一定有什么神奇的事情发生了,不是吗?