PHP 静态函数调用了两次

PHP Static Function Called Twice

我正在构建 MVC PHP 框架。我正在研究错误记录。我正在测试一个系统来显示和记录(在 .txt 文件中)由 try, catch 块抛出的错误。由于它很短,我已经包含了整个 index.php:

<?php
  // *** SETUP THE DOCUMENT ***
  // Declare strict_types.
  declare(strict_types = 1);

  // Include the autoload file.
  require_once "classes/autoload.php";

  // Create a new config variable to allow us to call the config file from anywhere.
  new Config();

  // Setup error reporting according to the config.
  error_reporting(Config::$config['defaults']['errReporting']);
  ini_set("display_errors", Config::$config['defaults']['ini_setErrors']);

  // Errors::showCatch("Test");

  try {
    $test = new QueryExamples();
    $test->getTexts();
  } catch (Error $e) {
    Errors::showCatch($e);
  }

  unset($test);

我已经安装了自动加载器。如果有人想要的话,我会把它的代码包括在内。下一位是一个名为 errors.php 的文件,它由 try、catch 调用,并根据框架配置文件的设置方式在屏幕上显示消息 and/or 将其发送到日志文件:

class Errors{

    static function showCatch($errMessage){
      // If manual errors are turned on in the config file.
      if(Config::$config['defaults']['manErrors'] == 1){
        // Show the error message.
        echo "<br />{$errMessage}<br />";
      }

      // Log the error.
      Logs::logManError($errMessage);
      die();
    }

}

它在文件中的记录方式和位置由另一个文档中的另一个静态函数处理:

class Logs{

    static function logManError($errMessage) {
      // If custom error logging is turned on in the config file:
      if (Config::$config['defaults']['customErrorsLogging'] == 1) {
        // Get the file path from the config file.
        $manErrors_file = Config::$config['paths']['customErrors'];

        // Format the error message.
        $logTxt = "New Custom Error - [".date("d/m/Y - H:i:s")."]\n".$errMessage."\n\n";

        file_put_contents($manErrors_file, $logTxt, FILE_APPEND);
      }
    }

}

日志文件中的输出:

New Custom Error - [23/03/2020 - 01:50:17]
Error: (Error message)

New Custom Error - [23/03/2020 - 01:50:17]
Error: (Error message)

我更改了错误消息以尝试查找调用错误的位置:

// Format the error message.
// $logTxt = "New Custom Error - [".date("d/m/Y - H:i:s")."]\n".$errMessage."\n\n";
$logTxt = debug_backtrace()["0"]['file']." ".debug_backtrace()['0']['line']."\n".debug_backtrace()['1']['file']." ".debug_backtrace()['1']['line']."\n\n";

日志文件中的输出:

F:\xampp\htdocs\FRED 0.0.0\classes\errors.php 21
F:\xampp\htdocs\FRED 0.0.0\index.php 22

F:\xampp\htdocs\FRED 0.0.0\classes\errors.php 21
F:\xampp\htdocs\FRED 0.0.0\index.php 22

errors.php:21 是我调用 Logs:logManError() 静态函数的地方,index.php:22 是我在 try、catch 块中调用 Errors:showCatch() 函数的地方。

我还尝试将全局变量添加到 index.php 以检查 showCatch() 函数被调用了多少次:

(index.php)

$GLOBALS['i'] = 0;

(errors.php)

$GLOBALS['i'] += 1;

// Log the error.
Logs::logManError($errMessage."<br />".$GLOBALS['i']);
die();

输出:

New Custom Error - [23/03/2020 - 01:50:17]
Error: (Error message)
1

New Custom Error - [23/03/2020 - 01:50:17]
Error: (Error message)
1

好的。这是答案。经过更多研究后,我的代码似乎没有任何问题。这似乎与重写引擎和其他一些东西有关。我在提供解决方案的页面中包含了 link。

https://www.sitepoint.com/community/t/duplicate-entries-with-file-put-contents-when-rewriteengine-on/16188/11