Подмена объекта

dr.Pavka

Новичок
Подмена объекта

Привет !
Созрел такой вопрос, можно ли в РНР осуществить подмену объекта, и если можно то как?
Тобишь, есть объект (объект1) в один из методов которого передается другой объект (объект2) того же класса
При определенных условиях объект1 должен стать объектом2

Вообщем что то типа такого:

PHP:
   class DataDescription extends Object {
    ...

    public function intersect(DataDescription $destinationDD) {
        if ($this->getLength() == 0) {
        	$this = $destinationDD;
        }
   }
В данном примере происходит
Fatal error: Cannot re-assign $this

Как можно заменить $this на $destinationDD?
 

Panchous

Павел
заменить $this никак нельзя!
это абсурдно просто.

можно поменять св-ва объекта
 

dr.Pavka

Новичок
Автор оригинала: Panchous
заменить $this никак нельзя!
это абсурдно просто.

можно поменять св-ва объекта
А что тут абсурдного ?
мы же подменяем на объект того же класса
 

Сергей Тарасов

Профессор
ИМХО Вопрос крайне интересный, хотя и противоречит основным принципам ООП

Правда в PHP вся наука по ООП пошла в /dev/null
 

itprog

Cruftsman
Сергей Тарасов
Правда в PHP вся наука по ООП пошла в /dev/null
еще один обиженный отсутствием "множественного наследования"?)

Вообще, подмена такая была возможна в PHP4, но в PHP5 ее убрали, потому как имхо это противоречит вообще всему ООП
 

Сергей Тарасов

Профессор
itprog
Скорее отсутствием сильной типизации(хотябы для объектов) и возможностью перегрузки функций и операторов.
 

dr.Pavka

Новичок
itprog
Скорее отсутствием сильной типизации(хотябы для объектов) и возможностью перегрузки функций и операторов.
Ну возможность перегрузки присутствует, хотя и не совсем обычная
точнее две возможности
через magic __call и __get
через overload()

Даже множественное наследование можно организовать при желании через RunKit или aggregate ()

Хотя еще вопрос насколько множественное наследование нужно реально.

А типизация .... ну тут действительно ничего не ответишь ...
Наши недостатки - продолжение наших достоинств :)

А по поводу сабжа рассматривался вариант копирования всех свойств объекта2 в объект1, но был отклонен по причине параноидальности :), вообщем судя по всему таки ничего не придумаешь, пришлось подменять объекты уровнем выше.

P.S. перегрузка операторов?
Это что? как в Ruby? ;)
 

Сергей Тарасов

Профессор
Ну если говорить глобально, то синтаксис PHP в каком-то смысле был скопирован с эзыка C, да и многое что другое.
Если взять C++ то там есть перегрузка операторов - весьма полезная вещь...


По поводу перегрузки функций - то в PHP(__call) - это скорее не перегрузка в привычном смысле( реализация полиморфизма: одно имя: разные аргументы и возвращаемые значения) а скорее продолжение отсутствия типизации - можно вызывать любую функцию у любого объекта...
 

tony2001

TeaM PHPClub
>Скорее отсутствием сильной типизации(хотябы для объектов) и возможностью
>перегрузки функций и операторов.

О как.
Строгая типизация и перегрузка операторов это у нас ООП, оказывается.
Может, что-нить прочитать надо? Из серии "для самых маленьких".

>Если взять C++ то там есть перегрузка операторов - весьма полезная вещь...

Особенно для создания неподдерживаемого и нечитаемого кода.
 

Scud

Новичок
Re: Подмена объекта

Автор оригинала: dr.Pavka
PHP:
   class DataDescription extends Object {
    ...

    public function intersect(DataDescription $destinationDD) {
        if ($this->getLength() == 0) {
        	$this = $destinationDD;
        }
   }
А может воспользоваться делегированием?
PHP:
   class DataDescription extends Object {
    ...
         private $m_delegate = null;
    ...

    public function intersect(DataDescription $destinationDD) {
        if ($this->m_delegate) {
             return $this->m_delegate->intersect($destinationDD);
        }
        else {
            if ($this->getLength() == 0) {
        	$this->m_delegate = $destinationDD;
            }
        }
   }
Вот как-нибудь так ;)
 

zerkms

TDD infected
Команда форума
ИМХО Вопрос крайне интересный, хотя и противоречит основным принципам ООП
я так полагаю GoF совсем не при делах и про The State Pattern они не писали? ;)
 

dr.Pavka

Новичок
Re: Re: Подмена объекта

Автор оригинала: Scud
А может воспользоваться делегированием?
PHP:
   class DataDescription extends Object {
    ...
         private $m_delegate = null;
    ...

    public function intersect(DataDescription $destinationDD) {
        if ($this->m_delegate) {
             return $this->m_delegate->intersect($destinationDD);
        }
        else {
            if ($this->getLength() == 0) {
        	$this->m_delegate = $destinationDD;
            }
        }
   }
Вот как-нибудь так ;)
А че, вариант :)
Подумаю
 
Сверху