【问题标题】:Logger Object - Variable Scope - access to Class/Function/etc记录器对象 - 变量范围 - 访问类/函数/等
【发布时间】:2010-09-24 19:54:52
【问题描述】:

所以我想找到允许我的 Logger 类访问脚本的任何部分的最佳方法,或者另一个类/函数/等...我该怎么做?如何使其全球化。

我可以这样做吗:

Logger::info('Add message like this?');

调用脚本:calling.php

require_once('Logger.class.php'); // Just adding the class initializes the Logger Object
require_once('Another.class.php');
require_once('Functions.php');

$logEntry->info("Log info");
$logEntry->error("Log error");
$logEntry->warning("Log warning");
$logEntry->notice("Log notice");

$logEntry->enableDebug(); // prints debug to log
$logEntry->debug("Log debug enabled");
$logEntry->disableDebug();
$logEntry->debug("Log debug disabled"); // will not print to log

$another_obj = new Another(); // want the Logger to have access inside this class
More(); // want the Logger to have access inside this function

另一个.class.php

class Another {
   private $var;

   // I want to add the Logger here
   $logEntry->info("Another Log");

   // More code here it's just an example ...
}

函数.php

function More() {
   // I want to add the Logger here
   $logEntry->info("More Log");
}

这里是 Logger.class.php 脚本

<?php 
//Define Constants
define("LOG_FILE_DIRECTORY", "/var/www/logs");
ini_set("memory_limit","128M"); // Logger class is taking up memory

class Logger {
    private $log_file_directory = LOG_FILE_DIRECTORY;
    private $first_run;         // Flag to add line break at the beginning of script execution
    private $calling_script;    // Base name of the calling script
    private $log_file;          // log file path and name
    private $log_entry;         // information to be logged
    private $log_level;         // Log severity levels: error, warning, notice, debug, info
    private $fh;                // File handle
    private $file_name;         // File path and name
    private $file_parts;        // Array of $file_name
    private $script_name;       // Script Name
    private $script_parts;      // Array of $script_name
    private $line_number_arr;   // Line number of where the logging event occurred 
    private $debug_flag;        // Set to true if you want to log your debug logger

    function __construct() {
        $this->first_run        = true;
        $this->debug_flag       = false;
        $this->calling_script   = '';       
        $this->log_file         = '';
        $this->log_entry        = '';
        $this->log_level        = '';
        $this->fh               = '';
        $this->file_name        = '';
        $this->file_parts       = '';
        $this->script_name      = '';
        $this->script_parts     = '';   
        $this->line_number_arr  = '';   
    }

    /**
     * @enableDebug
     */
    public function enableDebug() {
        $this->debug_flag = true;
    }

    /**
     * @disbaleDebug
     */
    public function disableDebug() {
        $this->debug_flag = false;
    }

    /**
     * @info
     */
    public function info($message) {
        $this->log_level = 'info';
        $this->line_number_arr = debug_backtrace();
        $this->addEntry($message);
    }

    /**
     * @error
     */
    public function error($message) {
        $this->log_level = 'error';
        $this->line_number_arr = debug_backtrace();
        $this->addEntry($message);
    }

    /**
     * @warning
     */
    public function warning($message) {
        $this->log_level = 'warning';
        $this->line_number_arr = debug_backtrace();
        $this->addEntry($message);
    }

    /**
     * @notice
     */
    public function notice($message) {
        $this->log_level = 'notice';
        $this->line_number_arr = debug_backtrace();
        $this->addEntry($message);
    }

    /**
     * @debug
     * must add the below to the script you wish to debug
     * define("DEBUG", true); // true enables, false disables
     */
    public function debug($message) {
        if($this->debug_flag) {
            $this->log_level = 'debug';
            $this->line_number_arr = debug_backtrace();
            $this->addEntry($message);
        }       
    }

    private function addEntry($message) {
        $this->calling_script = $this->getScriptBaseName();
        $this->log_file = $this->log_file_directory."/".$this->calling_script.".log";
        $this->fh = fopen($this->log_file, 'a') or die("Can't open log file: ".$this->log_file);

        if($this->first_run) {
            $this->log_entry = "\n[" . date("Y-m-d H:i:s", mktime()) . "][line:".$this->line_number_arr[0]['line']."|".$this->log_level."]:\t".$message."\n";
        } else {
            $this->log_entry = "[" . date("Y-m-d H:i:s", mktime()) . "][line:".$this->line_number_arr[0]['line']."|".$this->log_level."]:\t".$message."\n";
        }   
        fwrite($this->fh, $this->log_entry);
        fclose($this->fh);

        $this->first_run = false;
    }

    /**
     * return the base name of the calling script
     */
    private function getScriptBaseName() {
        $this->file_name    = $_SERVER["SCRIPT_NAME"];
        $this->file_parts   = explode('/', $this->file_name);
        $this->script_name  = $this->file_parts[count($this->file_parts) - 1];
        $this->script_parts = explode('.', $this->script_name);

        // If file doesn't exists don't add line break
        if(!file_exists($this->script_parts[0].".log")) {
            $this->first_run = false;
        }
        return $this->script_parts[0];
    }
}

