非静的と呼ばれる静的関数をどのように検出できますか?例えば非静的と呼ばれる静的関数の検出
、この場合には:誰かがどこか間違って、それは、関連する何かを返すだろうと期待して、インスタンス上の関数を呼び出します。
class Foo
{
public static function bar()
{
// How can I tell here that bar() is called on an instance?
//var_dump(debug_backtrace()[0]['type'] == '::');
// at all times the above prints bool(true)
return 1;
}
}
// later in the code
$foo = new Foo();
$foo::bar(); // that's fine
// even later
$foo->bar(); // this should not happen, yet it's here and there
私は、このような上記の最後の行になどのケースをデバッグし、根絶したいです件名のインスタンスに;代わりに、いくらか関連する定数が得られます。その後、いつ起こるか知る必要があります。地獄が緩んだり、例外がスローされたりするのは私にとっても大丈夫です。
これまでのところ私はdebug_backtrace()[0]['type']
したがって、静的な機能のための非静的呼び出しがinternally translated into static callsであることを発見した何も(それは両方のケースで::
です)を教えてくれるん。
静的でない関数を静的に呼び出すとエラーになります。静的でない静的関数を呼び出すことは**ではありません**。あなたのコードは前者ではなく後者の例です。 – Sherif
@Sherif質問を更新して、それが実際にはエラーではないことをより明白にしてください。 – sanmai
私は何を疑問に思っているのでしょうか?私を捨てたのは、あなたが「*これらのケースをデバッグする」というステートメントを使用するという事実です。これは、バグの原因となる印象を受けていると信じています。それはできません。 PHPは既にメソッドが静的に宣言されていることをコンパイル時に知っています。したがって、実行時にオブジェクトインスタンスからメソッドを呼び出そうとしても構いません。静的コンテキストを使用することはまだ分かっています。 – Sherif