3

関数にデータをハードコーディングすると、変数を正常に初期化できます。

function check_country() {
  $countries = array(
    'aa',
    'ab',
    'ae',
    ...
  );

}

PHPはメモリ内のリテラルデータを$countries 指すだけですか、それともすべての初期化データを新しいZVALなどにコピーしますか?

基本的にこれと同等の後者を行うとしたら、そうではありませんか?

function check_country() {
  $countries = array();
  $countries[] = 'aa';
  $countries[] = 'ab';
  $countries[] = 'ae';

}

別の方法は、変数を静的にして、次のように初期化することです。

function check_country() {
  static $countries;

  if (!isset($countries))
  {
    $countries = array(
      'aa',
      'ab',
      'ae',
      ...
    );
  }

}

この手法はa)より高速で、b)2倍のメモリを必要としますか?

4

2 に答える 2

5
  • 変数を静的にするには、staticキーワードを前に付けるだけです。必要な追加のチェックはありませんif (!isset($countries))

  • 「動的」実装は、関数が呼び出されるたびに別の新しいローカル変数が作成されるため、もう少しCPUを消費します。

  • 「静的」実装は、静的変数がヒープに割り当てられ(グローバル変数のように)、スクリプトの実行が完了するまでそこに存在するため、少し多くのメモリを消費します。

結論:(数メガバイトのサイズの配列を作成しない限り)それらの間に合理的な違いはありません。したがって、より適切なもの(おそらく最初のもの)を選択してください。

于 2012-12-20T02:03:36.710 に答える
0

zerkmsが答えたものの次に、staticバリアントの場合、変数を初期化して、if:を節約することができます。

function check_country() {
  static $countries = array(
      'aa',
      'ab',
      'ae',
      ...
    );
  }    
}

初期データが静的な性質(一定)である限り(あなたの場合のように)。

于 2012-12-20T02:14:11.387 に答える