2

globalキーワードを使用せずに、PHPでグローバル変数をJava stlye方式で使用する別の方法はありませんか?

以下の例は、非常に一般的で単純なものです。キーワードでやろうと思いdefineますが、ご覧のように、バリバレは互いに依存しているので、では達成できないと思いますdefine

もちろん、以下の例ではエラーが発生しています。

このための解決策を本当に楽しみにしています。globalグローバル変数を使用したい関数の定義を書かなければならないことは、より良い解決策であるはずの非常に効果のない解決策のように思えます。

$BASE_URL = "mysite.com";
$PRODUCTS_URL = $BASE_URL . "/products";
$ABOUT_URL = $BASE_URL . "/about";

function foo() {
    echo $BASE_URL;
}
4

3 に答える 3

1

$GLOBALSスーパーグローバルは次のように使用できます...

function foo() {
    echo $GLOBALS['BASE_URL'];
}

ただし、以下のKolinkのコメントを参照してください。PHP 5.4.0以降、$ GLOBALSスーパーグローバルは最初の使用時にのみ初期化されるため、$ GLOBALSを使用せず、 globalキーワードを使用することでパフォーマンスがわずかに向上します。

あなたがしているようなことのために、あなたは単に単一のグローバル配列を定義することができます、例えば

 $CONF['BASE_URL']='foo';

次に、それglobal $CONFを必要とする関数で使用する必要があります。さらに良いのは、それをある種の構成クラスにラップすることです。

于 2012-06-23T19:09:35.803 に答える
1

私はdefineキーワードでそれを行いますが、ご覧のとおり、変数は相互に依存しており、defineではそれを達成できないと思います。

完全に真実ではありませんが、これは問題なく機能します-そしてそれはおそらく私がこれにアプローチする方法です:

define('BASE_URL', "mysite.com");
define('PRODUCTS_URL', BASE_URL . "/products");
define('ABOUT_URL', BASE_URL . "/about");

定数の名前空間を使い果たすことに注意してください。代わりに、次のような関数を作成することをお勧めします(例として、微調整を使用できます)。

function get_url($item = NULL, $include_base = TRUE)
{
    $urls = array(
        'base'  =>  'mysite.com',
        'products'  =>  '/products',
        'about' =>  '/about',
    );
    $output = $include_base ? $urls['base'] : '';
    if (isset($urls[$item])) $output .= $urls[$item];
    return $output;
}

次に、のように呼び出しますecho get_url('products');foo()が呼び出されたときにこれが定義されている限り、機能します。global私は常にまたはを避けるように努めます$GLOBALS

于 2012-06-23T19:17:46.000 に答える
0

使用することもできます$_SESSIONが、非常に洗練されたソリューションではありません。なぜあなたがタイプするのがとても難しいのですglobalか?大急ぎではありません。

define()同様に良いです。

于 2012-06-23T19:14:52.197 に答える