20

C++プリプロセッサ#defineはまったく異なります。

PHPは、define()単に変数を作成するのと何か違いがありますか?

define("SETTING", 0);  
$something = SETTING;

vs

$setting = 0;  
$something = $setting;
4

10 に答える 10

17

「define」操作自体はかなり遅い - xdebug プロファイラーで確認済み。

http://t3.dotgnu.info/blog/php/my-first-php-extension.htmlのベンチマークは次のとおりです。

  • 純粋な「定義」
    380.785 フェッチ/秒
    14.2647 平均ミリ秒/最初の応答

  • 「hidef」拡張子で定義された定数
    930.783 fetches/sec
    6.30279 mean ms/first-response


リンク切れの更新

上記のブログ投稿はインターネットを離れました。ここでも Wayback Machine 経由で見ることができます。ここに別の同様の記事があります。

著者が参照するライブラリは、ここ (apc_define_constants)ここ (hidef 拡張)にあります。

于 2010-03-16T21:25:40.640 に答える
5

一般に、定数の考え方は (おかしく聞こえますよね? ;))プログラム内で定数であることです。つまり、コンパイラ (インタープリター) は、スクリプト全体で "FOOBAR" を FOOBAR の値に置き換えます。

理論と利点についてはこれで終わりです-コンパイルする場合。現在、PHP は非常に動的であり、ほとんどの場合、PHP スクリプトは実行ごとにコンパイルされるため、違いに気付くことはありません。APCZend OptimizereAcceleratorなどのバイトコードキャッシュを使用しない限り、定数と変数の速度に顕著な違いは見られないはずです。それなら理にかなっています。

定数の他のすべての長所/短所は、既にここに記載されており、PHP マニュアルに記載されています。

于 2008-09-29T10:36:54.247 に答える
5
php > $cat='';$f=microtime(1);$s='cowcow45';$i=9000;while ($i--){$cat.='plip'.$s.'cow';}echo microtime(1)-$f."\n";

0.00689506530762

php > $cat='';$f=microtime(1);define('s','cowcow45');$i=9000;while ($i--){$cat.='plip'.s.'cow';}echo microtime(1)-$f."\n";

0.00941896438599

これは、同様の結果で再現可能です。定数は、変数よりも定義および/または使用が少し遅いように見えます。

于 2009-12-04T01:02:03.900 に答える
4

マニュアルとの違いは次のとおりです

  • 定数の前にはドル記号($)がありません。
  • 定数は、単純な割り当てではなく、define()関数を使用してのみ定義できます。
  • 定数は、変数のスコープ規則に関係なく、どこでも定義およびアクセスできます。
  • 定数は、一度設定すると再定義または未定義にすることはできません。と
  • 定数はスカラー値にのみ評価できます。

私にとっての主な利点は、グローバルスコープです。私は確かにそれらの効率について心配しません-変更可能であってはならないグローバルスカラー値が必要なときはいつでもそれらを使用してください。

于 2008-09-29T10:23:02.080 に答える
3

効率的ではないようです。(そして、ここでのすべての仮定は、php.net からの 1 つのコメントに基づいています。まだ自分でベンチマークを行っていません。)

定数の呼び出しには、変数の呼び出しの 2 倍の時間がかかります。

定数の存在を確認するには 2 ミリ秒かかり、誤検知の場合は 12 ミリ秒かかります!

これは、php のオンライン ドキュメントの定義ページのコメントからのベンチマークです。

defined() を使用する前に、次のベンチマークを見てください。

true                                       0.65ms
$true                                      0.69ms (1)
$config['true']                            0.87ms
TRUE_CONST                                 1.28ms (2)
true                                       0.65ms
defined('TRUE_CONST')                      2.06ms (3)
defined('UNDEF_CONST')                    12.34ms (4)
isset($config['def_key'])                  0.91ms (5)
isset($config['undef_key'])                0.79ms
isset($empty_hash[$good_key])              0.78ms
isset($small_hash[$good_key])              0.86ms
isset($big_hash[$good_key])                0.89ms
isset($small_hash[$bad_key])               0.78ms
isset($big_hash[$bad_key])                 0.80ms

PHP バージョン 5.2.6、Apache 2.0、Windows XP

各ステートメントは 1000 回実行され、1000 回の呼び出しで 12 ミリ秒のオーバーヘッドが発生するため、エンド ユーザーが頭を悩ませることはありませんが、if(true) と比較すると興味深い結果が得られます。

1) if($true) は実質的に同一でした 2) if(TRUE_CONST) はほぼ 2 倍遅くなりました - コンパイル時に置換が行われていないと思います (これを再確認する必要がありました!) 3) defined() は定数が存在する場合は 3 倍遅くなります。 4) 定数が存在しない場合、defined() は 19 倍遅くなります。5) isset() は、何を投げても非常に効率的です (配列駆動イベント システムを実装している人にとっては朗報です - 私です!)

if(defined('DEBUG'))... を避けたい場合があります。

tris+php から tfconsulting dot com dot au 26-Mar-2009 06:40

http://us.php.net/manual/en/function.defined.php#89886

于 2012-04-11T01:16:09.747 に答える
1

定義は単純な静的な意味です。つまり、プロセスに沿ってその値を自由に操作できるため、変数は動的な意味ですが、実行時にその値を変更することはできません。

于 2011-07-26T06:22:27.730 に答える
0

When I run speed tests, constants being set and dumped out run much a little faster than setting variables and dumping them out.

于 2008-12-01T07:09:03.290 に答える
-1

主な違い:

  • 定義は定数、変数は変数
  • それらは異なる範囲/可視性
于 2008-09-29T10:25:16.397 に答える
-3

効率についてはわかりませんが、変数を作成するだけではありません。

  • これは定数です。この設定を再定義または再割り当てすることはできません。
  • 定義が見つからない場合、$ somethingは「SETTING」に設定されます。これは、たとえばi18nで役立ちます。翻訳が欠落している場合(つまり、対応する定義がローカリゼーションファイルである場合)、次のように大きな単語が表示されます。大文字、かなり見える...
于 2008-09-29T10:25:25.757 に答える