2011-07-14 7 views
0

次の例の場合 getでファイルを検索すると、get() of Book classが呼び出される場所を簡単に見つけることができません。
getの多くがBook classに属していないためです。
非静的メソッドが呼び出される場所を見つける方法は?

class Book { 
    function get() { 
    } 
} 

class Pen { 
    function get() { 
    } 
} 

$obj = new Pen; 
$obj->get(); 

$obj = new Book; 
$obj->get(); 

しかし、私はちょうど機能するか、次のコード、 などの静的メソッドを使用する場合、私は簡単にBook_getまたはBook::getでファイルを検索して場所を見つけることができます。
機能を使用すると、Book_getとだけ検索するとwhere the function is calledwhere the function is definedの両方が見つかります。

function Book_get() { 
} 

function Pen_get() { 
} 

Book_get(); 
Pen_get(); 


class Book { 
    static function get() { 
    } 
} 

class Pen { 
    static function get() { 
    } 
} 

Book::get(); 
Pen::get(); 

私は非静的メソッドを使用して、どのように私は簡単に彼らが呼ばれた場所を見つけることができますか?
可能な限り非静的メソッドの代わりに関数または静的メソッドを使用する方が良いですか?

+0

IDEを使用していますか?もしそうなら、どちらですか?また、これはPHPと何が関係がありますか? –

+0

@Ted Hopp私はIDEを使用していません。テキストエディタだけを使用します。私はIDEを使うべきですか? C++のようなコンパイルが必要な言語では、メソッド呼び出しが間違っているとコンパイル時に エラーが発生します。 しかし、PHPのようなスクリプト言語では、 のリリース後に実行時にエラーが発生する可能性があります。 それはPHPにとってより深刻な問題です。 もちろん、これはすべての言語と関係があります。 –

+0

get()の名前をoldGet()に変更します。再コンパイルし、コンパイラはそれが壊れていたことを伝えます。これらは、get()を使用する場所です。 –

答えて

1

私は非静的メソッドを使用するとき、どのように呼び出される場所を簡単に見つけることができますか?前者の場合、任意の適度に良好なコードについて多型現象を通じてクラス
のインスタンスを通して

クラスメンバ関数
、いくつかの方法で呼び出すことができ(動的ディスパッチ)

解析ツールまたはIDEは、オブジェクトのタイプによって関数が呼び出されるクラスを教えてくれますが、 コードを調べずに2番目のケースを追跡する簡単な方法はないと思います。コード解析ツールディスパッチがコンパイル時に動的ではないため、どのクラスメソッドが呼び出されているかを正確に知るには十分なインテリジェントです(Source Insightは確かにそうではありません)。

可能な限り非静的メソッドの代わりに関数または静的メソッドを使用する方がよいですか?

static methodを使用するか使用しないかは、検索で機能を見つけることよりもはるかに深い考えが必要です。
静的関数にはthisというポインタがありません。そのため、静的でないメンバーにはアクセスできません。クラスの静的メンバーに対してのみ操作できます。

1

より良いIDEに切り替えるのが最も簡単な方法です。たとえば、Eclipse CDTを使用すると、呼び出し元の階層を表示して、メソッドのすべての呼び出しサイトを見つけることができます。 (ただし、テンプレートや継承の高度なケースではまだ難しいかもしれませんが)

1

メソッドにthis->のデータへのアクセスが必要な場合は、非静的メソッドにする必要があります。次にオブジェクトをインスタンス化する必要があります(new経由)。

メソッドのすべてが関数パラメータに含まれるデータである場合は、メソッドを静的にすることを検討してください。または静的メソッドのみを使用して別のクラスを作成します。

Book::get(); 
Pen::get(); this will be the best to use in nonstatic 
2

あなたは、常に一時的xgetのようなものにgetの名前を変更し、呼び出し元のポイントを見つけるために再構築することができます。

関連する問題