За последние 24 часа нас посетили 18078 программистов и 1652 робота. Сейчас ищут 1609 программистов ...

Изменение метода класса

Тема в разделе "PHP для новичков", создана пользователем free, 28 фев 2008.

  1. free

    free Активный пользователь

    С нами с:
    7 дек 2006
    Сообщения:
    29
    Симпатии:
    0
    У меня есть класс (пусть myclass1) и есть класс myclass2.

    Мне необходимо менять один метод класса myclass1, но осложняется все тем,
    что в классе mycalss2 используется экземпляр myclass1..

    Подскажите, как стоит поступать?

    ps В ООП новичок, сильно не бейте.
     
  2. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    жизненный пример приведите
     
  3. free

    free Активный пользователь

    С нами с:
    7 дек 2006
    Сообщения:
    29
    Симпатии:
    0
    жизненный пример велик, поэтому приведу такой
    PHP:
    1.  
    2. class myclass1
    3. {
    4.     function say () {
    5.         echo "mooo\n";
    6.     }
    7.     ..........
    8. }
    9.  
    10. class myclass2
    11. {
    12.     ..........
    13.     function foo(){
    14.         ..........
    15.         $say = new myclass1;
    16.         $say->say();
    17.     }
    18. }
    19.  
    20. myclass2::foo();
    21.  
    Тут метод say в зависимости от ситуации должен быть разным
     
  4. free

    free Активный пользователь

    С нами с:
    7 дек 2006
    Сообщения:
    29
    Симпатии:
    0
    Вариант
    PHP:
    1.  
    2. class myclass3 extands myclass1
    3. {
    4.     function say () {
    5.         echo "rakatika!\n";
    6.     }
    7. }
    8.  
    могу бы подойти, если бы не 11 строка предыдущего примера..
     
  5. DnSL48

    DnSL48 Активный пользователь

    С нами с:
    28 фев 2008
    Сообщения:
    1
    Симпатии:
    0
    можно узнать пример ситуации?
     
  6. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Это ищешь?
    PHP:
    1. <?php
    2. class myclass2
    3. {
    4.     functin foo()
    5.     {
    6.         $say = new myclass1();
    7.         $situation = 'say';
    8.         $say->$situation();
    9.     }
    10. }
    11.  
    12. /* второй вариант */
    13. class myclass2
    14. {
    15.     functin foo()
    16.     {
    17.         $situation = Singletoon::instance('SituationFactory');
    18.         $situation->say();
    19.     }
    20. }
    21.  
    22. ?>
     
  7. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    free
    опиши ситуацию словами, если не можешь дать ясный пример.
    В зависимости от какой ситуации метод должен меняться?
     
  8. free

    free Активный пользователь

    С нами с:
    7 дек 2006
    Сообщения:
    29
    Симпатии:
    0
    У меня есть класс который получает и обрабатывает различные данные. Получение их всегда одинаково, обработка различна. Метод который обрабатывает данные мне нужно уметь заменять.
    Я мог бы *не знаю как правильно называется* воспользоваться оператором extends, создавая копию класса с измененным методом. При этом имя класса изменится. Мне нельзя этого допускать потому что это класс используется внутри другого класса..
    То есть мне нужен некий универсальный метод создания класса-шаблона.

    ps Чувствую опять что-то не так объяснил.
     
  9. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Посмотри на __call(). В зависимости от имени метода можно в классе подменять функциями. Типа такого:

    Сам класс:
    Код (Text):
    1. class myclass2 {
    2.     //...
    3.    
    4.     function __call($method, $args){
    5.         array_unshift($args, $this);
    6.         call_user_func_array($method, $args);        
    7.     }
    8.    
    9.     //...    
    10. }
    Переопределение на месте:
    Код (Text):
    1. function lolipop($self, $param1, $param2){
    2.     echo 'Say: "'.$self->say.'". Param1: "'.$param1.'". Param2: "'.$param2.'".';
    3. }
    4.  
    5. $myclass2 = new myclass2;
    6. $myclass2->say = 'Ы, лол.';
    7. $myclass2->lolipop('Превед', 'Медвед');
    Кошерно?
     
  10. Anonymous

    Anonymous Guest

    Это называется шаблон фабрика. Его примерно topas показал. Поглядеть еще тут - http://www.php.net/manual/ru/language.oop5.patterns.php
     
  11. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    А имя метода должно то же оставаться? Тут, скорее всего, фабричный метод подойдёт.
     
  12. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. <?php
    2. abstract class DataProc {
    3.     protected $data;
    4.  
    5.     public function __construct() {
    6.         $this->data = 'Hello!';
    7.     }
    8.  
    9.     abstract public function process() {}
    10. }
    11.  
    12. class Creator {
    13.     public static function createProc($what) {
    14.         if ($what == 1) {
    15.             return new Proc1();
    16.         } else {
    17.             return new Proc2();
    18.         }
    19.     }
    20. }
    21.  
    22. class Proc1 extends DataProc {
    23.     public function process() {
    24.         print '<em>' . $this->data . '</em>';
    25.     }
    26. }
    27.  
    28. class Proc2 extends DataProc {
    29.     public function process() {
    30.         print '<strong>' . $this->data . '</strong>';
    31.     }
    32. }
    33.  
    34. class MyClass {
    35.     public function test() {
    36.         $proc = Creator::createProc(1);
    37.         // $proc = $dp->createProc(2);
    38.         // и т.д.
    39.         $proc->process();
    40.     }
    41. }
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    для этого существуют патерны локаторы которые развязывают отношения приемника/передатчика. и незачем мудрить тут.

    грубо говоря ты устанавливаешь связь между write->read и далее run. и все.


    p.s. ИМХО когда гачинаются извращения типа $myclass-.$mymethod()->Foo() то скорей всего не правильно спроектирована ООП модель.

    Это просто от незнания и неумения работать именно в ООП. Чаще всего такое происходит когда классы воспринимают как инкапсуляторы функций.

    =)
     
  14. free

    free Активный пользователь

    С нами с:
    7 дек 2006
    Сообщения:
    29
    Симпатии:
    0
    Все большое спасибо. Я пошел читать мануалы :) Посто не знал даже в какую сторону смотреть.
    Похоже, что Patterns - это как раз то, что нужно.

    Будут вопросы, я еще вернусь )