【发布时间】:2018-07-18 18:48:57
【问题描述】:
假设我有一个 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 prints5 5 10,所以对象中的某些内容发生了变化,但为什么它不是方法? replace这样的方法不可能吗?
【问题讨论】:
-
子类呢?
-
这是code smell。如果您希望对象表现不同,那么您应该有不同的对象。
-
@AlexHowansky 问题是我只需要在一个代码位置执行此操作,我认为这是实现它的最简单方法
-
@alanfcm 是的,我想到了,但我必须在项目中只做一次,所以我想到它只是因为我很好奇它是否可以这样工作,是否可以覆盖方法像这样
-
class B extends A { private $item = 'something else'; public function getItem(){ return $this->item; }}然后$object = new B;
标签: php oop overriding