在 PHP 中定义自动加载器函数的最佳方法是什么,该函数可以显示在找不到类时是哪一行导致调用该函数?

发布于 2024-10-14 01:42:50 字数 203 浏览 4 评论 0原文

Atm 我有一个简单的自动加载器,它只是将下划线转换为前斜杠并粘贴在最后的 .php 上。当然,这需要您将“应用程序目录”添加到包含路径中。

当您尝试使用找不到的类时,就会出现此问题。在这种情况下,PHP 只会发出一些微不足道的警告和错误,这些警告和错误仅指向我的自动加载器函数作为源。

找出哪个文件中的哪一行导致自动加载器尝试加载丢失的类的最简单方法是什么?

Atm I have a simple autoloader that just converts underscores to front slashes and sticks on a .php at the end. Naturally this requires you to add your "app dir" to the include path.

The problem appears when you attempt to use a class that cannot be found. In this case PHP will just emit some measly Warnings and Errors that only point to my autoloader function as the source.

What is the easiest way to find out which line in which file caused the autoloader to attempt to load the missing class?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧时浪漫 2024-10-21 01:42:50

下面是我最终的做法,稍作修改:

function classNameToPath($className) {
  // Add your code which converts a class name to a relative path and returns it
  // For example Databases_Connection => Databases/Connection.php
}

function __autoload($className) {
  $classFile = classNameToPath($className);
  $allIncludePaths = preg_split("/:/", get_include_path());
  foreach($allIncludePaths as $includePath) {
    if (file_exists("${includePath}/${classFile}")) {
      require_once($classFile);
      return;
    }
  }
  throw new Exception("Class not found {$clasSName}");
}

这允许您将“main”函数包装在 try 块中,您可以在其中捕获这些异常并从异常中获取 stackTrace 并在

 内部回显它; 元素例如。我很喜欢你必须在 PHP 中自己编写所有这些东西;)即使你没有捕获类未找到的异常,PHP 仍然会捕获它们并自动显示堆栈跟踪,只是不在 
< 内/code> 因此,如果您在浏览器中看到它,那么它会在一行中变得一团糟。

Here's how I ended up doing it, slightly modified:

function classNameToPath($className) {
  // Add your code which converts a class name to a relative path and returns it
  // For example Databases_Connection => Databases/Connection.php
}

function __autoload($className) {
  $classFile = classNameToPath($className);
  $allIncludePaths = preg_split("/:/", get_include_path());
  foreach($allIncludePaths as $includePath) {
    if (file_exists("${includePath}/${classFile}")) {
      require_once($classFile);
      return;
    }
  }
  throw new Exception("Class not found {$clasSName}");
}

This allows you to wrap your "main" function in a try block, where you can catch these exceptions and get the stackTrace from the exception and echo it inside of <pre> elements for example. Gotta love that you have to code all these things yourself in PHP ;) Well even if you don't catch the class not found exceptions PHP will still catch them and automatically display the stacktrace, just not within <pre> so it will be a big mess on one line if you see it in your browser.

三月梨花 2024-10-21 01:42:50

添加类似这样的内容:

if (!file_exists($class.'.php')) {
  echo '<pre>';
  debug_print_backtrace();
  echo '</pre>';
}

或者更详细:

if (!file_exists($class.'.php')) {
  // PSEUDO CODE!
  echo '<pre>';
  $debug = debug_backtrace();
  echo 'Line: '.$debug['line'];
  echo '</pre>';
}

Add something like this:

if (!file_exists($class.'.php')) {
  echo '<pre>';
  debug_print_backtrace();
  echo '</pre>';
}

or do it more detailed:

if (!file_exists($class.'.php')) {
  // PSEUDO CODE!
  echo '<pre>';
  $debug = debug_backtrace();
  echo 'Line: '.$debug['line'];
  echo '</pre>';
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文