运算符优先

时间:2017-10-05 09:40:48

标签: php

有一个问题,我想循环整个堆栈或停在某个地方,但不知何故循环抛弃而不是计数......项目值被错误地分配给true,该怎么办?

php7

编辑::

好的......我试着让它变得抽象......

<?php
class foo {
    private static $instance = [];
    private $stack = [];
    private $stop;
    public static function i() {
        if (!isset(static::$instance[0])) {
            static::$instance[0] = new static();
        }
        return static::$instance[0];
    }
    public static function destroy() {
        unset(static::$instance[0]);
    }
    public function stop() {
        $this->stop = true;
    }
    private function __construct() {
        echo '__constructor being called'.PHP_EOL;
        $this->fillTheVoid();
    }
    public function do() {
        echo 'BEGIN'.PHP_EOL;
        $this->work();
        echo 'END'.PHP_EOL;
    }
    private function fillTheVoid() {
        $k = 0;
        for($i = 0; $i < 20 ; $i++) {
            $this->stack[] = ++$k;
        }
    }
    private function work() {
        while($item = array_pop($this->stack) && !$this->stop) {
            echo $item.PHP_EOL;
        }
    }
}

$foo = foo::i();
$foo -> do();
function shutdown() {
    echo 'shutting_down'.PHP_EOL;
    $foo = foo::i();
    $foo -> stop();
    for($i = 3; $i > 0; $i--) {
        sleep(1);
        echo $i.PHP_EOL;
    }
}

register_shutdown_function('shutdown', null);

exit;
?>

输出是:

__constructor being called
BEGIN
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
END
shutting_down
3
2
1

不知怎的,这是循环错误的

我们想要数一数,而不是我们得到的......

这起源于构造函数的问题,但我后来偶然发现了错误的语法,所以我稍微改了一下......

1 个答案:

答案 0 :(得分:1)

据我所知,你的单件按预期工作,构造函数只调用一次。

关于你的另一个问题(获得1的buch而不是20到1的倒计时),这是修复:

private function work() {
    while(($item = array_pop($this->stack)) && !$this->stop) {
        echo 'item:' . $item.PHP_EOL;
    }
}

您需要用括号括起您的分配,否则按如下方式评估:

$item = (array_pop($this->stack) && !$this->stop)

将返回true并在输出中显示为“1”。