クラスをロードするたびに、.php ファイルへのフル パスを含むデバッグ情報を標準エラーに出力するように PHP に設定したいと考えています。
/path/to/my/class/MyClass.php から MyClass をロードしました
ソースファイルがどこにあるかを事前に知らずにこれを行う方法はありますか?
[.php ファイルへのフル パスを本当に気にかけていること、およびソース ファイルがどこにあるかを事前に知らないことを明確にするために編集]
__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 には静的コンストラクターがないため、クラスがロードされたときに自動的に何かを行うことはできません。あなたの最善の策は、おそらくクラス定義の後にメッセージを出力することです (または__autoload
Josh の指示に従って使用しますが、それにはあなたの側でいくらか手直しが必要になるかもしれません)。
class Foo
{
/* stuff */
}
echo "Class Foo loaded from " . __FILE__ . "\n";
編集申し訳ありませんが、PHP は、クラスがロードされたとき、または最初にインスタンス化されたときに、その奇妙な拡張機能の最も汚れたコーナーであっても、まったくフックを提供しません。クラスのソース ファイルを編集する (そして私のソリューションを使用する) か、それらを従来の階層に整理して配置する (そして Josh のソリューションを使用する) ことなしに、この問題を解決することはできません。
ファイルがインクルードされるときにコールバックを設定する方法を求める機能リクエスト #48546がありますが、どこにも行きません。そうでなければ、人々は に満足しているように見えます__autoload
。
せいぜい、get_declared_classes
いつでも呼び出して、既にロードされているものを確認できます。
このようなある種のデバッグ メッセージを出力する各クラスのコンストラクター関数にメッセージを入れることができます (ただし、ソースが含まれている正確なドキュメントを見つけて追加できるかどうかを確認する必要があります。私はそれを見つけました)しかし、これはあなたにアイデアを与えるはずです:
<?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();
それ以前の時点では開始されないようにメッセージをエコーアウトします。