首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP重写对象的方法

PHP重写对象的方法
EN

Stack Overflow用户
提问于 2018-07-19 02:48:58
回答 1查看 2.5K关注 0票数 0

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

代码语言:javascript
复制
class A{

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


$obj = new A();

有没有办法在不修改类A的源代码的情况下,只为getItem $obj**?** object重写方法?

如果是,那是怎么做的?

我试着在下面的代码中这样做:

代码语言:javascript
复制
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结果是原来的两倍

我想要实现的是只在一些对象中替换方法,而不是修改基类

@编辑

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

代码语言:javascript
复制
<?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方法是不可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

更新

虽然不能替换函数的实现,但可以使用反射更改其他隐藏字段的值:

代码语言:javascript
复制
<?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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51409059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档