グローバルを使用するのが理にかなっている小さな PHP スクリプトがあります。グローバルの 1 つは、アンパックされるがいくつかの異なる関数によって変更されない値を含むだけの配列です。スクリプトが拡張された場合、グローバル配列を持つという考えは少し不安になります。グローバル配列を定数の変更不可能な値に変換する方法はありますか? もしそうなら、私はまだそのimplode()
機能を使用することができますか?
4 に答える
PHP 定数は高度なデータ構造をサポートしていないため、配列を定数の値として格納することはできません。あなたが言ったように、文字列を爆発させない限り。
すべての PHP スコープから使用できるいくつかのグローバル変数 (スーパーグローバルと呼ばれます) があります。
- $_GET
- $_POST
- $_REQUEST
- $_SERVER
- $グローバル
$GLOBALS
を使用して、配列をその配列内に配置することを強くお勧めします。任意の関数、クラス、またはインクルード ファイルですぐに使用できます。
<?php
$GLOBALS['my_arr'] = array('key1' => 'val1', 'key2' => 'val2');
function my_func() {
return $GLOBALS['my_arr']['key1'];
}
print my_func(); // prints: val1
定数の値をシリアライズしたり、そこから値を取得したいときはいつでも分解できますが、変換操作には時間がかかることに注意してください。配列のシリアル化、文字列のシリアル化解除、または文字列の分解は、単純に に値を追加できる場合、すべて非常に不要な操作です$GLOBALS
。スクリプトで 3 つの異なるスコープから 1 つの値を参照する必要がある場合は、シリアル化を解除するか、3 回別々に展開する必要があります。これはより多くのメモリを消費し、最も重要なことに処理時間も消費します。
配列をシリアル化し、スクリプトで定数を定義できます。
define("GLOBAL_DATA", "xxxxxxxx"); -- use the serialized array
どの関数でも、定数のシリアル化を解除して元の配列を取得できるようになり、変更されていないことがわかります。
PHP の json_encode() 関数を使用して JSON に変換し、json_decode() を使用して文字列に変換します。
例:
<?php
define('CONSTANT',json_encode(array('test')));
//Use the constant:
if(in_array('CONSTANT',json_decode(constant('CONSTANT')))) {
return true;
} else {
return false;
}
?>
「いいえ、できません」と断言するのは怖いですが、確かにそうです。できることは、常に同じ値の配列を返す静的関数をどこかに作成することです。それはあなたの問題を解決しますか?