2011-12-07 4 views
1

カスタムスーパーグローバル変数を定義することは可能ですか? (コードであれ、php.iniであれ)カスタムスーパーグローバルPHP

例:私はすべてのプロジェクトでカスタムフレームワークを使用しています。フレームワークは基本的に、スクリプトの実行インスタンス(テンプレート読み込み、テンプレート変数など)に関するすべてのデータを1つの変数に格納します。私はその変数がシステム間でアクセスできるようにしたいと思います。

私は$_GLOBALSglobalを完全に認識していますが、カスタムスーパーグローバル変数を定義することが可能かどうか質問しています。 $ foo。スコープ内で同じ名前でアクセスできるようになります。

+1

: あなたはは、runkitと呼ばれる拡張機能をインストールする必要があります。その後 http://www.php.net/manual/en/runkit.installation.php

をここに記載されているように、あなたがphp.iniでカスタムスーパーグローバルを設定することができます。 – Polynomial

+1

短い答え。 * nope *。より良い答え。私が見てきた一般的なアプローチと同じように、あなた自身の要素を '$ _ENV'で作成することができます。 – Dan

+0

また、おそらくクラスの答え(*明らかに削除されて以来)*あなたが探しているものではありませんが、それは実現可能な解決策です。一種のレジストリパターンを使用することは、グローバルデータ管理のための最も堅牢なインタフェースを提供する可能性が高い。 – Dan

答えて

9

悲しいことに、スーパーグローバルを定義する方法はありません。

(ユーザ定義のスーパーグローバルのためのPHPにはメカニズムがありません。)

Source

+0

"(ユーザ定義の超球体のためのPHPにはメカニズムはありません)"(RCEのソースから)何とか見落としました。ありがとうございました。 – Gajus

2

これは不可能で、デザインも悪いです。 (スーパーグローバルと同様)。

グローバルな状態があなたの答えだと思うなら、静的なクラスを使うことができます。

2

私のようなこの問題の解決策を提供していないんだけど、私はあなたが避けることを示唆していますグローバルを使用します。一般に、グローバル変数の使用は、設計によってそれらを使用するプログラミング言語であっても、悪い習慣とみなされます。グローバル変数が同じ変数を宣言する他のアプリケーションにどのように影響するかはわかりません。個人的には、特に別のPHPスクリプトからデータを取得する方法や、新しい関数を定義し、必要なデータを返すPHP拡張機能を記述することで、より管理されたアプローチを好むでしょう。アプリケーション設定をデータベースに格納するのは珍しいことではなく、MySQLやフラットファイルのテキストであり、情報をアプリケーション間で共有するための私の好みの方法です。

0

スーパーグローバルとして使用することができます少しハック(トリック)、それは実装のようなsingletoneですが、私は@Mattエッシュに同意しています、スーパーグローバルを使用していない...

class K 
{ 
    public $CONST = array(); 

    private static $_instance = null; 

    private function __construct() 
    { 

    } 

    protected function __clone() 
    { 

    } 

    static public function I() 
    { 
     if(is_null(self::$_instance)) 
     { 
      self::$_instance = new self(); 
     } 

     return self::$_instance; 
    } 
} 

あなたがすることができますこれを、すべてのメソッド、クラス、関数(superglobal varなど)で使用します。

K::I()->CONST[0] = "somevar"; 
K::I()->CONST[1] = array(1, 2, 3, 4, 5); 
+0

'K :: I'ではなく' K :: I() 'でなくてはなりませんか? –

+0

ありがとうございました! (変更された) – kivlara

0

私のソリューション

本当に多くのスーパーグローバルを定義するためのサポートをいけないが、あなたはシェアは貴様のユーザーとセッション間varsの場合は、私の解決策は、共有情報を保存するためのユニークなセッションを作成することであるPHP。プロセスは、現在のセッションをクローズし、共有セッションを開いて書き込みおよび読み取りし、前のセッションに戻すことにあります。

コード:

<?php 
    ini_set('display_errors',1); 
    error_reporting(E_ALL); 

    function get_global($key){ 
     //Get current session 
     if(session_status()!=PHP_SESSION_ACTIVE)session_start(); 
     $current_id=session_id(); 
     session_write_close(); 
     //Set a global session with session_id=1 
     session_id(1); 
     session_start(); 
     //Get superglobal value 
     $value=null; 
     if(isset($_SESSION[$key]))$value=$_SESSION[$key]; 
     session_write_close(); 
     //Set the before session 
     session_id($current_id); 
     session_start(); 
     return $value; 
    } 

    function set_global($key,$value){ 
     //Get current session 
     if(session_status()!=PHP_SESSION_ACTIVE)session_start(); 
     $current_id=session_id(); 
     session_write_close(); 
     //Set a global session with session_id=1 
     session_id(1); 
     session_start(); 
     //Set superglobal value 
     $_SESSION[$key]=$value; 
     session_write_close(); 
     //Set the before session 
     session_id($current_id); 
     session_start(); 
    } 
    //Example 
    //Begin my session normally 
    session_start(); 
    if(empty($_SESSION['count'])){ 
     $_SESSION['count']=0; 
     $_SESSION['color']="rgb(".rand(0,255).",".rand(0,255).",".rand(0,255).")"; 
    } 
    $_SESSION['count']++; 
    $id=session_id(); 
    //Get the superglobal 
    $test=get_global("test"); 
    //Set the superglobal test with empty array if this dont set 
    if($test==null)$test=array(); 
    //Get the superglobal 
    $test=get_global("test"); 
    //Set values for each reload page and save the session_id that create it 
    $test[]="<span style='color:".$_SESSION['color']."'>Value: ".rand(0,100)." SessionID: $id</span><br>"; 
    //Save the superglobal 
    set_global("test",$test); 
    //Show the superglobal 
    foreach($test as $t){ 
     echo $t; 
    } 
    echo "<b>Reloads = ".$_SESSION['count'].", <span style='color:".$_SESSION['color']."'>This my color</span></b>"; 

    exit; 
?> 

テスト:

この例では、$テストでは、それを作成した乱数とsession_idの持つ配列が含まれているスーパーグローバルVARです。各セッションは、カラーテキストとカウントリロードのための2つのローカル変数を定義します。

Result my solution