За последние 24 часа нас посетили 64099 программистов и 1741 робот. Сейчас ищут 833 программиста ...

[МАГИЯ] return $this в методе. вопрос.

Тема в разделе "Прочие вопросы по PHP", создана пользователем Invision, 23 янв 2012.

  1. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Пример:
    Код (Text):
    1. class test {
    2.     public $params = array();
    3.     public function set($set) {
    4.         echo '<p>Добавляем новое значение в свойство.</p>';
    5.         $this->params[] = $set;
    6.         return $this;
    7.     }
    8.     public function show() {
    9.         echo 'Вывод: ';
    10.         print_r($this->params);
    11.         return $this;
    12.     }
    13.     public function clear() {
    14.         echo '<p>Очистка.<p>';
    15.        $this->params = array();
    16.     }
    17. }
    18. $obj = new test();
    19. $obj->set('привет')->show()->clear();
    20. $obj->show();
    Выводит:
    Вопрос: есть ли волшебные методы для подобных реализаций или постоянно нужно возвращать $this. К примеру хочется написать универсальный класс для какой то специфической задачи, где методы можно было бы в разных порядках друг за дружкой вызывать :)

    p.s неужели обновился форум... ихуу)
    p.s.s было лучше XD
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Re: return $this в методе. вопрос.

    Этот паттерн называется chaining и да, его можно реализовать только return $this;
     
  3. Invision

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

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Re: return $this в методе. вопрос.

    хм, тогда ясно все, спасибо
     
  4. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Re: return $this в методе. вопрос.

    просто вы не умеете готовить. вегетарианцы, нах...

    Код (Text):
    1.  
    2.  
    3. <?php
    4. /**
    5.  * @author 440hz
    6.  * @mail 440hz@mail.ru
    7.  */
    8.  
    9. class singleton
    10. {
    11.  
    12.     /**
    13.      * Синглетон
    14.      *
    15.      * @static
    16.      * @return get_called_class
    17.      */
    18.     public static function getInstance()
    19.     {
    20.  
    21.         static $oHandler = null;
    22.  
    23.         if (is_null($oHandler)) {
    24.             $sClass = get_called_class();
    25.             $oHandler = new $sClass;
    26.         }
    27.  
    28.         return $oHandler;
    29.     }
    30. }
    31.  
    32. /**
    33.  * Обертка
    34.  */
    35. class chaining extends singleton
    36. {
    37.     /**
    38.      * @param $sMethod Вызываемый метод
    39.      * @param $sParams Массив параметров
    40.      * @return fokus Вернем самого себя
    41.      */
    42.     public function __call($sMethod, $sParams)
    43.     {
    44.  
    45.         $sMethod = '_' . $sMethod;
    46.         $this->$sMethod($sParams);
    47.         return $this;
    48.  
    49.     }
    50. }
    51.  
    52.  
    53. /**
    54.  * Расширяемый класс
    55.  */
    56. class hello extends chaining
    57. {
    58.  
    59.     public function _x($mParams)
    60.     {
    61.         print(PHP_EOL . "X: " . $mParams[0]);
    62.     }
    63.  
    64.     public function _y($mParams)
    65.     {
    66.         print(PHP_EOL . "Y: " . $mParams[0]);
    67.     }
    68.  
    69.     public function _z($mParams)
    70.     {
    71.         print(PHP_EOL . "Z: " . $mParams[0].','.$mParams[1]);
    72.     }
    73. }
    74.  
    75. print("Start...");
    76.  
    77. hello::getInstance()->x(1)->y(2)->z(3,4);
    78.  
    79. print(PHP_EOL . "End" . PHP_EOL);
    Код (Text):
    1.  
    2. www# php call.php
    3. Start...
    4. X: 1
    5. Y: 2
    6. Z: 3,4
    7. End
    читаем. учим. наслаждаемся.

    http://ru2.php.net/manual/ru/language.oop5.magic.php
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    440Hz
    Это все только ради того, чтобы выбросить return $this из методов? Так мы заодно теряем оригинальные имена методов.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну такой подход позволяет любой класс обернуть в такого цепного пса =)
     
  7. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    [Вопрос: есть ли волшебные методы для подобных реализаций или постоянно нужно возвращать $this.]

    я ответил на вопрос, а вот накуя оно надо дело не мое. лично я так НЕ делаю.
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Туплю ))