Я использовал цепная ответственность шаблон, и я полностью изучил его, но когда я хотел реализовать какой-то счетчик, который после выполнения задачи и вызова следующей задачи, которая не работает, я хотел создать счетчик для подсчета выполненных задач … У меня есть 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. Я ошибаюсь? благодарю вас.
Каждый экземпляр 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
Других решений пока нет …