无法更改链式责任模式中的父变量
Can't change parent variable in chain responsibility pattern
我使用了责任链模式并且我完全学会了它但是当我想实现一些计数器在任务完成后调用下一个任务时,那个不工作,我想做一个计数器来计算已完成的任务...我有 3 个 classes 命名灯,警报,锁和 在所有检查方法的最后一部分那些,我调用下一个方法来检查下一个对象中的方法,我在下一个方法中增加了父class中的计数器变量,但我不知道为什么输出是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,这很奇怪,因为 next 方法被调用了 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
中阅读有关静态属性的更多信息
我使用了责任链模式并且我完全学会了它但是当我想实现一些计数器在任务完成后调用下一个任务时,那个不工作,我想做一个计数器来计算已完成的任务...我有 3 个 classes 命名灯,警报,锁和 在所有检查方法的最后一部分那些,我调用下一个方法来检查下一个对象中的方法,我在下一个方法中增加了父class中的计数器变量,但我不知道为什么输出是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,这很奇怪,因为 next 方法被调用了 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