Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否可以使用反射修改对象实例的方法_Php_Reflection_Orm_Domain Model - Fatal编程技术网

Php 是否可以使用反射修改对象实例的方法

Php 是否可以使用反射修改对象实例的方法,php,reflection,orm,domain-model,Php,Reflection,Orm,Domain Model,我要做的是用一个普通的老PHP对象创建一个域模型。 我正在创建一个库,它将完成所有基础设施的工作。 我的一个模型是这样的 class Project { public $id; public $name; public $typeId; private $type; public function getType() { return $this->type; } public function setType(Type $type) {

我要做的是用一个普通的老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
,并使用ORM保存项目实例,则项目和类型都将保存。但是,然后我加载项目并使用
getType
方法,我希望ORM能够透明地修改这个方法,以便从Persience加载对象。所以这里的方法是:

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();
}
Outlet PHP使用eval为项目创建一个名为Project_Proxy的代理类,但有时会有Project的子类,所以如果有办法的话,我正在使用反射API搜索解决方案

我在谷歌上搜索过,但还没有找到改变方法行为的方法

编辑:或者使用Outlet PHP的eval方法为我的模型及其所有子类创建代理类是一个好主意吗?

查看PHP.net上的反映,我觉得不可能在飞行中修改方法


你应该试着用不同的方法来做这件事。

没有内置的方法。尽管您可以使用,但我强烈建议您找到另一种解决方案。更改您一无所知的函数的实现是非常危险的,可能会导致错误,其中调试单个此类错误可能比为所有函数编写
if(is_null)(…
语句花费更长的时间


顺便说一句:不要使用
is\u null()
,因为您可能会一次又一次地从数据库获取null值。您应该将获取的值存储在单独的变量中。

但是如果我写入if(is\u null(…在模型内部,我通过调用
$this->adapter
将模型与DataAbstractionLayer耦合起来。
is_null
实际上并没有检查数据库字段,而是检查保存相关实体的属性。恰恰相反:如果您要在类之外实现类的逻辑,那么您将违抗OO编程规则。您有一个数据库连接对象(我假设
$this->adapter
是一个对象),这被称为依赖项注入,目前被认为是良好的做法。
的问题是null()
调用
$user->getFirstName()如果
users
表的
firstname
列具有
NULL
值,则
tweeps将查询数据库两次。谢谢,然后我将使用依赖项注入。我实际上并没有对属性使用getter和setter,而只是为了获取相关实体。因此,要获取firstname,我将使用
$customer->firstname
但要为用户获取street address对象,我需要用户
$customer->getAddress()->street