13

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

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

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


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

4

7 に答える 7

8

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

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これで、クラスのインスタンスへの参照になります。

フォーマットを修正

于 2009-02-06T13:13:21.783 に答える
8

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

<?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();

?>
于 2009-02-06T07:12:27.053 に答える
2

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

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();
?>
于 2009-02-06T04:49:42.300 に答える
1

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

しかし、定数を扱っている以上、php の定数機能やクラス定数機能を利用してみませんか?

于 2009-02-06T04:22:50.000 に答える
1

あなたはここで本当に普通でないことをしようとしているので、ぎこちないことが予想できます. SYSTEM特に定数を使用した動的な名前の選択では、グローバルを扱うのは決して楽しいものではありません。個人的には$GLOBALS[SYSTEM]、代わりにどこでも使用することをお勧めします。または...

$sys = $GLOBALS[SYSTEM];

...たくさん使うなら。

于 2009-02-06T05:09:37.220 に答える
-1

また、シングルトン パターンを試すこともできますが、OOP サークルではある程度嫌われていますが、一般にクラスのグローバル変数と呼ばれています。

<?php
class Singleton {

  // object instance
  private static $instance;

  // The protected construct prevents instantiating the class externally.  The construct can be
  // empty, or it can contain additional instructions...
  protected function __construct() {
    ...
  }

  // The clone and wakeup methods prevents external instantiation of copies of the Singleton class,
  // thus eliminating the possibility of duplicate objects.  The methods can be empty, or
  // can contain additional code (most probably generating error messages in response
  // to attempts to call).
  public function __clone() {
    trigger_error('Clone is not allowed.', E_USER_ERROR);
  }

  public function __wakeup() {
    trigger_error('Deserializing is not allowed.', E_USER_ERROR);
  }

  //This method must be static, and must return an instance of the object if the object
  //does not already exist.
  public static function getInstance() {
    if (!self::$instance instanceof self) { 
      self::$instance = new self;
    }
    return self::$instance;
  }

  //One or more public methods that grant access to the Singleton object, and its private
  //methods and properties via accessor methods.
  public function GetSystemVar() {
    ...
  }
}

//usage
Singleton::getInstance()->GetSystemVar();

?>

この例はウィキペディアからわずかに変更されていますが、アイデアを得ることができます。詳細については、シングルトン パターンをグーグルで検索してみてください

于 2009-02-06T04:32:46.577 に答える
-2

私が最初に際立っているのは次の2つです。

  1. 変数名を括弧で囲む必要はありません。単に public $system または public $SYSTEM を実行できます。
  2. PHP は常にそれを必要とするわけではありませんが、使用している文字列がある時点で定数になる場合に備えて、数値以外の配列インデックスを一重引用符または二重引用符でカプセル化するのが標準的な方法です。

これはあなたが探しているものでなければなりません

class SomeClass {
  public $system = $GLOBALS['system'];
}

代わりにクラス定数を使用することもできます

class SomeClass {
  const SYSTEM = $GLOBALS['system'];
}

これは、'self::SYSTEM' を使用してクラス内で参照でき、'SomeClass::SYSTEM' を使用して外部的に参照できます。

于 2009-02-06T04:26:35.467 に答える