2

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

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

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

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

4

3 回答 3

3

您可以使用__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”,自动加载器就会为您找到它。

于 2012-09-08T00:52:46.827 回答
2

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

class Foo
{
    /* stuff */
}

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

编辑很抱歉,但是 PHP 在加载或首次实例化类时绝对没有提供任何挂钩,即使在其怪异扩展的最肮脏角落也是如此。如果不编辑类的源文件(并使用我的解决方案)或将它们组织在传统的层次结构中以将它们放入(并使用 Josh 的解决方案),您将无法逃脱。

功能请求 #48546要求提供一种方法来设置何时包含文件的回调,但它不会去任何地方。否则,人们似乎对__autoload.

充其量,您可以get_declared_classes随时调用并查看已加载的内容。

于 2012-09-08T01:03:46.340 回答
1

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

<?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();它在此之前的任何时候都不会启动一样。

于 2012-09-08T00:53:34.130 回答