За последние 24 часа нас посетили 19999 программистов и 999 роботов. Сейчас ищут 283 программиста ...

Вложенные запросы в ООП

Тема в разделе "PHP для новичков", создана пользователем AlexandrS, 3 янв 2018.

  1. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Возможно не правильно назвал тему, но суть такова, часто приходится встречать вот такой вид:
    PHP:
    1. $var = $obj -> funcOne() -> funcTwo();
    Но в книгах ничего подробного по этому поводу не поясняют. Да и в сети тоже не встречал.
    Подскажите как всё это дело называется и где с данной конструкцией можно по лучше познакомиться, ее принцип и смысл.
    Спасибо!
     
    denis01 нравится это.
  2. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Паттерн чайнинг (chaining - сковывание цепи).
    С возвращаемым значением в PHP можно работать сразу, без помещения в переменную. Например, если функция возвращает число, можно писать сразу:
    Код (Text):
    1. echo 2 * myFunc();
    Внутри экземпляра класса существует переменная $this - это ссылка на текущий объект. Следовательно, если функция-член класса будет возвращать её, то она будет возвращать объект, в котором сама и находится. Это и будет чайнинг.
    Код (PHP):
    1. class A {
    2.   function Fn() {
    3.     echo "Hi!";
    4.     return $this;
    5.   }
    6. }
    7. $o = new A;
    8. $o->Fn()->Fn()->Fn();
     
    AlexandrS, Ganzal, Dimon2x и ещё 1-му нравится это.
  3. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
  4. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Большое СПАСИБО!
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    Так же называют - Текущий интерфейс
    https://habrahabr.ru/post/170019/
    PHP:
    1. final class Currents
    2. {
    3.     public function __call( $method, $arguments )
    4.     {
    5.         $this -> $method( ...$arguments );
    6.      
    7.         return $this;
    8.     }
    9.     protected function Chain()
    10.     {
    11.         echo 'Lol';
    12.     }
    13. }
    14.  
    15. ( new Currents ) -> Chain() -> Chain() -> Chain() -> Chain();
    --- Добавлено ---
    По мере вызова имени функции, можно менять возвращаемый результат и препятствовать дальнейшую цепочку. Например после 5 вызовов Chain
     
    AlexandrS нравится это.
  6. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Вот тут (https://www.wisereport.ru/method_chaining/) немного не пойму:

    PHP:
    1. class Person
    2. {
    3.     private $m_szName;
    4.     private $m_iAge;
    5.  
    6.     public function setName($szName)
    7.     {
    8.         $this->m_szName = $szName;
    9.         return $this;               //Возвращаем объект текущего класса
    10.     }
    11.  
    12.     public function setAge($iAge)
    13.     {
    14.         $this->m_iAge = $iAge;
    15.         return $this;              //Возвращаем объект текущего класса
    16.     }
    17.  
    18.     public function introduce()
    19.     {
    20.         printf(
    21.             'Hello my name is %s and I am %d years old.',
    22.             $this->m_szName,
    23.             $this->m_iAge);
    24.     }
    25. }  
    Зачем в данном случае приватные свойства класса (
    private $m_szName;
    private $m_iAge
    )

    Ведь если сделать вот так :


    PHP:
    1. class Person
    2. {
    3.  
    4.     public function setName($szName)
    5.     {
    6.         $this->szName = $szName;
    7.         return $this;               //Возвращаем объект текущего класса
    8.     }
    9.  
    10.     public function setAge($iAge)
    11.     {
    12.         $this->iAge = $iAge;
    13.         return $this;              //Возвращаем объект текущего класса
    14.     }
    15.  
    16.     public function introduce()
    17.     {
    18.         printf(
    19.             'Hello my name is %s and I am %d years old.',
    20.             $this->szName,
    21.             $this->iAge);
    22.     }
    23. }  
    Результат будет тот-же самый, или я что-то упускаю? Не могу понять смысла приватных свойств класса :
    private $m_szName;
    private $m_iAge
     
  7. Walk

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

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Как мне говорили более старшие программисты - если что-то можно закрыть, это надо закрыть.
    public применяется только к тому, что действительно должно быть public.

    Программист, который всем методам и свойствам класса по умолчанию прописывает public - это плохой программист.
     
    AlexandrS нравится это.
  8. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Это понятно, если у меня есть методы которые выполняют какой-то процес, который не должен быть public он будет private, но в данном случае мы прямым образом передаем в public значение которое уходит в private и с ним там ничего не происходит.
    Как по мне, так имеет смысл заносить в свойство класса результат метода класса, чтоб не дергать постоянно этот самый метод на выполнение. А тут я теряюсь, в чем смысл.
     
  9. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Упускаешь. В первом случае у тебя свойства 1) объявлены и 2) приватны, то есть извне их нельзя читать-писать, только методами класса объекта. Во втором случае они у тебя не объявлены. Попытка чтения до объявления будет давать нотис. Попытка записи - создаст публичное свойство и присвоит значение. А публичное свойство доступно извне. Так что результат далеко не тот же самый.
     
    Walk и AlexandrS нравится это.
  10. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Так в этих приватных свойствах хранится результат публичного метода, т.е. мне они по факту напрямую не нужны, т.к. в эти приватные свойства я могу передать значение через публичный метод.
    Т.е. в первом случае обратиться $this->m_szName я не смогу т.к. приват, чтоб к примеру передать туда значение, но я могу передать значение через $this->setName("значение").
    Можете привести пример, где второй вариант может создать проблему при работе скрипта? У меня просто не много практики при работе с OOP просто хотелось бы понять данную ситуацию до конца.
    Спасибо!
     
  11. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    @AlexandrS очень банальный пример. Есть класс животное, есть его расширение - человек. Но к делу отношения это не имеет. У человека есть возраст и имя. Когда ты объявляешь свойства публичными то можешь случайно записать имя в возраст. А объявив приватным и сделав публичный сеттер - ты сделаешь фильтрацию значения переданного в этот метод и выкинешь исключение, если кто-то вместо числа пишет строку. То есть в данном примере геттеры-сеттеры позволяют дополнить логику объекта фильтрацией типа значения и/или собственно значения.
     
    Walk и AlexandrS нравится это.
  12. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Т.е. если я правильно понял, то в приватное свойство мы отправляем обработанное готовое значение вернувшееся из метода в котором были проведены определенные проверки на факт правильности передаваемого значения. Т.е. по факту, те примеры которые я привел выше, это просто примеры не более чем суть, так скажем, это самое простое, что может быть чтобы показать сам процесс выполнения.
    Это как если бы я показал передачу значений из формы в БД, но не углублялся бы в то, что данные из формы нужно проверять и т.д. и т.п.
    Я верно понял?
     
  13. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @AlexandrS, ну конечно в примерах идёт упрощение. Хотя, в принципе, геттеры и сеттеры тоже полагается использовать ограниченно, а состояние менять через более осмысленные методы. Но если объекты, где логичны именно геттеры и сеттеры.
     
    AlexandrS нравится это.
  14. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    А какие есть варианты?
     
  15. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Вот смотри, завели двигатель, нажали на газ. Количество оборотов выросло не потому что кто-то вызвал функцию "установитьКоличествоОборотов", а потому что мы дали двигателю команду, и чтоб её исполнить, он изменил своё состояние. Так же в идеале должно быть в ОО-системе: ты попросил объект что-то сделать, и он, для того, чтобы это выполнить, изменил своё состояние.

    Другое дело, что в веб-программировании многие объекты сводятся, фактически, к DTO, которые получили из хранилища и выплюнули в браузер. Поэтому у нас бывают часто и геттеры, и сеттеры, и даже public-поля.
     
    keren нравится это.