假设我有一个类型为A的对象,如下所示:
class A{
private $item;
...
...
...
...
public function getItem(){
return $this->item;
}
}
$obj = new A();
有没有办法在不修改类A的源代码的情况下,只为getItem
$obj
**?** object重写方法?
如果是,那是怎么做的?
我试着在下面的代码中这样做:
class A{
private $item = 5;
public function getItem(){
return $this->item;
}
}
$obj = new A();
echo $obj->getItem();
$obj->getItem = function(){return 10;};
echo $obj->getItem();
但是原始getItem
方法的it returns结果是原来的两倍
我想要实现的是只在一些对象中替换方法,而不是修改基类
@编辑
我试了一下代码,发现了一些有趣的东西:
<?php
class A{
private $item = 5;
public function getItem(){
return $this->item;
}
}
$obj = new A();
echo $obj->getItem()."\n";
$obj->getItem = function(){return 10;};
echo $obj->getItem()."\n";
$fun = $obj->getItem;
echo $fun()."\n";
this code prints 5 5 10
,所以object中的一些东西已经改变了,但是为什么它不是一个方法呢?这样的replace
方法是不可能的吗?
发布于 2018-07-19 03:20:38
这是不可能的,幸运的是,这会带来巨大的安全风险。
Reflection API允许访问方法,但不能更改其实现。
另请参阅
* Is it possible to modify methods of an object instance using reflection
* http://www.stubbles.org/archives/65-Extending-objects-with-new-methods-at-runtime.html
更新
虽然不能替换函数的实现,但可以使用反射更改其他隐藏字段的值:
<?php
class A {
private $item = 5;
public function getItem() {
return $this->item;
}
}
$obj = new A();
$reflect = new ReflectionClass($obj);
$property = $reflect->getProperty('item');
$property->setAccessible(TRUE);
$property->setValue($obj, 10);
echo $obj->getItem(); // 10
https://stackoverflow.com/questions/51409059
复制相似问题