Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Вызов метода дочернего класса (sv)
Author Message
sv
Участник форума



Joined: 04 Jan 2004
Posts: 68
Карма: -7
   поощрить/наказать

Location: Россия

PostPosted: Thu Oct 08, 2009 8:49 am (написано за 3 минуты 42 секунды)
   Post subject: Вызов метода дочернего класса
Reply with quote

Доброго времени суток всем форумчанам!

Помогите с реализацией вызова метода дочернего класса.

Почитав разные статьи на ум пришел вариант с косвенным вызовом

call_user_func(array(&$obj, 'myCallbackMethod'));

но не могу понять как передать ссылку на дочерний класс вместо $obj

Подскажите пожалуйста как реализовать этот вызов.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Thu Oct 08, 2009 12:06 pm (спустя 3 часа 17 минут; написано за )
   Post subject:
Reply with quote

Пример кода приведите, пожалуйста.
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Thu Oct 08, 2009 12:59 pm (спустя 53 минуты; написано за 12 секунд)
   Post subject:
Reply with quote

Code (php): скопировать код в буфер обмена
#CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
class clsParent {
       
       
        protected function parentFunction(){               
                # Необходимо чтобы данная функция вызвала [childFunction] из этого участка кода                       
               
               
        }       
       
       
}



#CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
class clsChild extends clsParent {
       
       
        protected function childFunction(){               
                               
               
        }       
       
        public function otherFunction(){
               
               
                $this->parentFunction();
               
               
        }
       
       
}


function Test(){
       
        $myCLS =& new clsChild();
       
        $myCLS->otherFunction();
       
}
Back to top
Владимир Хоменко
Участник форума



Joined: 11 Jun 2004
Posts: 427
Карма: 42
   поощрить/наказать

Location: Николаев, Украина

PostPosted: Thu Oct 08, 2009 1:12 pm (спустя 12 минут; написано за 1 минуту 15 секунд)
   Post subject:
Reply with quote

Code (php): скопировать код в буфер обмена
protected function parentFunction() {
        $this->childFunction();
}
Это будет работать, но в рамках ООП это совершенно неграмотно.
Back to top
View user's profile Send private message Send e-mail
sv
Участник форума



Joined: 04 Jan 2004
Posts: 68
Карма: -7
   поощрить/наказать

Location: Россия

PostPosted: Thu Oct 08, 2009 1:15 pm (спустя 3 минуты; написано за 31 секунду)
   Post subject:
Reply with quote

Владимир Хоменко wrote:
Это будет работать, но в рамках ООП это совершенно неграмотно.
не работает.

вот этот вариант работает.
Code (php): скопировать код в буфер обмена
#CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
class clsParent {
       
        protected $m_child ;
       
        function clsParent($obj){
               
                $this->m_child = $obj;
               
        }
       
        protected function parentFunction(){               
                #
               
                $this->m_child->childFunction();
               
        }       
       
       
}



#CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
class clsChild extends clsParent {
       
        function clsChild(){
               
                parent::clsParent($this);               
               
        }
       
        protected function childFunction(){               
               
                echo (www.php.net/echo) "  ";
               
        }       
       
        public function otherFunction(){
               
               
                $this->parentFunction();
               
               
        }
       
       
}
Back to top
View user's profile Send private message Send e-mail
sv
Участник форума



Joined: 04 Jan 2004
Posts: 68
Карма: -7
   поощрить/наказать

Location: Россия

PostPosted: Thu Oct 08, 2009 1:19 pm (спустя 4 минуты; написано за 26 секунд)
   Post subject:
Reply with quote

sv wrote:
Владимир Хоменко писал(а):
Это будет работать, но в рамках ООП это совершенно неграмотно.
не работает.
Извиняюсь, действительно работает, до этого выдавал 500 тую.
Back to top
View user's profile Send private message Send e-mail
sv
Участник форума



Joined: 04 Jan 2004
Posts: 68
Карма: -7
   поощрить/наказать

Location: Россия

PostPosted: Thu Oct 08, 2009 1:25 pm (спустя 6 минут; написано за 2 минуты 13 секунд)
   Post subject:
Reply with quote

sv wrote:
Это будет работать, но в рамках ООП это совершенно неграмотно.
Какие проблемы может вызвать данный метод?
Back to top
View user's profile Send private message Send e-mail
Владимир Хоменко
Участник форума



Joined: 11 Jun 2004
Posts: 427
Карма: 42
   поощрить/наказать

Location: Николаев, Украина

PostPosted: Thu Oct 08, 2009 1:44 pm (спустя 18 минут; написано за 6 минут 21 секунду)
   Post subject:
Reply with quote

sv wrote:
Какие проблемы может вызвать данный метод?
Ну, например, Вы сделаете еще один
Code (php): скопировать код в буфер обмена
class clsChild1 extends clsParent
, в котором не будет обьявлена функция childFunction. При вызове parentFunction возникнет ошибка.
Back to top
View user's profile Send private message Send e-mail
sv
Участник форума



Joined: 04 Jan 2004
Posts: 68
Карма: -7
   поощрить/наказать

Location: Россия

PostPosted: Thu Oct 08, 2009 1:52 pm (спустя 8 минут; написано за 1 минуту 15 секунд)
   Post subject:
Reply with quote

Владимир Хоменко wrote:
Ну, например, Вы сделаете еще один Код (php): скопировать код в буфер обмена
class clsChild1 extends clsParent
, в котором не будет обьявлена функция childFunction. При вызове parentFunction возникнет ошибка.
Боюсь это очевидно и вряд ли вызовет проблемы.
Так же можно поставить проверку на существование метода перед его вызовом.

