Что значит на ООП PHP запись: $this->name->name2->name3->save();?

157
19 декабря 2016, 19:40

$this->name — свойство, но что дальше? Т.е. как понимать такие длинные конструкции? Видел в коде фреймворков и в чужом коде, но никто в попадавшихся мне видеоуроках ни разу не показал такую длинную конструкцию и что именно в ней происходит.

Ещё пример: $this->data->name = $name;
Что значит: ->data->name

Answer 1

Это композиция, или ассоциация. Случай когда полем класса является другой клас, имеющий свои собственные поля и методы.

Например:

class foo
{
    public $nameFoo;
    public someMethod()
    {
        return "какое то значение";
    }
}
class bar
{
    public $nameBar;
    __construct()
    {
        $this->nameBar = new foo();
    }
}

Тогда обращение к полю nameFoo поля nameBar (являющегося объектом класса foo) будет выглядеть так:

$item = new bar();
//обращаемся к полю (nameFoo будет присвоена строка "присваиваемое значение")
$item->nameBar->nameFoo = "присваиваемое значение";
//обращаемся к методу (будет возвращена строка "какое то значение")
$item->nameBar->someMethod()

И таких вложенностей может быть много.

Answer 2

В видеороках такого не рассказывают. Потому что авторы видеоуроков сами ничего не знают, а лишь как обезьяны повторяют выученные у другого такого же балбеса пару команд.

Объяснение при этом очень простое: в РНР ты всегда можешь обратиться к результату, возвращаемому переменной. Например, запись вида

$name = $array[1]["name"];

означает, что сначала мы обратились к переменной $array[1], но она тоже представляет собой массив, и мы можем сразу обратиться к его элементу ["name"]

То же самое и с объектами. Если выражение возвращает объект, то мы можем пририсовать стрелочку и обратиться к его свойству или методу. И так до бесконечности. По-английски это называется method chaining, то есть нанизывание одного метода на другой. Например в PDO можно написать так:

$id = $pdo->query("INSERT INTO t VALUES(NULL)")->insertId();

Соответственно, написать $this->data->name можно только если data - это объект.

READ ALSO
Обработка и вывод последних записей из БД

Обработка и вывод последних записей из БД

Есть БД с некоторым количеством новостейМне нужно вывести списком, например, последние 5

191
Laravel fire event из скрипта

Laravel fire event из скрипта

Настроен apache 2 сервер на линуксе и установлен laravel 52, есть php скрипт который слушает сокет, можно ли из этого скрипта вызвать Event::fire для laravel?

185
как в PHP прибавить к DAYTIME еще 2 часа

как в PHP прибавить к DAYTIME еще 2 часа

помогите написать вот такой пример, пользователю дается 2 дня на выполнение работы, они должен видеть когда время закончилось

209
Подключение файла к дочерней странице

Подключение файла к дочерней странице

У меня есть корневая папкаВ ней лежит папка "blocks" в которой находится head

247