无法在链责任模式中更改父变量

问题描述 投票:1回答:1

我使用了链责任模式,我完全学会了它,但是当我想要实现一些计数器,在任务完成后,下一个任务将被调用,这是行不通的,我想制作一个计数器来计算任务,完成...我有3个类命名灯,警报,锁和所有这些中的检查方法的最后一部分,我调用next方法检查下一个对象中的方法,我在下一个方法中增加了父类中的计数器变量但是我不知道为什么输出是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。我错了吗?谢谢。

php chaining
1个回答
0
投票

LocksLightsAlarm的每个实例都有自己的受保护财产$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中阅读有关静态属性的更多信息

© www.soinside.com 2019 - 2024. All rights reserved.