gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:01:37 25 4
gpt4 key购买 nike

我想做的是用一个普通的旧 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 透明地修改此方法以从 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();
}

Outlet PHP 使用 eval 为 Project 创建一个名为 Project_Proxy 的 Proxy 类,但有时会有 Project 的子类,所以如果有办法,我正在使用 Reflection API 寻找解决方案。

我已经搜索谷歌但还没有找到改变方法行为

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

最佳答案

没有内置的方法可以做到这一点。尽管您可以使用 PECL extension called runkit 来做到这一点,我强烈建议您寻找其他解决方案。更改您一无所知 的函数的实现是非常危险的,并且可能会导致错误,调试单个此类错误可能比编写 if (is_null(... 声明所有你的函数。

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

关于php - 是否可以使用反射修改对象实例的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1754084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com