PHP类unset / purge私有数组变量

时间:2013-11-01 14:06:02

标签: php class object scope unset

我正在尝试创建一个错误日志类,我有一些函数来设置各种输出方法,如DB,文件,返回和屏幕。我希望将所有错误存储到一个数组中,并且在调用__destruct()时,我想阻止客户端等待数据以及用户遇到的错误的日志详细信息。这样他们就不必向我报告错误。

我有两种模式,一种用于测试功能的简单GUI,实际脚本在JSON,机器到机器中生成响应。对于GUI,最终转储很好,但对于JSON,它会破坏响应。因此,所有错误报告都已关闭,我必须处理将自己转储到屏幕上的任何错误,因此$return中的function flush_log($return)会使函数返回一个字符串(如果设置为true)。

报告后,我想要清除错误: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);  
    }  
    

但是我认为都不能工作,因为在类函数中你使用变量副本,所以它们基本上不在范围内。

[/ EDIT]:

这是一个已经简化的课程..:

<?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()
        }
    }
?>

1 个答案:

答案 0 :(得分:0)

重置阵列应该可以正常工作

$this->log_arrays = array();

取消设置类属性是一个非常糟糕的主意。因为它可以用于其他方法或其他类别,使用你的潜在吸气剂。