2011-07-07 10 views
2

私は大規模なプロジェクトでいくつかの問題を抱えています、そして、特定のクラスにまで沸かせて何らかの理由でインスタンス化されているため、不要な複製/オーバーヘッドが発生します。クラスはインスタンス化されます

インスタンス化されているファイル/行番号を自動的に調べる方法はありますか?

私はここでこの質問を見ました - Find where a class was instantiatedしかし、私はそれが再宣言されているために致命的なエラーを受けていないので、include/requireが問題ではないと思います。

私は、タイムスタンプとtxtファイルへの出力にそれを持っているコンストラクタで、単に合理化/問題のあるコードがどこにあるか知っているし、削除する必要があり、それは

+1

やや関連 - あなたは、NetBeansのようなIDEを使用している場合、あなたはクラス名を強調表示することができます「Find Usages」を選択します。 –

+0

素晴らしい答えがありましたが、インスタンス化はうまくいきました...複数回呼び出された理由は、FFウェブ開発ツールバーでキャッシュを無効にしていたからです。 ...一口 – Horse

答えて

2

debug_backtrace()は何が起こったのか、全体シェバングを与えます。 get_class($ this)は、それが必要な場合に上位の子クラスを与えます。

+0

はプロダクションサーバーで使用することができますか?適用の一部として –

0

コンストラクタの宣言にパラメータを追加できます。それを呼び出す他のクラスはそのパラメータに対して編集されていないため、インスタンス化しようとしている各インスタンスに対してエラーが発生するはずです。

1

プロジェクトをIDEにインポートし、そこで検索することができます。たとえば、Netbeansでは、クラスの名前を右クリックして「Find Usages」を選択すると、特定のクラスへのすべての呼び出しのリストが表示されます(関数なども同様です)。

1

クラスをシングルトンにすることができます。次に、シングルトンパターンを使用するためにクラスが呼び出された場所を更新します。 __construct()をprivateまたはprotectedにして、instance()メソッドを使用してインスタンス化する必要があるようにすることもできます。それはクラスが一度だけ呼び出されることを意味します。

その後、複数回呼び出された場所を把握するために、debug()メソッドでdebug_backtraceを使用してデバッグ情報を出力させることができます。

0

PHPスクリプトのプロファイリングでは、私はxdebug拡張子を使用します。これは、KCachegrindまたはWinCacheGrindと一緒に、どのクラス/関数がそのクラスを呼び出しているかを見ることができます。

0

次のコードスニペットは、debug_backtrace()の使用法に基づいています。

バックトレースは引数とオプションなしでフェッチされ、3つの配列項目に制限されます。配列の2番目の要素から "class"名が返されます。

Demo

コード:

<?php 

class MyClass 
{ 
    // find out where $myClass->exec() was called 
    static function getInstantiatingClass() 
    { 
     return debug_backtrace(2, 3)[2]['class']; 
    } 

    function exec() 
    { 
     echo __METHOD__ . ' was called from Class ' . self::getInstantiatingClass(); 
    } 
} 

class Demo 
{ 
    function test() 
    { 
     $myClass = new MyClass; 
     $myClass->exec(); 
    } 
} 

$demo = new Demo; 
$demo->test(); 

結果:

MyClass::exec was called from Class Demo

関連する問題