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 には静的コンストラクターがないため、クラスがロードされたときに自動的に何かを行うことはできません。あなたの最善の策は、おそらくクラス定義の後にメッセージを出力することです (または__autoloadJosh の指示に従って使用しますが、それにはあなたの側でいくらか手直しが必要になるかもしれません)。

class Foo
{
    /* stuff */
}

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

編集申し訳ありませんが、PHP は、クラスがロードされたとき、または最初にインスタンス化されたときに、その奇妙な拡張機能の最も汚れたコーナーであっても、まったくフックを提供しません。クラスのソース ファイルを編集する (そして私のソリューションを使用する) か、それらを従来の階層に整理して配置する (そして Josh のソリューションを使用する) ことなしに、この問題を解決することはできません。

ファイルがインクルードされるときにコールバックを設定する方法を求める機能リクエスト #48546がありますが、どこにも行きません。そうでなければ、人々は に満足しているように見えます__autoload

せいぜい、get_declared_classesいつでも呼び出して、既にロードされているものを確認できます。

于 2012-09-08T01:03:46.340 に答える
1

このようなある種のデバッグ メッセージを出力する各クラスのコンストラクター関数にメッセージを入れることができます (ただし、ソースが含まれている正確なドキュメントを見つけて追加できるかどうかを確認する必要があります。私はそれを見つけました)しかし、これはあなたにアイデアを与えるはずです:

<?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 に答える