PHP ООП методы цепочки
У меня есть этот код:
class one{
public $instance;
function instance(){
$this->instance = 'instance was created';
}
function execute(){
$this->instance .= "and something happened";
}
}
$class = new one;
$class->instance();
$class->execute();
echo $class->instance;
И он делает то, что я ожидаю, но как я могу объединить действия, например, как я могу вызвать эти функции в одну строку:
$class->instance()->execute();
И я знаю, что это можно сделать так:
one::instance()->execute();
но в этом случае мне нужно иметь статические функции, которые усложняют ситуацию, мне нужно некоторое объяснение этих вещей
4 ответа
Для того чтобы цепочка работала, нужно вернуть $this
из каждого метода вы хотите быть цепным:
class one{
public $instance;
function instance(){
$this->instance = 'instance was created';
return $this;
}
function execute(){
$this->instance .= "and something happened";
return $this;
}
}
Кроме того, плохая идея давать свойствам то же имя, что и методы. Это может быть однозначным для парсера, но это сбивает с толку разработчиков.
Общий подход к созданию цепочки заключается в возвращении $this
как return
для любых методов, которые должны быть связаны. Итак, для вашего кода это может выглядеть так.
class one{
public $instance;
function instance(){
$this->instance = 'instance was created';
return $this;
}
function execute(){
$this->instance .= "and something happened";
return $this;
}
}
Так что ты холодно делаешь
$one = new one;
$one->instance()->execute(); // would set one::instance to 'instance was createdand something happened'
$one->instance()->instance()->instance(); // would set one::instance to 'instance was created';
$one->instance()->execute()->execute(); / would set one::instance to 'instance was createdand something happenedand something happened'
$ Class-> экземпляр ()-> Execute();
Должно работать, но вы должны возвращать свои значения в ваших методах.
Вам необходимо вернуть экземпляр в конце ваших функций:
class one{
public $instance;
function instance(){
$this->instance = 'instance was created';
return $this;
}
function execute(){
$this->instance .= "and something happened";
return $this;
}
}
Тогда вы можете связать их.
Кстати, это, вероятно, просто пример кода, но ваш instance
функция на самом деле не создает экземпляр;)