3

の php.net マニュアル ページにはdefine()、関数内から便利に呼び出すことができることを示唆するユーザー投稿のメモdefine()があります。

軽く言い換えると、提案は次のような関数を作成することです。

<?php  
function xdefine($a) {
  foreach($a as $k => $v)
    define($k, $v); 
}  
?>

その後、次のように使用します。

<?php
xdefine(array(
    "SECOND" => 1,
    "MINUTE" => 60,
    "HOUR" => 3600,
    "DAY" => 86400,
    "WEEK" => 604800,
    "MONTH" => 2592000, // 30 days month
    "YEAR" => 31536000,
    "LEAPYEAR" => 31622400
));
?>

しかし、私の感覚と私の経験の両方で、これは機能しません。呼び出しの後、各識別子は、それにバインドされていると思われるxdefine()値ではなく、独自の名前に評価されます。xdefine()

理由はかなり明白に思えます (つまり、への呼び出しを含むモジュールxdefine()が解析/ロードされるときにシンボルが値を取得するため)、おそらく私が見逃している微妙な点があります。この投稿の著者は、かわいい Unicode 文字を使用して関数に別の名前を付けましたが、それは見た目の違いにすぎないと確信しています。

(ところで、ループと配列の両方がモジュールスコープにある場合、 のような関数を定義ずに、配列の内容に対してxdefine()同じforeach()ループを実行するだけで、同様のことが機能します。これも私の観点からすると、予想される動作です。)

それで、誰かが元の投稿を見て、本当に何かがあるかどうか教えてもらえますか? それとも作者が間違ってるだけ?

(これを参照先のphp.netページに投稿しますが、代わりにここに投稿すると、質問にもっと早く目を向けることができると思います:-)

4

1 に答える 1

7

サンプル機能は動作します。定数のスコープはグローバルです。ただし、これを行う理由は疑わしいものです。

于 2012-12-02T18:27:11.500 に答える