Допустим, у меня есть объект типа A, похожий на этот:
class A{
private $item;
...
...
...
...
public function getItem(){
return $this->item;
}
}
$obj = new A();
Есть ли способ, что без изменения исходного кода класса А я могу переопределить метод getItem
только для объекта $obj
?
если да, то как?
Я попытался сделать это, как в коде ниже:
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
метод дважды
То, чего я хочу достичь, это замещать метод, который я хочу только в некоторых объектах, не хочу изменять базовый класс
@РЕДАКТИРОВАТЬ
Я немного поиграл с кодом и нашел кое-что интересное:
<?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";
этот код печатает 5 5 10
что-то в объекте изменилось, но почему это не метод? Это невозможно replace
такой метод?
Это не возможно, и, к счастью, так, поскольку это представляет огромный риск для безопасности.
Reflection API разрешает доступ к методам, но не меняет их реализацию.
Смотрите также
* Можно ли изменить методы экземпляра объекта, используя отражение
* 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
Других решений пока нет …