[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Передача данных в вид, Kohana
J1upuk

class Controller_Welcome extends Controller {

public function action_index()
{
$view = View::factory('welcome')
->
set('name', 'Васька')
->
set('age', 25);
$this->response->body($view);
}

}
// End Welcome



Как это работает? А точнее:


$view = View::factory()->set()->set();


Я с такими конструкциями не сталкивался, как не пробовал, подобного воспроизвести не удалось.

View::factory() - это понятно, вызывает статический метод класса View, в свою очередь он что-то возвращает, и это что-то присваивается переменной $view, это что-то вроде как объект. А как тут вписывается ->set()->set()? Это методы этого самого вернувшегося объекта? Как они вызываются друг за другом? Или может это не статические методы класса View? В таком случае нужно создать экземпляр класса, а тут не создается, а если factory() возвращает объект класса View то какая последовательность у всех этих действий? Я запутался.)
Santehnick
Код коханы никогда не смотрел, но View::factory() возвращает объект, у этого объекта вызывается метод set, он примерно такой


public function set($key, $value) {
...
return $this;
}


Так как метод set возвращает в конце своей работы тот же самый объект, то вызовы этих методов можно чейнить, т.е. вызывать цепочкой проще говоря.
Santehnick
Держи пруф https://github.com/kohana/core/blob/3.3/mas...a/View.php#L309


public function set($key, $value = NULL)
{
if (is_array($key) OR $key instanceof Traversable)
{
foreach ($key as $name => $value)
{
$this->_data[$name] = $value;
}
}
else
{
$this->_data[$key] = $value;
}
return $this;
}
J1upuk
Santehnick
Спасибо, смысл понял, вот что получилось)

<?php
class
TestClass
{
static function creatorMethod()
{
return new TestClass();
}

function chainMethod()
{
static $count = 0;
echo ++$count;
return $this;
}
}


$obj = TestClass::creatorMethod()->chainMethod()->chainMethod()->chainMethod();

Результат 123.


Основная идея как я понял это удобочитаемость кода? Чтобы не писать каждый раз:

$obj = TestClass::creatorMethod();
$obj->chainMethod();
$obj->chainMethod();
$obj->chainMethod();
Santehnick
Да, чейнинг метод упрощает чтение кода, когда нужно вызывать последовательно множество методов на одном и том же объекте. И иногда позволяет не заводить лишнюю переменную. Но естественно не все так считают, есть и другое мнение, что так лучше


$obj = TestClass::creatorMethod();
$obj->chainMethod();
$obj->chainMethod();
$obj->chainMethod();


но я не знаю, чем они руководствуются.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.