2017-10-05 7 views
-2

問題があります、スタック全体をループするか、どこかで停止したいのですが、何とかしてループがカウントするのではなく、何かをスローしています... item value is 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

本当にシングルトンの場合、同じオブジェクトを返す心配はありません。それについて心配する必要はありません – shashi

+2

シングルトンとシャットダウン機能からコードを投稿できますか? – vincenth

答えて

1

それを変更しました意図どおりに動作し、コンストラクタは一度だけ呼び出されます。あなたの他の問題(1のブーフの代わりに、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が表示され、表示されます。