// Start log instance 
$logEntry = new Logger();

?>

【问题讨论】:

    标签: php scope


    【解决方案1】:

    你可以将它实现为一个充满静态函数的类,例如:

    class Logger {
      protected $logfile = null;
    
      public static load() {
        self::$logfile = fopen('error.log', 'a');
      }
    
      public static info($msg) {
        if(self::$logfile == null)
          self::load();
    
        fwrite(self::$logfile, $msg);
      }
    }
    

    然后将其与Logger::info("My message.."); 一起使用。另一种常见的方法是使用单例类,这样您只能创建一个“Logger”对象并使用例如检索它。 Logger::getInstance()-&gt;logInfo("My message");.

    在您的情况下(因为您已经将 Logger 实现为普通类),我会将 __construct 设为私有并将该类实现为单例。无法使 $logEntry 全局可用。您的代码将变为:

    <?php 
    //Define Constants
    define("LOG_FILE_DIRECTORY", "/var/www/logs");
    ini_set("memory_limit","128M"); // Logger class is taking up memory
    
    class Logger {
        private $log_file_directory = LOG_FILE_DIRECTORY;
        private $first_run;         // Flag to add line break at the beginning of script execution
        private $calling_script;    // Base name of the calling script
        private $log_file;          // log file path and name
        private $log_entry;         // information to be logged
        private $log_level;         // Log severity levels: error, warning, notice, debug, info
        private $fh;                // File handle
        private $file_name;         // File path and name
        private $file_parts;        // Array of $file_name
        private $script_name;       // Script Name
        private $script_parts;      // Array of $script_name
        private $line_number_arr;   // Line number of where the logging event occurred 
        private $debug_flag;        // Set to true if you want to log your debug logger
        private static $instance = null;
    
        private function __construct() {
            $this->first_run        = true;
            $this->debug_flag       = false;
            $this->calling_script   = '';       
            $this->log_file         = '';
            $this->log_entry        = '';
            $this->log_level        = '';
            $this->fh               = '';
            $this->file_name        = '';
            $this->file_parts       = '';
            $this->script_name      = '';
            $this->script_parts     = '';   
            $this->line_number_arr  = '';   
        }
    
        public static function getInstance() {
            if (!isset(self::$instance)) {
                $c = __CLASS__;
                self::$instance = new $c;
            }
    
            return self::$instance;
        }
    
        /**
         * @enableDebug
         */
        public function enableDebug() {
            $this->debug_flag = true;
        }
    
        /**
         * @disbaleDebug
         */
        public function disableDebug() {
            $this->debug_flag = false;
        }
    
        /**
         * @info
         */
        public function info($message) {
            $this->log_level = 'info';
            $this->line_number_arr = debug_backtrace();
            $this->addEntry($message);
        }
    
        /**
         * @error
         */
        public function error($message) {
            $this->log_level = 'error';
            $this->line_number_arr = debug_backtrace();
            $this->addEntry($message);
        }
    
        /**
         * @warning
         */
        public function warning($message) {
            $this->log_level = 'warning';
            $this->line_number_arr = debug_backtrace();
            $this->addEntry($message);
        }
    
        /**
         * @notice
         */
        public function notice($message) {
            $this->log_level = 'notice';
            $this->line_number_arr = debug_backtrace();
            $this->addEntry($message);
        }
    
        /**
         * @debug
         * must add the below to the script you wish to debug
         * define("DEBUG", true); // true enables, false disables
         */
        public function debug($message) {
            if($this->debug_flag) {
                $this->log_level = 'debug';
                $this->line_number_arr = debug_backtrace();
                $this->addEntry($message);
            }       
        }
    
        private function addEntry($message) {
            $this->calling_script = $this->getScriptBaseName();
            $this->log_file = $this->log_file_directory."/".$this->calling_script.".log";
            $this->fh = fopen($this->log_file, 'a') or die("Can't open log file: ".$this->log_file);
    
            if($this->first_run) {
                $this->log_entry = "\n[" . date("Y-m-d H:i:s", mktime()) . "][line:".$this->line_number_arr[0]['line']."|".$this->log_level."]:\t".$message."\n";
            } else {
                $this->log_entry = "[" . date("Y-m-d H:i:s", mktime()) . "][line:".$this->line_number_arr[0]['line']."|".$this->log_level."]:\t".$message."\n";
            }   
            fwrite($this->fh, $this->log_entry);
            fclose($this->fh);
    
            $this->first_run = false;
        }
    
        /**
         * return the base name of the calling script
         */
        private function getScriptBaseName() {
            $this->file_name    = $_SERVER["SCRIPT_NAME"];
            $this->file_parts   = explode('/', $this->file_name);
            $this->script_name  = $this->file_parts[count($this->file_parts) - 1];
            $this->script_parts = explode('.', $this->script_name);
    
            // If file doesn't exists don't add line break
            if(!file_exists($this->script_parts[0].".log")) {
                $this->first_run = false;
            }
            return $this->script_parts[0];
        }
    }
    
    ?>
    

    然后您将使用Logger::getInstance()-&gt;info($msg);

    全局使用您的类

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多