1. PHPでは、静的ではないメソッドを静的に呼び出すことができますか?
今日、PHP で className::methodName() メソッドを使用して、Static として宣言されていないメソッドを呼び出すことができるかどうか尋ねられました。私の心の中では、この用法を以前に見たような気がしますが、少し自信がありません。ご存知のとおり、マニュアルやチュートリアルでは、メソッドは静的メソッドと非静的メソッドに分けられます。通常、静的に呼び出すメソッドは静的メソッドでなければなりません。
非静的メソッドを呼び出すとどうなるでしょうか?まずテストを行ってください。
クラステスト{<br>
関数テスト(){<br>
エコー「うまくいきます」;<br>
}<br>
}<br>
テスト::テスト();<br>
以下を実行すると、返されるエラーは次のとおりです
致命的なエラー:
非静的メソッド test::test() を静的に呼び出すことはできません
/home/×××/test.php
7 行目 呼び出しスタック: 0.0002 332548 1. {main}()
/home/×××/test.php:0<br>
現時点では、非静的メソッドを静的に呼び出すことは不可能だと誰もが考えるかもしれませんが、実際には、test() メソッドは非常に特殊であり、クラスと同じ名前を持ち、コンストラクターメソッド。
テストを続けます。
クラステスト{<br>
関数テスト(){<br>
エコー「うまくいきます」;<br>
}<br>
関数 test2(){<br>
echo 'それも機能します';<br>
}<br>
}<br>
テスト::テスト2();<br>
実行結果:
それも効きますit works too
これは、非静的メソッドの静的な呼び出しは可能ですが、コンストラクターの静的な呼び出しはできないことを示しています。この結論を検証するために、次のテストを実行しました:
<?php<br>
クラステスト{<br>
静的関数 test(){<br>
エコー「うまくいきます」;<br>
}<br>
}<br>
テスト::テスト();
実行結果は以下の通りです:
致命的なエラー: コンストラクター test::test() を静的にすることはできません
/home/xxx/test.php 9行目
コンストラクターは静的に宣言できないため、上記の推論は正しいです。
しかし、この結果は確かに非常に特殊です。おそらく 非静的メソッドを静的に呼び出すことができるのは PHP だけです。非静的メソッドを静的に呼び出すと、次のエラーが報告されます。
非静的メソッドへの静的参照を作成することはできません
HelloWorldApp 型からの showString()
他の言語を 1 つずつ試したわけではありませんが、PHP の特殊な機能を説明するにはこれで十分です。なぜ PHP がそのような状況になるのかについての適切な説明は見つかりませんでした。
2. 非静的メソッドへの静的呼び出しを適用する必要がありますか?
それでは、静的メソッドの代わりにこのメソッドを使用できますか? まず、コードの可読性の観点から、非静的メソッドを静的に呼び出すことは当然推奨されません。これはメンテナーを混乱させることになります。
次に、非静的メソッドを静的に呼び出すことに効率性の点で利点があるかどうかを確認するために、いくつかの実験を行ってみましょう。
クラステスト{関数test2(){}}<br>
for($k=0; $k
{<br>
テスト::テスト2();<br>
}<br>
ここで上記のコードの実行時間は 18 ~ 28 ミリ秒です。標準的な書き込み方法をテストしてみましょう。
クラステスト{静的関数test2(){}}<br>
for($k=0; $k
{<br>
テスト::テスト2();<br>
}<br>
上記のコードの実行時間は 5 ~ 10 ミリ秒です。この観点から、非静的メソッドの静的呼び出しの効率は標準の静的メソッド呼び出しよりもはるかに低いため、非静的メソッドの静的呼び出しは推奨されません。効率性の向上。