oop — PHP переопределяющий метод объекта

Допустим, у меня есть объект типа 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 такой метод?

0

Решение

Это не возможно, и, к счастью, так, поскольку это представляет огромный риск для безопасности.

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
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]