我想要做的就是创建一个普通老式PHP对象域模型。 在我创建一个库,它会做所有的基础设施的东西。 所以,我的车型之一看起来像这样

class Project {
  public $id;
  public $name;
  public $typeId;

  private $type;

  public function getType() {
    return $this->type;
  }

  public function setType(Type $type) {
    $this->typeId = $type->id;
    $this->type = $type;
  }
}

现在,如果创建一个新的项目,并呼吁setType一个有效的Type对象,并同时使用项目和类型的保存ORM保存项目实例。但后来我加载的项目及使用方法getType我想要的ORM已经修改了该方法透明地从persitence加载对象。因此这种方法在这里:

public function getType() {
  return $this->type;
}

要被透明地改变为:

public function getType() {
  if (is_null($this->type) {
    $this->type = $this->adapter->findById('table', $this->typeId);
  }

  return $this->type; // or return parent::getType();
}

直销PHP使用eval创建一个名为Project_Proxy项目的代理类,但有时会出现项目的子类,所以我通过使用反射API,如果有一种方法,寻找解决的办法。

我有搜索谷歌,但还没有发现无论如何改变方法行为

编辑:或它是使用PHP出口的eval方法来创建我的模型代理类一个好主意,他们的子类

有帮助吗?

解决方案

有是这样做的没有内建的方法。虽然你可以做到这一点使用 PECL扩展名为runkit ,我会强烈建议寻求另一种解决方案。更改的功能的实现,你可以不知道的任何的大约是非常危险的,在那里调试一个这样的错误可能比写为if (is_null(...语句需要更长的时间可能会导致错误的所有的您的功能。

BTW:不要使用is_null(),因为你可能会从数据库中一遍又一遍取空值。应该取出的值存储在一个单独的变量。

其他提示

综观反射上php.net DOC 时,它似乎我是不可能在飞机上的方法修改。

您应该尝试做它用不同的方式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top