Невозможно изменить родительскую переменную в схеме ответственности цепочки

Я использовал цепная ответственность шаблон, и я полностью изучил его, но когда я хотел реализовать какой-то счетчик, который после выполнения задачи и вызова следующей задачи, которая не работает, я хотел создать счетчик для подсчета выполненных задач … У меня есть 3 класса с именем света, сигнализации, замки и в последней части метода проверки во всех этих, я вызываю следующий метод для проверки метода в следующем объекте, Я увеличил значение переменной счетчика в родительском классе в следующем методе, но я не знаю, почему вывод равен 5,5,5. Это код в любом случае:

abstract class HomeChecker {
protected $successor;
protected $counter = 0;
public abstract function check(HomeStatus $home);
public function succeedWith(HomeChecker $successor)
{
$this->successor = $successor;
}
public function next(HomeStatus $home)
{
**$this->counter += 5;
var_dump($this->counter);**
if ($this->successor)
{
$this->successor->check($home);
}
}
}

class Locks extends HomeChecker{
public function check(HomeStatus $home)
{
**//some code
$this->next($home);**
}
public function hello(){
return $this->counter;
}
}
class HomeStatus {
public $alarmOn = true;
public $locked = true;
public $lightsOff = true;
}
$locks = new Locks;
$lights = new Lights;
$alarm = new Alarm;
$locks->succeedWith($lights);
$lights->succeedWith($alarm);
$status = new HomeStatus;
$locks->check($status);
echo $lights->hello();
echo $alarm->hello();
echo $locks->hello();

после этого у меня есть 5,5,5, и это странно, потому что следующий метод был вызван 3 раза, что он должен увеличить переменную счетчика в 3 раза на 5, что составляет 15. Я ошибаюсь? благодарю вас.

1

Решение

Каждый экземпляр Locks, Lights а также Alarm имеет собственную независимую копию охраняемого объекта $counterУнаследовано от HomeChecker, Счетчик не используется совместно, поэтому для каждого экземпляра значение счетчика равно 5.

Один из подходов к разделению одного счетчика между всеми экземплярами этих классов заключается в использовании статического свойства HomeChecker:

abstract class HomeChecker
{

// ...

protected static $counter = 0;

// ...

public function next(HomeStatus $home)
{
self::$counter += 5;
var_dump(self::$counter);
if ($this->successor)
{
$this->successor->check($home);
}
}

// ...
}

class Locks extends HomeChecker
{

// ...

public function hello(){
return self::$counter;
}

// ...
}

Эти изменения дадут вам выход 15 что вы ожидаете, как статическое свойство $counter сейчас поделился. Вы можете прочитать больше о статических свойствах в руководстве http://php.net/manual/en/language.oop5.static.php

0

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector