web-dev-qa-db-ja.com

PHPのグローバル変数と関数パラメーターの長所/短所は?

申し訳ありませんが、私は初心者ですが、これがどれほど良い質問であるかを判断することはできません。

私たちの使用以下の2つが同じである場合、どちらが良いですか?

function doSomething ($var1,$var2,..){
    ...
}

OR

function doSomething (){
    global $var1,$var2,..;
    ...
}

私たちの使用とは、2番目のシナリオでグローバル変数の値も変更できることを知っていることを意味します。しかし、それを行う必要がない場合はどうなりますか?これは、この関数を作成するためのより良い方法です。変数を渡すと、関数でグローバルをアナウンスするよりもメモリが少なくて済みますか?

18
Mohammad

メモリ使用量はわずかな懸念です。コードがわかりやすく、...予測できない...結果が出ないことがはるかに重要です。グローバル変数の追加は非常に悪いですIDEAこの観点から、IMO。

メモリ使用量が心配な場合は、やるべきことは

function doSomething (&$var1, &$var2,..) {
   ...
}

これにより、変数は参照によって渡され、メモリ内にそれらの新しいコピーは作成されません。関数の実行中にそれらを変更すると、実行が呼び出し元に戻ったときにそれらの変更が反映されます。

ただし、これでもメモリ上の理由で必要になることは非常にまれであることに注意してください。参照によって使用する通常の理由は、上記の理由(呼び出し元のためにそれらを変更する)です。行く方法はほとんどの場合簡単です

function doSomething ($var1, $var2) {
    ...
}
22
Arkaaito

グローバル変数の使用を避け、代わりにパラメーターアプローチで変数を渡すことを使用してください。プログラムのサイズによっては、パフォーマンスが無視できる場合があります。

ただし、パフォーマンスに関心がある場合は、ローカル変数(変数)に関して グローバル変数のパフォーマンス について注意すべき重要な点がいくつかあります。関数内で定義されます。)

  • グローバル変数のインクリメントは、ローカル変数の2倍の速度です。
  • 関数で使用せずにグローバル変数を宣言するだけでも、処理速度が低下します(ローカル変数をインクリメントするのとほぼ同じ量)。 PHPは、おそらくグローバルが存在するかどうかを確認します。

また、グローバル変数は、コード内の他の場所で変更された場合、間違った値を使用するリスクを高めます。

14

パラメータを取るためにそれを書いてください。保守性は、マイクロ最適化よりもはるかに重要です。パラメータを取得する場合、予期しない場所で変数を変更することはできません。

6

グローバルが決して書き込まれないことを保証する限り、それは良い習慣ではありませんが、読み取るだけで、パラメーターの柔軟性が得られます。

別の方法として、1つのパラメーター(expなどの関数に実際に対応する場合は2つ)と残りをオプションの配列(jqueryと少し似ています)で渡すことができます。このように、グローバルを使用せず、パラメータにある程度の柔軟性があり、各パラメータのデフォルトを明確に定義しています。

function get_things($thing_name,$opt= array() {
   if(!isset($opt["order"])) $opt["order"]= 'ASC';
}
2
gssgss

PHP 4の時点で、大きな変数でグローバルを使用すると、パフォーマンスに大きく影響します。

$ dataにバイナリマップデータを含む3Mb文字列を含め、さまざまなグローバル使用法でビットが0または1の場合に10kテストを実行すると、次の時間結果が得られます。

function getBit($pos) {
global $data;
$posByte = floor($pos/8); 
...
}

t5ビットオープン:0.05495秒、シーク:5.04544秒、すべて:5.10039秒

function getBit($data) {
 global $_bin_point;
 $pos = $_bin_point; 
 $posByte = floor($pos/8); 
}

t5ビットオープン:0.03947秒、シーク:0.12345秒、すべて:0.16292秒

function getBit($data, $pos) {
$posByte = floor($pos/8); 
...
}

t5ビットオープン:0.05179秒、シーク:0.08856秒、すべて:0.14035秒

したがって、パラメーターの受け渡しは、3Mb以上の変数でグローバルを使用するよりもはるかに高速です。 $&data参照を渡すことでテストしておらず、PHP5でテストしていません。

1
Ilya Sheershoff

パラメータを渡し、グローバルを避けます。特定の状況に必要なスコープのみを維持することは、優れたコード設計の尺度です。 PHP変数スコープ...

http://php.net/manual/en/language.variables.scope.php

ベストプラクティスとメモリ管理についてのいくつかの指針を備えた優れたリソース。

1
Urda