Как вернуть значения функции при использовании метода цепочки в PHP?

Скажем, у меня есть следующий класс:

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 работала?

1

Решение

Если вы хотите объединить методы в цепочку, вам нужно вернуть текущий экземпляр из любого метода, к которому после него подключен другой вызов. Однако это не обязательно для последнего вызова в цепочке. В этом случае это означает, что вы можете вернуть все, что хотите от test2()

Просто имейте в виду, если вы вернете что-то отличное от test2() Вы никогда не сможете связать что-либо с этим в будущем. Например, $data = Test::test(...)->test2(...)->test1(...); не сработает.
Protip: Стоит документировать ваш код с некоторыми комментариями, поясняющими, какие из них являются цепочечными, а какие нет, чтобы вы не забыли в будущем.

1

Другие решения

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

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();
1

Вы можете передать $ 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

1

return $this внутри test1() а также test2() методы.

0
По вопросам рекламы [email protected]