0

私はそのような機能を持っています:

function get_title($keyword) {

    $titles = array(
        'p1'   => 'Title 1',
        'p2'   => 'Title 2',
        // ... other data
        'pm'   => 'Some other title',
        'pn'   => 'One more title'
    );

    return $titles[$keyword];
}

そのような配列をローカル変数に保持するのは良い習慣ですか?たとえば、約50のタイトルがあります。したがって、この関数を呼び出すたびに、スクリプトは50タイトルをロードしますか?

使用することを考えてglobalいますが、グローバルは悪い習慣ではありませんか?

私はPHPの初心者で、早い段階でJSで作成しました。JSでは、クロージャを使用してこれを行うことができます。

var get_title = function() {

    var titles = {
        'p1': 'Title 1',
        'p2': 'Title 2',
        // ... other data
        'pm': 'Some other title',
        'pn': 'One more title'
    }

    return function(keyword) {
        return titles[keyword];
    }
}();

ここで、title-arrayはグローバルではなく、関数を呼び出すたびに読み込まれるわけではありません。しかし、PHPでこれを行う方法は?

4

6 に答える 6

2

また:

$titles = array(
    'p1'   => 'Title 1',
    'p2'   => 'Title 2',
     // ... other data
    'pm'   => 'Some other title',
    'pn'   => 'One more title'
);

function get_title($keyword) {
    global $titles;
    return $titles[$keyword];
}
get_title('p1');

また

class Something {
    private static $titles = array(
        'p1'   => 'Title 1',
        'p2'   => 'Title 2',
         // ... other data
        'pm'   => 'Some other title',
        'pn'   => 'One more title'
    );

    public static function get_title($keyword) {
        return self::$titles[$keyword];
    }
}
Something::get_title('p1');

ここで静的クラスを使用することは、Javascriptのクロージャに少し似ています。

メモリに問題がない限り、心配する必要はありません。

于 2011-04-24T22:37:18.420 に答える
2

ここではグローバルが適切であるように聞こえます。

「そんなものはいつも『悪』だ」と言う人には注意を払わないようにしましょう。あなたが今知っているように、そのような一般化は危険です。

于 2011-04-24T22:41:52.097 に答える
1

$titlesデータベースから来ていますか?そうでない場合、これは本当にマイクロ最適化であり、その変数をインスタンス化することは、最適化する価値のあるボトルネックになることはほとんどないと言えます。

ただし、本当に必要な場合は、2つの簡単な解決策があります。1つ目は、実際にグローバル変数を保持することです。これに関する1つの問題は、誰でもグローバル配列を変更できることです。それを除けば、これはまったく悪いことではありません。

$titles別の解決策は、プライベートの静的メンバーとして静的クラスを作成することです。次に、この配列を呼び出すパブリックメソッドを作成するだけです。

これらのソリューションは、アレイを1回だけインスタンス化します。

編集:ああ、フリッツは私が言っていることを正確に示しています。

于 2011-04-24T22:39:29.947 に答える
1

$title他の関数内からデータにアクセスする必要がある場合を除いて、このための関数を作成する理由はわかりません。その場合$titleは、パラメーターとして他の関数に渡す方がよいでしょう。

于 2011-04-24T22:45:33.143 に答える
1

あなたはstatic変数であなたが望むことを非常に簡単に行うことができます:

function get_title($keyword) {

    static $titles = null;

    if($titles === null) {
        $titles = array(
            'p1'   => 'Title 1',
            'p2'   => 'Title 2',
            // ... other data
            'pm'   => 'Some other title',
            'pn'   => 'One more title'
        );
    }

    return $titles[$keyword];
}

null(の値を直接設定する代わりに)「/ check / setvalueに初期化する」トリック$titlesを使用すると、変数を初期化するために任意のコードを使用できます(非定数式を含む)。

global制作方法の詳細を隠すのに優れているので、私は確かにこれを好むでしょう$titles。クラス静的プロパティは、まさにこれを行う別の方法です。2つのうちどちらを選ぶかは私見のスタイルの問題です。

于 2011-04-24T22:47:03.170 に答える
1

phpでは、関数変数はローカルであり、javascriptのように外の世界には見えません。php変数をjavascript変数のように動作させたい場合は、次のように変数の前にグローバルを追加する必要があります->グローバル$ var; 関数を実行するたびに$titlesを設定したくないので、このように静的として宣言できます。

function get_title($keyword) {

static $titles = array(
    'p1'   => 'Title 1',
    'p2'   => 'Title 2',
    // ... other data
    'pm'   => 'Some other title',
    'pn'   => 'One more title'
);

return $titles[$keyword];

}

于 2011-04-24T22:49:55.083 に答える