Скажем, у меня есть следующий класс:
class Test
{
private static $instance = false;
public static function test()
{
if(!self::$instance)
{
self::$instance = new self();
}
return self::$instance;
}
public function test1()
{
//...
}
public function test2()
{
//...
}
}
И я продолжаю вызывать функции, связывая их так:
$data = Test::test(...)->test1(...)->test2(...);
В данный момент для работы вышеуказанной цепочки методов я должен продолжать возвращаться $instance
и мне бы очень хотелось, чтобы я мог вернуть что-то из test2 (), чтобы потом быть назначенным $data
но я не уверен, как это сделать, так как я должен продолжать возвращаться $instance
для того, чтобы цепочка метода mt работала?
Если вы хотите объединить методы в цепочку, вам нужно вернуть текущий экземпляр из любого метода, к которому после него подключен другой вызов. Однако это не обязательно для последнего вызова в цепочке. В этом случае это означает, что вы можете вернуть все, что хотите от test2()
Просто имейте в виду, если вы вернете что-то отличное от test2()
Вы никогда не сможете связать что-либо с этим в будущем. Например, $data = Test::test(...)->test2(...)->test1(...);
не сработает.
Protip: Стоит документировать ваш код с некоторыми комментариями, поясняющими, какие из них являются цепочечными, а какие нет, чтобы вы не забыли в будущем.
Вообще говоря, если вы делаете цепочку методов, и я предполагаю, что каждый из приведенных выше тестов возвращает вашу модель данных в другое состояние, и я предполагаю, что вам нужны некоторые данные из самой модели. Я бы сделал следующее:
class Test
{
private static $model;
public function test1() {
//do something to model
return $this;
}
public function test1() {
//do something to model
return $this;
}
public function finish_process() {
//process results
return $this.model;
}
}
так что по сути я могу сделать следующее сейчас:
$results = Test::test1()->finish_process();
а также
$results = Test::test1()->test2()->finish_process();
Вы можете передать $ data по его ссылке, и вы можете изменить его или присвоить ему любые данные.
// inside class
public function test2( &$data ) {
$data = 'it will work';
}
// outside class
$data = '';
Test::test(...)->test1(...)->test2($data);
Проверь это http://php.net/manual/en/language.references.pass.php
return $this
внутри test1()
а также test2()
методы.