web-dev-qa-db-ja.com

クラス内のすべての関数がグローバル変数にアクセスできるようにする

グローバルスコープに${SYSTEM}という変数があります。ここで、SYSTEMは定義済みの定数です。この変数にアクセスする必要がある関数を持つクラスがたくさんあり、毎回global ${SYSTEM};を宣言するのは面倒です。

クラス変数public ${SYSTEM} = $GLOBALS[SYSTEM];を宣言しようとしましたが、この方法でクラス変数を宣言して正常に動作しているように見える別のクラスがあるため、これは奇妙な構文エラーになります。私が考えることができる唯一のことは、定数が認識されていないということです。

私はなんとかこれをコンストラクターで引き出すことができましたが、それに頼る前にもっと簡単な解決策を探しています。


[〜#〜] edit [〜#〜]グローバル$ {SYSTEM}変数は、他の多くの子配列を含む配列です。残念ながら、コンストラクタを使用して回避する方法はないようです...

13
atomicharri

これは私がグローバルなしでグローバルに物事にアクセスする方法です。

class exampleGetInstance 
{

private static $instance;

public $value1;
public $value2;


private function initialize() 
{
    $this->value1 = 'test value';
    $this->value2 = 'test value2';

}

public function getInstance()
{
    if (!isset(self::$instance))
    {
        $class = __CLASS__;
        self::$instance = new $class();
        self::$instance->initialize();
    }
    return self::$instance;
}

}

$myInstance = exampleGetInstance::getInstance();

echo $myInstance->value1;

$myInstanceexampleGetInstanceクラスのインスタンスへの参照になりました。

固定フォーマット

8
Syntax

わかりました、うまくいけば、私はあなたが達成しようとしていることの要点を持っています

<?php
    // the global array you want to access
    $GLOBALS['uname'] = array('kernel-name' => 'Linux', 'kernel-release' => '2.6.27-11-generic', 'machine' => 'i686');

    // the defined constant used to reference the global var
    define(_SYSTEM_, 'uname');

    class Foo {

        // a method where you'd liked to access the global var  
        public function bar() {
            print_r($this->{_SYSTEM_});
        }

        // the magic happens here using php5 overloading
        public function __get($d) {
            return $GLOBALS[$d];  
        }

    }

    $foo = new Foo;
    $foo->bar();

?>
8
frglps

次のようなコンストラクタを使用できます。

class Myclass {
  public $classvar; 
  function Myclass() {
    $this->classvar = $GLOBALS[SYSTEM];
  }
}

編集:タイプミスを指摘してくれてありがとう、ピーター!

これは配列でも機能します。割り当てが不要な場合は、参照の取得も機能します。

$this->classvar =& $GLOBALS[SYSTEM];

EDIT2:このメソッドをテストするために次のコードが使用され、私のシステムで機能しました。

<?php
define('MYCONST', 'varname');
$varname = array("This is varname", "and array?");

class Myclass {
  public $classvar;
  function Myclass() {
    $this->classvar =& $GLOBALS[MYCONST];
  }
  function printvar() {
    echo $this->classvar[0]; 
    echo $this->classvar[1];
  }
};

$myobj = new Myclass;
$myobj->printvar();
?>
2
PolyThinker

あなたはここで本当に異常なことをしようとしているので、厄介であると期待できます。特にSYSTEM定数を使用した動的な名前選択では、グローバルの操作は決して楽しいものではありません。個人的には、代わりにどこでも$GLOBALS[SYSTEM]を使用することをお勧めします。または...

$sys = $GLOBALS[SYSTEM];

...あなたがそれをたくさん使うつもりなら。

1
too much php

メンバー変数の直接指定には、他の変数への参照を含めることはできません(class {public $membervar = $outsidevar;}も無効です)。代わりにコンストラクタを使用してください。

しかし、定数を扱っているので、phpの constant または class constant 機能を使用してみませんか?

1
phihag