Я хочу связать метод с родительской функцией самого себя.
Пример:
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)
Просто невозможно вызвать родительский метод через открытый интерфейс объекта (даже если это тот же класс / объект, что и текущий контекст). Пожалуйста, посмотрите также https://stackoverflow.com/a/11828729/2833639.
На мой взгляд, ваше решение — верный путь.
Оффтопик: рекомендую прочитать https://ocramius.github.io/blog/fluent-interfaces-are-evil/ оценить, подходит ли интерфейс жидкости для вашего случая использования.
Других решений пока нет …