1

PHP5でWebアプリを作成しています。これまでのところ、$inputと$sqlの2つの「グローバル」変数があります。$ inputは、$ _ GET、$ _ POST、および$_COOKIEからの検証およびサニタイズされた入力です。$ sqlは私のmysql(i)クラスのインスタンスです。

これら2つは、他のほとんどすべてのクラスで必要です。これは、各クラスの__construct関数にパラメーターとして渡すことで比較的簡単に実現できます。しかし、それは...不器用なようです。より多くのクラス固有のパラメーターと潜在的な将来のグローバル変数に加えて、扱いにくい関数呼び出しになります。

簡単で、私が理解しているように、noobieの代替手段はglobalキーワードを使用することです。やりたくない。私のシナリオ(小さなアプリ)ではそれほど重要ではありませんが、グローバルの欠点があります。ただし、再度使用する前に明示的にグローバルにラベルを付けるのも不器用です。

私が思うよりエレガントな方法:私は他のすべてのクラスを拡張するwebappクラスを持っています。このwebappクラスは、他の複数のクラスで必要な共通の関数を保持していますが、個別のクラスを保証するものではありません。$inputと$sqlを静的変数としてこのwebappマスタークラスに格納すると、すべてのサブクラスでアクセスできるようになります。しかし、私は、静的変数がグローバル変数と同じくらい眉をひそめていることを理解しています。

本当?私はすべてを考えすぎている人の一人だと思いますが、私はエレガントなコードが好きで、これは私の(アマチュア)の目にはエレガントに見えます。

4

3 に答える 3

2

これまでのところ、2つの「グローバル」変数があります

うん!グローバルは悪いです。:-)

$ inputは、$ _ GET、$ _ POST、および$_COOKIEからの検証およびサニタイズされた入力です。

なぜそれをグローバルにするのですか。あなたが本当にそれを使うつもりであるとき、単に消毒/正規化/何でも。

$ sqlは私のmysql(i)クラスのインスタンスです。

繰り返しますが、それをグローバルにする必要はありません。依存性注入を使用します。

簡単で、私が理解しているように、noobieの代替手段はglobalキーワードを使用することです。やりたくない。

あなたは正しいです:あなたはそれをしたくありません。

私が思うよりエレガントな方法:私は他のすべてのクラスを拡張するwebappクラスを持っています。

それも本当に正しく聞こえません。クラスには特定の機能(/責任)があります。

しかし、私は静的変数が同じくらい眉をひそめていることを理解しています

静的なものは、異なる名前の単なるグローバルです。

生活を楽にしたい場合は、依存性注入コンテナを実装できます。

于 2012-05-12T14:10:12.417 に答える
-1

http://php.net/manual/en/language.oop5.patterns.php

このリンクでは、クラスの単一のグローバル インスタンスを提供する oo-way であるシングルトン パターンについて説明します。サブクラス化のためにサブクラス化し、パラメータとして渡す必要がないことを考えると、これは十分にエレガントであると確信しています。これは私がすることです:)

于 2012-05-12T14:12:11.743 に答える
-1

個人的には、この例ではシングルトンを使用します。シングルトンは眉をひそめられる可能性がありますが、適切な状況で使用されればまったく問題ありません。

「WebApp」クラスをシングルトンとして作成します。これは、これらの変数が必要な場合はいつでも「WebApp」に簡単にアクセスできることを意味します。

これまでにシングルトーンを使用したことがない場合は、次の例をご覧ください。

class WebApp
{
    private static $instance = null;
    private $post_data = array();

    private function WebApp(){}

    public static function instance(){
        if(!isset(WebApp::$instance))
            WebApp::$instance = new WebApp();
        return WebApp::$instance;
    }
}

print_r(WebApp::instance()->post_data);
于 2012-05-12T14:14:51.430 に答える