PHP-цепочка с родительской функцией

Я хочу связать метод с родительской функцией самого себя.

Пример:

class Query
{
protected $limit;

/**
* Returns some third object that isn't in this family.
* This object represents the results, and also has
* a first function that gets called in a chain.
*/
public function get()
{
// Do Stuff

return new /* ... */;
}

public function take($amount)
{
$this->limit = $amount;

return $this;
}
}

class ChildQuery extends Query
{
protected $singular = false;

public function get()
{
if($this->singular)
return $this->take(1)->parent::get()->first();

return parent::get()
}

public function singular()
{
$this->singular = true;

return $this;
}
}

Это, очевидно, не полный набор функций и не работает, но вы поняли идею. мне бы хотелось ChildQuery::get уметь звонить Query::get в цепочке.

Прямо сейчас я должен сделать это:

public function get()
{
$this->take(1);

parent::get()->first();
}

Что мне не нравится. Есть идеи?

Я использую PHP 7, если это имеет значение.

Мой конечный результат будет выглядеть примерно так:

$query->singular()->get(); // ($query is a ChildQuery)

2

Решение

Просто невозможно вызвать родительский метод через открытый интерфейс объекта (даже если это тот же класс / объект, что и текущий контекст). Пожалуйста, посмотрите также https://stackoverflow.com/a/11828729/2833639.

На мой взгляд, ваше решение — верный путь.

Оффтопик: рекомендую прочитать https://ocramius.github.io/blog/fluent-interfaces-are-evil/ оценить, подходит ли интерфейс жидкости для вашего случая использования.

1

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

Других решений пока нет …

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