2009-11-18 62 views
1

我想要做的是使用Plain Old PHP Object创建一个域模型。 我正在创建一个库,它将完成所有的基础设施。 所以我的车型之一看起来像这样是否有可能使用反射修改对象实例的方法

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

出口PHP使用eval创建项目的代理类称为Project_Proxy但有时会出现项目的子类,所以我搜索如果有方法使用Reflection API解决方案。

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

编辑:,或者是使用插座PHP的eval方法来创建代理类为我的模特和所有子类是一个好主意他们?

回答

3

这样做没有内在的方法。虽然你可以使用PECL extension called runkit这样做,但我强烈建议找到另一种解决方案。更改的功能的实现,你可以不知道什么是非常危险的并在调试一个这样的错误可能比写所有你的函数if (is_null(...语句需要更长的时间可能会导致错误。

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

+0

但是,如果我写的,如果(is_null(...我通过调用'$这个 - > adapter'耦合与DataAbstractionLayer模型的模型内。另外'is_null'实际上没有检查数据库字段,但检查属性它持有相关的实体 – andho 2009-11-18 08:25:29

+1

恰恰相反:如果你要在类的外部实现逻辑*,你可能会违反OO编程规则,你有一个数据库连接对象(我假设'$ this - > adapter'就是一个),这叫做依赖注入,目前被认为是很好的做法。 – soulmerge 2009-11-18 08:38:11

+0

关于'is_null()'的问题是调用'$ user-> getFirstName()'两次会查询数据库两次'users'表的列'firstname'具有'NULL'值。 – soulmerge 2009-11-18 08:39:52

0

看着php.net上的反射doc,在我看来,它是不可能在航班上修改的方法。

你应该尝试以不同的方式做到这一点。

相关问题