有一个问题,我想循环整个堆栈或停在某个地方,但不知何故循环抛弃而不是计数......项目值被错误地分配给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
不知怎的,这是循环错误的
我们想要数一数,而不是我们得到的......
这起源于构造函数的问题,但我后来偶然发现了错误的语法,所以我稍微改了一下......
答案 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”。