3

たとえば、50 のアメリカ合衆国。現在、50 の状態を 1 つの関数でのみ使用しています。

関数 getStateInput() {
    $states = array('AL' => 'アラバマ', 'AK' => 'アラスカ',
        'AZ' => 'アリゾナ' など);

    // $states を使用
}

$statesまたは、独自の states.php で定義して、次のように使用することもできます。

関数 getStateInput() {
    include('states.php');

    // $states を使用
}

しかし、ローカル関数変数を定義するためにインクルードを使用しているため、何らかの理由で私を怖がらせます。別の方法は、states.php で states 配列をスーパーグローバルに割り当てることです (たとえば、 を使用できます$_ENV['states'])。それから私は行くことができました:

include('states.php');

関数 getStateInput() {
    // $_ENV['states'] を使用
}

それらの1つが最善ですか、それとも別のより良い方法がありますか?

4

4 に答える 4

4

一般的な方法は、懸念事項を分離することです。たとえば、できます。アドレス関連のメソッドを持つ独自のクラスを用意します。このクラスは、次のような可能な状態に関する情報を保存する自然な場所です。

class Address {
    static STATES = array(
        'AL' => 'Alabama',
        'AK' => 'Alaska',
        'AZ' => 'Arizona',
        // ...
    );
}

// and then you can use it somewhere like that:
echo Address::$STATES['AL'];
于 2012-08-05T22:59:20.083 に答える
1

インクルード ファイルに状態配列を返す関数を含めないのはなぜですか。次に、その配列を他のコードで使用します。そうすれば、スコープ変数を処理しません。

// states.php
function getStates() {
    return $states;
}

// other.php
function getStateInput() {
     include('states.php');   
     $states = getStates();
     // Do stuff with $states
}
于 2012-08-05T22:56:26.477 に答える
0

include.phpファイル内 (このファイルを含める必要があります。関数宣言の前に含めます):

$states = array('GA' => 'Georgia', 'SC' => 'South Carolina');

あなたのスクリプトで:

include("include.php");
global $states;

function GetStateInput() {
   ///States are already available as $states
}

幸運を!

于 2012-08-05T22:57:48.293 に答える
0

多分こんな感じにします

include.php

<?php
$array = array();

$array['foo'] = 'bar';
$array['oof'] = 'rab';
... etc.

return $array;
?>

フレームワーク.php

<?php
// previous stuff

function getStateInput()
{
    static $a = NULL;
    if($a === NULL)
        $a = include('include.php');
    // do whatever
    return $a;
}

// other stuff
?>

それか、関数で配列を定義するだけです。配列の大きさと残りの API の大きさによって異なります。配列を外部ファイルに移動すると、メンテナンスがはるかに簡単になる場合は、そうしてください。複数の異なる関数またはメソッドで配列を使用する場合は、それを引き出します。など。あなたはドリルを知っています。

PHP はファイルのインクルードを最適化するので、動的にインクルードしなくても、パフォーマンスについてあまり心配する必要はありません。

于 2012-08-05T23:25:59.160 に答える