Возможно не правильно назвал тему, но суть такова, часто приходится встречать вот такой вид: PHP: $var = $obj -> funcOne() -> funcTwo(); Но в книгах ничего подробного по этому поводу не поясняют. Да и в сети тоже не встречал. Подскажите как всё это дело называется и где с данной конструкцией можно по лучше познакомиться, ее принцип и смысл. Спасибо!
Паттерн чайнинг (chaining - сковывание цепи). С возвращаемым значением в PHP можно работать сразу, без помещения в переменную. Например, если функция возвращает число, можно писать сразу: Код (Text): echo 2 * myFunc(); Внутри экземпляра класса существует переменная $this - это ссылка на текущий объект. Следовательно, если функция-член класса будет возвращать её, то она будет возвращать объект, в котором сама и находится. Это и будет чайнинг. Код (PHP): class A { function Fn() { echo "Hi!"; return $this; } } $o = new A; $o->Fn()->Fn()->Fn();
Так же называют - Текущий интерфейс https://habrahabr.ru/post/170019/ PHP: final class Currents { public function __call( $method, $arguments ) { $this -> $method( ...$arguments ); return $this; } protected function Chain() { echo 'Lol'; } } ( new Currents ) -> Chain() -> Chain() -> Chain() -> Chain(); --- Добавлено --- По мере вызова имени функции, можно менять возвращаемый результат и препятствовать дальнейшую цепочку. Например после 5 вызовов Chain
Вот тут (https://www.wisereport.ru/method_chaining/) немного не пойму: PHP: class Person { private $m_szName; private $m_iAge; public function setName($szName) { $this->m_szName = $szName; return $this; //Возвращаем объект текущего класса } public function setAge($iAge) { $this->m_iAge = $iAge; return $this; //Возвращаем объект текущего класса } public function introduce() { printf( 'Hello my name is %s and I am %d years old.', $this->m_szName, $this->m_iAge); } } Зачем в данном случае приватные свойства класса ( private $m_szName; private $m_iAge ) Ведь если сделать вот так : PHP: class Person { public function setName($szName) { $this->szName = $szName; return $this; //Возвращаем объект текущего класса } public function setAge($iAge) { $this->iAge = $iAge; return $this; //Возвращаем объект текущего класса } public function introduce() { printf( 'Hello my name is %s and I am %d years old.', $this->szName, $this->iAge); } } Результат будет тот-же самый, или я что-то упускаю? Не могу понять смысла приватных свойств класса : private $m_szName; private $m_iAge
Как мне говорили более старшие программисты - если что-то можно закрыть, это надо закрыть. public применяется только к тому, что действительно должно быть public. Программист, который всем методам и свойствам класса по умолчанию прописывает public - это плохой программист.
Это понятно, если у меня есть методы которые выполняют какой-то процес, который не должен быть public он будет private, но в данном случае мы прямым образом передаем в public значение которое уходит в private и с ним там ничего не происходит. Как по мне, так имеет смысл заносить в свойство класса результат метода класса, чтоб не дергать постоянно этот самый метод на выполнение. А тут я теряюсь, в чем смысл.
Упускаешь. В первом случае у тебя свойства 1) объявлены и 2) приватны, то есть извне их нельзя читать-писать, только методами класса объекта. Во втором случае они у тебя не объявлены. Попытка чтения до объявления будет давать нотис. Попытка записи - создаст публичное свойство и присвоит значение. А публичное свойство доступно извне. Так что результат далеко не тот же самый.
Так в этих приватных свойствах хранится результат публичного метода, т.е. мне они по факту напрямую не нужны, т.к. в эти приватные свойства я могу передать значение через публичный метод. Т.е. в первом случае обратиться $this->m_szName я не смогу т.к. приват, чтоб к примеру передать туда значение, но я могу передать значение через $this->setName("значение"). Можете привести пример, где второй вариант может создать проблему при работе скрипта? У меня просто не много практики при работе с OOP просто хотелось бы понять данную ситуацию до конца. Спасибо!
@AlexandrS очень банальный пример. Есть класс животное, есть его расширение - человек. Но к делу отношения это не имеет. У человека есть возраст и имя. Когда ты объявляешь свойства публичными то можешь случайно записать имя в возраст. А объявив приватным и сделав публичный сеттер - ты сделаешь фильтрацию значения переданного в этот метод и выкинешь исключение, если кто-то вместо числа пишет строку. То есть в данном примере геттеры-сеттеры позволяют дополнить логику объекта фильтрацией типа значения и/или собственно значения.
Т.е. если я правильно понял, то в приватное свойство мы отправляем обработанное готовое значение вернувшееся из метода в котором были проведены определенные проверки на факт правильности передаваемого значения. Т.е. по факту, те примеры которые я привел выше, это просто примеры не более чем суть, так скажем, это самое простое, что может быть чтобы показать сам процесс выполнения. Это как если бы я показал передачу значений из формы в БД, но не углублялся бы в то, что данные из формы нужно проверять и т.д. и т.п. Я верно понял?
@AlexandrS, ну конечно в примерах идёт упрощение. Хотя, в принципе, геттеры и сеттеры тоже полагается использовать ограниченно, а состояние менять через более осмысленные методы. Но если объекты, где логичны именно геттеры и сеттеры.
Почитай: https://ru.wikipedia.org/wiki/Сокрытие_(программирование) https://ru.wikipedia.org/wiki/Инкапсуляция_(программирование)
Вот смотри, завели двигатель, нажали на газ. Количество оборотов выросло не потому что кто-то вызвал функцию "установитьКоличествоОборотов", а потому что мы дали двигателю команду, и чтоб её исполнить, он изменил своё состояние. Так же в идеале должно быть в ОО-системе: ты попросил объект что-то сделать, и он, для того, чтобы это выполнить, изменил своё состояние. Другое дело, что в веб-программировании многие объекты сводятся, фактически, к DTO, которые получили из хранилища и выплюнули в браузер. Поэтому у нас бывают часто и геттеры, и сеттеры, и даже public-поля.