2011-05-13 25 views
1

ここに私のシナリオです:ネストされた関数内でグローバル変数にアクセスする

$foo = bar; 

one() 
{ 
    two() 
    { 
     three() 
     { 
     // need access to $foo here 
     } 
    } 
} 

私は私がダウンして3つの機能すべて$ FOOを渡すことができます知っているが、あなたがまたはそれを必要としない場合がありますので、それは、本当に理想的ではありません、他にも既に他のパラメータがあります。私がそれを防ぐことができれば、そのリストに追加したくありません。あなたがthree()になるときだけ、$fooが必要です。私はglobal $foo;three()に指定することもできると知っていますが、これは良い習慣ではないことを読んでいます。

$foothree()のいずれにも適用できません。

もう少し情報を提供するために、この場合の$ fooはデータベースへの接続方法に関する情報です。サーバー、ユーザー、パス、それは実際にはthree()の情報が必要ですか?もちろん、ドキュメントが読み込まれるとデータベースに接続することもできますが、ドキュメントで必要としない場合は不要です。

アイデア?

UPDATE:私は申し訳ありませんが、各機能の冒頭に「機能」があることを意味しているわけではありません。

+0

本当に実際にネストされた機能を使用していますか? – alexn

+0

一般的な規則として、関数定義を入れ子にしないでください...コードとコーダーの両方の巧妙化の無意味な試練 –

答えて

1

globalを使用して内部のトップ$fooの値を変更する必要がある場合もuse(&$foo)をすることができます正しく。この場合、globalを使用しても問題ありません。

globalは、関数がグローバル変数にアクセスできるようにするため、データ破損のリスクがあります。 慎重に使用することを忘れないでください。あなたは何をしているのかを知っています(つまり、変更したくないデータを誤って変更しないようにしてください)。

この場合のglobalは完全に問題ありません。

本当に悪いのは、少なくともPHPではネストされた関数です。

+1

"少なくともPHPではネストされた関数は本当に悪いです。" - なぜそうなのか? – NightHawk

+0

'global'は絶対に常に悪い習慣です。 –

+1

@OZ_大きな力で大きな責任がもたらされます。あなたが安全な 'グローバルな'使用法を練習する限り、あなたは大丈夫でしょう。 – Pwnna

2

はい、globalを使用するか、パラメータとして渡すことができます。両方とも公正な方法です。しかし、私は後者をします。それとも、あなたはまた、closuresuseキーワードを使用することができます。

$foo = 'bar'; 

$one = function() use($foo) { 
    $two = function() use($foo) { 
     $three = function() use($foo) { 
     // access to $foo here 
     }; 
    }; 
}; 

使用した場合悪い習慣ではありませんあなたは$three()

0

globalについて話している人は誰も聞かないでください。
OOPに関する書籍(例:this one)を読むと、依存性注入、工場パターンについて読むことができます。
依存性注入は、柔軟で保守が容易なコードを作成する最も良い方法です.DI哲学では、引数の最初から3番目の関数から$ fooを渡すか、必要なすべての変数を含むContextオブジェクトを渡します(引数の数を最小にする)。
DIの詳細については、こちらをご覧ください:http://components.symfony-project.org/dependency-injection/trunk/book/00-Introduction

+0

あなたは本当になぜこのような状況で「グローバル」が悪い習慣であるのか説明していません。 PHPは技術的にはOOPですが、複雑なOOP構造ではほとんど使用されません。 – melkamo

+0

@melkamo 'global'はどんな状況でも悪です。このコードは再利用することはできず、コード内で移動することはできず、リファクタリングでは非常に難しく、テストすることはできません。 –

+0

これは、関数の目的によってまったく異なります。すべての機能が、移動したいスタンドアロンエンティティであるとは限りません。彼らはすべてそうでなければならない。 – melkamo

関連する問題