1

私が対処している特定の状況はありませんので、これは一般的な質問と考えてください。言語が重要な場合、回答は PHP に傾く可能性があります。

複数の関数で必要なデータの大きな配列 (または他のデータ型) がある場合、それは変わりません。そのデータをどのように使用すればよいですか? たとえば、次のような配列があるかもしれません

$states = array(
                "AL" => "Alabama",
                     ...
                "WY" => "Wyoming"
                );

明らかに、この配列をすぐに変更する必要はありません。上記の配列を使用する必要がある関数が 5 つある場合、最適な解決策は何ですか? 私の考えは次の3つです。

  • グローバル定数として宣言する

これは最も簡単なように思えますが、私が話をした一部の人々は、グローバル変数の使用を避けることを勧めているようです。ここでの洞察をいただければ幸いです。

  • 関数に渡す

これは決して変更されず、関数パラメーターは変数用であるべきなので、私には悪い考えのように思えますよね? それを使用しない関数に渡す必要があることは言うまでもありません。別の関数で使用できるようにするためです。それは悪い習慣のようです。

  • 関数で返してもらう

これはあまり使用されていませんが、mysqli_connect() 情報を複数の関数に渡すために自分自身を数回使用しました。それはかなりうまくいきました。これは悪い習慣とみなされますか?それを吸い上げてグローバル定数を使用する必要がありますか?

グローバル定数を使用するのは当然のことのように聞こえますが、「グローバルを宣言している場合は、間違ったことをしている」などのマントラを複数聞いた (そして読んだ) ことがあります。これがなぜなのか、誰か説明できますか?

皆さん、あなたが私に与えることができる洞察をありがとう。

4

4 に答える 4

5

私の一般的なアドバイスは、「サービスプロバイダー」クラスを構築することです。これは、「関数から返す」オプションに似ています。ここにいくつかの具体的な考えがあります:

  • グローバル定数として宣言する

まず、定数はスカラー値のみであるため、技術的に「定数」配列を持つことはできません。第二に、あなたの言うことはほとんど常に真実です。グローバルは、より良い方法があるというヒントです (いくつかの例外があります)。

  • 関数に渡す

それらが実際に一定である場合 (コンピューター サイエンスの意味ではなく、「現実世界」の意味で)、その通りです。関数への受け渡しは、コードが乱雑であると見なす必要があります (ただし、関数が "グローバル」値ですが、それはドメイン固有のアーキテクチャの選択です。

  • 関数で返してもらう

ディンディン!その理由は本質的に次のとおりです。誰でもこれらにアクセスして「読み取る」ことができますが、「関数」だけが「書き込む」ことができます。「関数」はクラスまたはシングルトン オブジェクトのインスタンスでもある可能性があるため、引用符で囲みます。基本的に、この静的情報の意味的に適切なプロバイダーを提供します。

このアプローチの利点の 1 つは、実行時間の長いプログラムではデータがほとんど必要ないことです。その場合、サービス プロバイダーは、メモリ不足の永続性から値をフェッチし、不要になったときにメモリを解放するように記述されている場合があります。他の誰もそのメモリ管理を担当する必要はありません。同じように、プロジェクトが拡大し、これらのデータを静的配列ではなくデータベースからロードする必要があると想像してください...アクセスを集中化した場合、これは非常に簡単に容易になり、ほとんどアクセスされない値を保持するプログラムの実行全体にわたって横たわる巨大なメモリヒープ。

于 2012-08-27T05:55:15.333 に答える
2

グローバルを使用しないことを主張する場合 (これは実際に悪い習慣です!)、関数内に「隠す」ことができます。

function get_state($state_code){
  static $states = array(
                "AL" => "Alabama",
                     ...
                "WY" => "Wyoming"
                );
  return $states[$state_code];
} 

しかし、この場合、Java で Enam を作成するのと同じように、グローバル配列を使用しても問題ないように思えます。

于 2012-08-27T05:48:04.467 に答える
1

明らかに相互に関連している関数をバンドルするためのラッピング クラスのように聞こえます。

class CountryHelper {

    protected static $states = array('AL' => ..., ...);

    public function foo() {
        self::$states ...
    }

    public function bar() {
        self::$states ...
    }

}
于 2012-08-27T05:52:50.030 に答える
1

作業している環境によって異なります-MVCでは、これをコントローラーの静的プロパティとして挿入し、次の方法でアクセスできるようにします。

 $this -> settings('states')[$state];

Settingsそれ以外の場合は、クラスの静的フィールドに固執します。

 class Settings
 {

      static $states = array( ... );

 }

または、スクリプトの起動時にシングルトンがいっぱいになっている場合でも、必要に応じて他の場所から設定を読み込むことができます [yaml / ini] - 私の意見では、シングルトンを使用することは良い習慣ではありません.

とにかくグローバルにしないでください。常に変数/関数の名前空間を適切に設定してください。

于 2012-08-27T05:57:20.737 に答える