Какие то еще могут возникнуть проблемы?
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Thu Oct 08, 2009 3:53 pm (спустя 2 часа 51 секунду; написано за 3 минуты 41 секунду)
   Post subject:
Reply with quote

сам по себе такой код - уже проблема.
Ваша задача на самом деле читается как "вызов произвольного метода произвольного класса". То, что класс - дочерний для текущего, это частный случай.
Quote:
Ой, а давайте вот тут попробуем вызвать метод с таким прикольным названием! Авось что-нибудь изменится
Back to top
View user's profile Send private message
sv
Участник форума



Joined: 04 Jan 2004
Posts: 68
Карма: -7
   поощрить/наказать

Location: Россия

PostPosted: Thu Oct 08, 2009 4:45 pm (спустя 51 минуту; написано за 5 минут 23 секунды)
   Post subject:
Reply with quote

Однако прикольное рассуждение...

Если я знаю что мне необходимо вызвать в дочернем классе функцию, и знаю ее имя, не понимаю почему это должно вызывать проблему.

Предположим на хостинге установлен модуль, он реализует выполнение определенных задач, и модулю необходимо косвенно вызвать функцию вне класса, код которой не может быть известен заранее.
Если мы просто напишем такую функцию обратного вызова, то она выполнится, если нет, то и ничего не произойдет.
Не вижу проблем.
Maus wrote:
сам по себе такой код - уже проблема.
Это не объяснение проблемы.
Maus wrote:
"вызов произвольного метода произвольного класса"
Речь о произвольном классе не шла равно как и о произвольном методе.
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Thu Oct 08, 2009 5:31 pm (спустя 46 минут; написано за 12 минут 47 секунд)
   Post subject:
Reply with quote

sv wrote:
функцию обратного вызова
это тут каким боком?
sv wrote:
модулю необходимо косвенно вызвать функцию вне класса
это сцепленность кода. И пока она явно декларирована - это не столь страшно, её можно обнаружить. Но вот когда она становится неявной (за счет, например $this, self) - это уже хуже.
sv wrote:
Речь о произвольном классе не шла равно как и о произвольном методе
Это Вам атк кажется. С точки зрения родительского класса дочерних просто не существует, поймите.
sv wrote:
Это не объяснение проблемы
Это не объяснение, это констатация. Рассмотрите ситуацию: в некоем унаследованном (возможно, через пару уровней) классе я объявляю совершенно безобидный метод. Я знаю, что не перегружаю никаких родительских методов (мне это показывает IDE). Пишу, проверяю метод тестом, коммичу. Ночью идут тесты всего проекта, и обнаруживается, что совсем другой кусок кода работать перестал. Начинаются разборки - кто правил этот кусок (никто), тесты для него (тоже никто), данные для тестов (опять никто). После этого кому-то из разработчиков ставится задача, он садится с отладчиком и начинает разбираться. Допустим, он опытный, и вот тот хитрый кусок кода в родительском классе (который написан 3 месяца назад уже уволившимся коллегой) привлекает его внимание. И вот тут наступает тьма и светопреставление - надо
1) продумать, как перестроить архитектуру под нормальную;
2) проверить все унаследованные классы, какие используют этот костыль, а какие нет;
3) переписать проблемные;
4) распространить патч на все поддерживаемые проекты.
Это только то, что приходит в голову. Куча потраченного времени и денег. Только потому, что одному человеку было лень изучить ООП
Back to top
View user's profile Send private message
sv
Участник форума



Joined: 04 Jan 2004
Posts: 68
Карма: -7
   поощрить/наказать

Location: Россия

PostPosted: Thu Oct 08, 2009 5:58 pm (спустя 26 минут; написано за 10 минут 30 секунд)
   Post subject:
Reply with quote

Maus wrote:
С точки зрения родительского класса дочерних просто не существует, поймите.
Это я понимаю прекрасно, но суть явного и не явного контроля данных, а так же перехват вызова несуществующих методов, равно как и проверка на существование метода, позволяет испоьзовать такой код.
Что касается любой программы, то любой (даже самый простой) алгоритм можно написать криво, а можно любой (даже самый сложный) написать надежно.
Maus wrote:
функцию обратного вызова
это тут каким боком?
Имелось ввиду функция косвенного вызова. :)
В разных языках по разному назвается метод вызова callback...

Взять все тот же случай с модулем на хостинге, при инициализации объекта, в конструктор скажем передается ссылка на функцию, а класс уже вызывает ее когда ему надо, в некоторых случаях подобный метод неизбежен.
Не спорю это разные вещи, класс родитель не знает что потом налепят на производный класс, но так же есть возможность и финализировать методы.
Если использовать подобные выкрутасы в таких местах как абстрактный класс доступа к БД на самом низком уровне, то подобное явно вылезит боком, но на стадии финального варианта метода, мне кажется вполне рабочим :)
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Thu Oct 08, 2009 7:38 pm (спустя 1 час 40 минут; написано за 4 минуты 35 секунд)
   Post subject:
Reply with quote

Может быть я невнимательно прочитал эту тему, но что мешает объявить в базовом классе метод и перегрузить его в потомке?
Тогда проблема "как вызвать" не возникнет в принципе, просто потому что будет взят самый последний "свежий" метод в иерархии классов.
Code (any language): скопировать код в буфер обмена
class BaseClass {
    protected void method1() {
        log ("base::method1");
        method2();
    }
    protected void method2() {
        log ("base::method2");
    }
}

class ChildClass extends BaseClass {
    protected void method2() {
        log ("child::method2");
    }
}

(new ChildClass()).method1();
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Sat Oct 10, 2009 11:12 pm (спустя 2 дня 3 часа 33 минуты)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Наследование и паттерн Стратегия (и не только)»,
расположенную в форуме Разное :: PHP (11 Октября 2009, 00:12).
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML