エラーログクラスを作成しようとしています.DB、ファイル、リターン、スクリーンなどのさまざまな出力方法を設定する関数がいくつかあります。すべてのエラーを配列に格納し、__destruct()が呼び出されたときに、クライアントがデータとユーザーが経験したエラーに関するログの詳細を待機するのを停止したいと考えています。このようにして、彼らは私にエラーを報告する必要はありません。
機能をテストするためのシンプルな GUI と、マシンからマシンへの JSON で応答を生成する実際のスクリプトの 2 つのモードがあります。GUI の場合、最終的なダンプは問題ありませんが、JSON の場合、応答が破棄されます。そのため、すべてのエラー報告がオフになり、画面にダンプされるエラーを自分で処理する必要があります。したがって、$returntruefunction flush_log($return)に設定すると、関数が文字列を返すようになります。
エラーのフラッシュを報告した後、私はしたい:unset($this->log_arrays)
または空:$this->log_arrays=Array();ですが、範囲外です-理由は理解していますが、関数がローカルコピーを使用しています-しかし、配列をリセットするにはどうすればよいですか?
[編集]:
私は試した:
$this->log_arrays = Array();$this->log_arrays = null;配列のポップ:
for ($i = 1; count($this->log_arrays); $i++) { array_pop($this->log_arrays); }
しかし、クラス関数内では変数のコピーを操作するため、基本的にスコープ外であるため、どれも機能しないと思います。
[/編集]:
これはすでに単純化されたクラスです..:
<?php
    class log_strings extends mysqli 
    {
        private $log_arrays = Array();
        public function __construct($output_to_file=false, $output_to_db=true, $fall_back_file=true, $arguments, $ip=null)
        {
            // Setup mysqli connection, file handle or report error if one or all have failed.
            // Also check wich outputs should be used and keep that info for later.
        }
        public function log($level, $string)
        {
            $log_arrays[] = Array('level' => $level, 'string' => $string);
        }
        public function __destruct()
        {
            $this->flush_log();
        }
        public function flush_log($return=false)
        {
            if (!isset($log_arrays) && count($log_arrays) == 0)
            {
                return true;
            }
            if ($return)
            {
                return $this->return_output();
            }
            else
            {
                $success = false;
                // if enabled, output to db
                if ($this->output_to_db) 
                {
                    $success = $success || $this->mysqli_output();
                }
                // if enabled or if db failed and fallback is enabled, output to file
                if ($this->output_to_file || ($this->fall_back_file && !$success)) 
                {
                    $success = $success || $this->file_output();
                }
                // if neither file or db succeeded, dump on screen
                if ($success = false)
                {
                    $this->screen_dump();
                }
                return true;
            }
            unset($this->log_arrays); // <= This is what it is all about!
        }
        private function screen_dump()
        {
            foreach($this->log_arrays as $array)
            {
                echo "<strong>{$array['level']}</strong>{$array['string']}<br/>\n";
            }
        }
        private function mysqli_output()
        {
            // Output to db functionally equal to $this->screen_dump()
        }
        private function file_output()
        {
            // Output to file functionally equal to $this->screen_dump()
        }
        private function return_output()
        {
            // Return output functionally equal to $this->screen_dump()
        }
    }
?>