【问题标题】:Is there any way to make PHP load classes verbosely, indicating the full path to the .php file?有什么方法可以使 PHP 加载类,指示 .php 文件的完整路径?
【发布时间】:2012-09-08 10:15:35
【问题描述】:

我想让 PHP 在加载类时将调试信息(包括 .php 文件的完整路径)打印到标准错误:例如

从 /path/to/my/class/MyClass.php 加载 MyClass

有没有办法在不事先知道源文件在哪里的情况下做到这一点?

[编辑澄清我真的很关心 .php 文件的完整路径,而且我事先不知道源文件在哪里]

【问题讨论】:

  • 是的。 “如何”取决于你想要它去哪里。选项包括登录日志文件、通过 FirePHP 发回该信息或将其全部存储以显示在某处的 Web 文档中。

标签: php debugging


【解决方案1】:

您可以使用__autoload($class)

<?php
function __autoload($class_name) 
{
    echo "Loading: $class_name";
    include $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 
?>

为此,您只需跳过显式导入,例如“include x.php”或“require_once x.php”,自动加载器会为您找到它。

【讨论】:

  • 我想显示 .php 文件的完整路径。抱歉,如果原始问题不够清楚。
【解决方案2】:

由于 PHP 没有静态构造函数,因此在加载类时无法自动执行某些操作。您最好的选择可能是在类定义之后打印消息(或按照 Josh 的指示使用 __autoload,但这可能需要您进行一些修改)。

class Foo
{
    /* stuff */
}

echo "Class Foo loaded from " . __FILE__ . "\n";

EDIT 很抱歉,PHP 在加载或首次实例化类时绝对没有提供任何挂钩,即使在dirtiest corners of its weird extensions 中也是如此。如果不编辑类的源文件(并使用我的解决方案)或将它们组织在传统的层次结构中以将它们放入(并使用 Josh 的解决方案),您将无法逃脱。

feature request #48546 要求提供一种方法来设置何时包含文件的回调,但它不会去任何地方。否则,人们似乎对__autoload 感到满意。

您最多可以随时致电get_declared_classes,查看已加载的内容。

【讨论】:

  • +1 提醒我__FILE__ 我完全忘记了 :)
  • 谢谢@zneak,但我真的在寻找一种不需要我提前知道源文件在哪里(或对它们有写访问权)的解决方案。最初的问题对此含糊不清,所以我再次澄清了。
  • 这就是我一直在寻找的答案——谢谢!可惜这是一个负面的,但我猜那是 PHP :)
  • @dnw,我也不喜欢发布否定答案。但是,如果您认为这解决了您的问题,请考虑单击此答案分数下方的复选标记;它表明您的问题已得到解答。
  • @zneak:完成。谢谢。我是这里的新手:)
【解决方案3】:

您可以将消息放入每个类的构造函数中,该函数将输出类似这样的某种调试消息(尽管我将不得不看看是否可以找到源所在的确切文档并添加如果我找到了它),但这应该给你一个想法:

<?php

    class something()
    {
        public function __construct()
        {
            echo "New instance of class:something is being made.";
            echo "Class is loaded from ".realpath(__FILE__);
        }
    }

    $var=new something();

?>

输出:

New instance of class:something is being made.
Class is loaded from /var/www/someFolder/incs/myclasses.php

编辑:当您创建像$var= new something(); 这样的类的新对象时,上述更改将回显消息,但在此之前的任何时候都不会启动。

【讨论】:

  • 恐怕这没有被执行 PHP加载一个类。
  • @zneak 啊,好吧,我理解 loads 是指实例化类时,而不是包含文件时。
  • 好想看看.php文件的路径
  • 谢谢,@Fluffeh。我现在意识到我最初的问题是多么的误导。我事先不知道源文件在哪里(例如,它们可能是第三方库)。我已经相应地更新了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2015-06-15
  • 2012-10-23
  • 1970-01-01
相关资源
最近更新 更多