gpt4 book ai didi

PHP 重写对象的方法

转载 作者:行者123 更新时间:2023-12-02 03:32:34 25 4
gpt4 key购买 nike

假设我有一个 A 类型的对象,如下所示:

class A{

private $item;
...
...
...
...
public function getItem(){
return $this->item;
}
}


$obj = new A();

有什么方法可以在不修改 A 类源代码的情况下仅为对象 $obj 重写方法 getItem 吗?

如果是,那么如何?

我尝试像下面的代码那样执行此操作:

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

但是it returns原始 getItem 方法两次的结果

我想要实现的是replace方法,我只想在某些对象中使​​用,不想修改基类

@编辑

我稍微玩了一下代码,发现了一些有趣的东西:

<?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,所以对象中的某些内容发生了变化,但为什么它不是一个方法?不可能替换这样的方法吗?

最佳答案

这是不可能的,幸运的是,因为这会带来巨大的安全风险。

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

关于PHP 重写对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51409059/

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