私は以前、静的プライベートとプライベートの違いについて質問しましたが、Lao Xu は、それはアクセス方法の違いだけだと言いました。その後、インターネット上の一部の人々は、静的はパフォーマンスを向上させることができると言っていますが、Lao Xu は異なる意見を持っていると言いました。
今日、誰かがこんなことを言っているのをまた見かけました。 1. クラス メソッドを静的として定義できる場合は、それを静的に定義してみます。そうすれば、その速度はほぼ 4 倍向上します。
この声明の出典: http://www.php100.com/html/it/focus/2014/0403/6746.html
この声明が真実か偽か、また著者がどのようにテストして作成したのかはわかりません。この言葉は確信を持って言えます 毛織物?
static は静的プロパティを宣言し、クラスをインスタンス化せずに直接アクセスできます
彼が言った高速化は、おそらく public インスタンス化せずに直接アクセスできるプロパティにのみ適用されます
ただし、 private 保護された属性には外部から直接アクセスできないため、高速化はありません
真実をテストするための唯一の基準は実践です
class T { static function foo($n) { return $n + 1; } function foo1($n) { return $n + 1; }}function foo($n) { return $n + 1;}$p = new T;$k = 1000000;$t = microtime(1);for($i=0; $i<$k; $i++) T::foo($i);echo '静态方法 ',microtime(1) - $t, PHP_EOL;$t1 = microtime(1);for($i=0; $i<$k; $i++) foo($i);echo '独立函数 ', microtime(1) - $t1, PHP_EOL;$t2 = microtime(1);for($i=0; $i<$k; $i++) $p->foo1($i);echo '对象方法 ', microtime(1) - $t2, PHP_EOL;
Iそれはあなた次第だと思います どうやって比較しますか?
上記の比較方法は、比較対象のオブジェクト作成のパフォーマンスと時間の消費を除外したものです
オブジェクトの作成をループに入れると、オブジェクトメソッドの時間が長くなります
これは完全に個人的な意見です
# によると引数を3つ追加して、
$t3 = microtime(1);for($i=0; $i<$k; $i++) { $p = new T; $p->foo1($i);}echo '对象方法 ', microtime(1) - $t3, PHP_EOL;
2 回目: 静的メソッド 0.23101305961609 独立関数 0.20001196861267 オブジェクトメソッド 0.25701403617859
3回目:静的メソッド 0.22401285171509 独立関数 0.19801115989685 オブジェクトメソッド 0.256014823 91357
4回目:静的メソッド 0.22301316261292 独立関数 0.20001101493835 オブジェクトメソッド 0.25901484489441
5回目:静的メソッド 0.22701287269592 独立関数 0.19801211357117オブジェクトメソッド0.25701403617859
6回目:静的メソッド 0.22201204299927 独立関数 0.19901204109192 オブジェクトメソッド 0.26201510429382
7回目:静的メソッド 0.22201204299927 独立関数 0.2 0 001196861267 オブジェクトメソッド 0.25901484489441
8回目:staticメソッド 0.22301316261292 独立関数 0.19801092147827 オブジェクトメソッド 0.25801491737366
9回目:staticメソッド 0.22201204299927 独立関数 0.19801187515259 オブジェクトメソッド 0.26101493835449
10回目:静的メソッド 0.22201299667358 独立関数 0.20601105690002 オブジェクトメソッド 0.262014865 8 7524
ここでのテストの結果は次のとおりです。どう見ても、オブジェクト メソッドの方が少し時間がかかります。静的メソッド。おそらく作者はこういうことを言いたかったのだろう。
いずれにせよ、熱心にご参加いただきありがとうございました。
あまりにも混乱している場合は、元のコードを自分で勉強して、状況を知ることができます
「クラス メソッドを次のように定義できれば、 static、「静的」と定義してみてください
この文によると、それは正しいです
しかし、「できる」とはどういう意味ですか?ほとんどのメソッドが静的になると、それはある意味オブジェクト指向の考え方ではなくなります
クラスとオブジェクトのより重要な考慮事項は、それらの間の継承と転送だと思います〜
上記は完全に私の個人的な意見です
Ifシングルトン モードを使用すると、オブジェクトは 1 回だけ新しくなります
また、2# 多くの時間と新しいオブジェクトの時間が消費されますが、これは無視できます
しかし、シングルトンについて言えば、静的メソッドよりもまだ少し遅いです。まだメモリが少し増えていますが、シングルトンは継承をサポートしています...
Newクラス全体がオブジェクトとしてインスタンス化されます。それが静的メソッドの場合、クラスは名前空間と同等であり、その名前空間に属する関数を呼び出します