2014-01-16 36 views
0

我正在尝试调试一些我不知道的脚本。 我想实现我在类文件的主页面脚本中使用的非常基本的日志记录(我的意思是日志文件)。PHP类中的文件处理函数

但是它不能正常工作,例如这些简单的线条:

if ($file = fopen('C:/wamp/www/xxxx/Logs/General/' . date('Ymd') . '.log', 'a+') { 

    fputs($file, "[" . date('d/m/Y - H:i:s') . "]\t" . "[" . $type ."]\t" . "[" . $author . "]\t" . $message . "\r\n"); 
    fclose($file); 
} 
else 
{ 
    return false; 
} 

工作完美,如果我把它们放在一个PHP函数,包括在我的主网页(例如在log.php顶部文件)。 Howevr他们不会在所有如果他们是在一个类的方法工作:

public function __contruct(array $connectionArgs) 
{ 
    if ($file = fopen('C:/wamp/www/xxxx/Logs/General/' . date('Ymd') . '.log', 'a')) { 
     fwrite($file, "test"); 
     fclose($file); 
    } 
    else 
    { 
     die("fail"); 
    } 

我很新的面向对象编程,所以我猜它是与调用该功能成一个类的方法是什么?

+0

当我说不行,我的意思是什么都不是返回并且文件没有被创建或者更新 – Sciid

+0

你实际上在构造一个对象吗?这是获得构造函数执行的方式 – jeroen

+0

另外考虑['file_put_co ntents'](http://php.net/file_put_contents)与'FILE_APPEND'。 – mario

回答

1

如果您将记录器放入类定义或函数代码中,它不会有所不同。我假设你做错了什么,或者你有一些错误。

这儿,这是工作的例子,你应该关心的

Class Logger 
{ 
    const PATH_TO_LOGS_DIRECTORY = 'C:/wamp/www/xxxx/Logs/General/'; 
    const FILE_DATE_SUFFIX = 'Ymd'; 
    private $handle; 

    public function log($what) { 
     $this->openFile(); 
     fwrite($this->handle, $what . PHP_EOL); 
    } 

    protected function openFile() { 
     if ($this->handle === null) { 
      $this->handle = fopen(self::PATH_TO_LOGS_DIRECTORY . date(self::FILE_DATE_SUFFIX) . '.log', 'a'); 
      if ($this->handle === false) { 
      throw new RuntimeException('Cannot open log file'); 
     } 
     } 
     register_shutdown_function(array($this, 'close')); 
    } 



    public function close() { 
     if($this->handle !== null) { 
      fclose($this->handle); 
     } 
    } 

} 

一些额外的东西:除非你想记录的东西

  1. 没有打开的文件。当你不记录东西时,你不需要到达文件并寻找文件结尾。它被称为延迟初始化。当你想记录一些他们打开文件
  2. 在这个演示类我正在使用一个小窍门,通常当你关闭应用程序,你应该关闭日志文件,(调用fclose()),但然后你已经记住了,然后如果你有例外,你也必须处理。但是你可以使用register_shutdown_function,并且PHP将总是在php脚本的末尾调用该函数。
  3. 看一下PSR-3(https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) - PHP组试图标准化日志记录系统,因此不需要编写你的代码自己的接口来处理
  4. 这是很好的传递日期字符串(时间戳或DateTime对象事件更好参数去构造函数。你应该通过相关性,不能指望他们
+0

感谢您的建议!其实这只是一个错误的错字在脚本的某处... 但是我会按照你所说的有关伐木班的方式去做。 – Sciid