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 функция на самом деле не создает экземпляр;)

Другие вопросы по тегам