2010-12-07 6 views
2

存在しない値を参照渡しすると、PHPは値を作成してNULLに設定します。いくつかの関数で空の値をチェックしている間にメモリの増加が起きたときに気付いた。次の関数を取る:PHPはそれらを作成し、存在しない変数を渡すとき、しかし存在しない値への参照を使用すると、変数がNULLに設定されますか?

if(isset($foo)) 
{ 
    $bar = $foo; 
} 
else 
{ 
    $bar = $default; 
} 

function v(&$v,$d=NULL){return isset($v)?$v:$d;} 
$bar = v($foo, $default); 

これは、の省略表現されるだろう。変数の場合、メソッド/関数が終了するとすぐに削除されますが、$ _GETや$ _POSTのようなスーパーグローバル配列を調べる場合、配列要素は決して削除されず、余分なメモリを使用します。

$request_with = v($_SERVER['HTTP_X_REQUESTED_WITH']); 

なぜこれが起こると、それはPHPのTODO修正または値の他のいくつかのクレイジーな使用のための機能であれば誰でも説明できますか?

+0

あなたのサーバ環境は何ですか – RobertPitt

+0

Debian、Ubuntu、およびWindows XPのPHP 5.3.xはPHPFastcgiを実行しています。 – Xeoncross

答えて

2

メモリリークが発生した理由は、あなたがそれを伝えているからです。

参照パラメータを尋ねると、PHPから参照パラメータが要求されます。変数を設定していない関数を呼び出すと、PHPは変数を設定し、その新しい変数に参照を渡します。スーパーグローバルで呼び出すと、不足しているインデックスが作成されます。それはあなたがそれに言ったからです。

しかし、なぜ具体的に変数参照が必要なのか質問する必要がありますか?あなたが本当に必要としない時間の99.9%。私はそれを行うにはうまく動作するだろうと思われる:

function v($v, $d = null) { return isset($v) ? $v : $d; } 

それとも、あなたが本当に(あなたとあなたの元の問題を回避することはできません)参照を使用する必要がある場合、あなたはまた、参照を返す必要があります。

function &v(&$v, $d = null) { 
    if (isset($v)) { 
     return $v; 
    } 
    return $d; 
} 

それ以外の場合は、参照を取り、1を返さないために無意味だ...

+0

確かに無意味です。私の唯一の推測は、彼は価値あるものを通さずに資源を節約していると彼が考えているということです。残念ながら、彼はCOW(コピーオンライト)を知らない。 – webbiedave

+0

私はCOWを意識しています。メモリを節約するのは機能のポイントではありません。存在しない値を扱うのは、です。しかし、 'function&v(){...}'は無効ですPHP: '注意:変数参照のみが参照によって返されるべきです。'これはそれが書かれている理由です。言い換えれば、参照が、PHPにエラーを引き起こさずに未設定の値を処理する唯一の方法です。 – Xeoncross

2

XeonCross'関数vは、多くの場合、使用の省略形です:

$val= isset($arr['elm']) ? $arr['elm'] : 'default' 

を使用して、「未定義インデックス:elm」通知を回避してください。素敵なヘルパー関数は次のようになります。

function ifset(&$v1, $v2 = null) { 
    return isset($v1) ? $v1 : $v2; 
} 

Xeoncrossが示唆したように、あなたは非常に良く

$val = ifset($arr['elm'],'default') 

を書くことができるようにしかし、これは私たちの最愛の「言語」で興味深い癖をたくさん持っています(?)私たちはPHPと呼んでいます:

ifset、$ v1はUNSETと思われるので、正しく$ v2という値を返します。しかしその後、$ arr ['elm']は静かにNULLに設定されます。だから、次の点を考慮してください

function wtf(&$v) { 
     if (isset($v)) 
      echo "It is set"; 
     else 
      echo "It is NOT set"; 
    } 
    $p=[]; 
    wtf($p['notexist']); => It is NOT set 
    $p;     => [ 'notexist' => NULL ] 

しかし、これは別の妄想で、ISSETとして()関数は、同様にNULL値に対してfalseを返します。

$x=NULL; 
isset($x) => false... huh?? 

は、我々はこれを期待していましたか?まあ、それはドキュメントにあるので、これも同様に設計されています。PHPの素晴らしい世界へようこそ。

+0

私はこのようなメソッドも作成しました。そして、私は半分の時間を失って、私の配列に駄目なデータが何を作り出しているのか理解していました。 :/ – morgoth84

関連する問題