web-dev-qa-db-ja.com

PHP class:クラスのプロパティとしてのグローバル変数

クラス外にグローバル変数があります= $ MyNumber;


これをmyClassのプロパティとして宣言するにはどうすればよいですか?
私のクラスのすべてのメソッドについて、これが私がしていることです:

class myClass() {

    private function foo() {
         $privateNumber = $GLOBALS['MyNumber'];
    }

}



これ欲しい

class myClass() {

    //What goes here?
    var $classNumber = ???//the global $MyNumber;

    private function foo() {
         $privateNumber = $this->classNumber;
    }

}



編集:グローバル$ MyNumberに基づいて変数を作成したいが、
メソッドで使用する前に変更

var $ classNumber = global $ MyNumber + 100;

30
Zebra

デバッグするのは悪夢になるので、おそらく本当にしたくないが、それは可能だと思われる。キーは、コンストラクターでreferenceによって割り当てる部分です。

$GLOBALS = array(
    'MyNumber' => 1
);

class Foo {
    protected $glob;

    public function __construct() {
        global $GLOBALS;
        $this->glob =& $GLOBALS;
    }

    public function getGlob() {
        return $this->glob['MyNumber'];
    }
}

$f = new Foo;

echo $f->getGlob() . "\n";
$GLOBALS['MyNumber'] = 2;
echo $f->getGlob() . "\n";

出力は

1
2

これは、値ではなく参照によって割り当てられていることを示しています。

先ほど言ったように、デバッグするのは悪夢ですので、これを行うべきではありません。 カプセル化 ;に関するウィキペディアの記事を読んでください。基本的に、オブジェクトは独自のデータとそのデータが変更されるメソッドを理想的に管理する必要があります。一般的に、公共の財産でさえ、私見ではありません。

51
El Yobo

グローバルを避けるようにしてください、代わりにこのようなものを使用することができます

class myClass() {
 private $myNumber;

 public function setNumber($number) {
  $this->myNumber = $number;
 }
}

今、あなたは呼び出すことができます

$class = new myClass();
$class->setNumber('1234');
10
mrwooster

global keyword を使用するだけです。

例えば。:

class myClass() {
    private function foo() {
        global $MyNumber;
        ...

その後、$ MyNumberはそのメソッド内でアクセス可能(そして実際に変更可能)になります。

ただし、グローバルの使用はしばしば眉をひそめられます(コードの悪臭を放つ可能性があるため)mightシングルトンクラスを使用してこの性質のものは何でも保管してください。 (それから、あなたがこれを達成しようとしていることについてもっと知ることなく、非常に悪い考えかもしれません- define がもっと役に立つかもしれません。)

6
John Parker

コンストラクターの使用はどうですか?

class myClass {

   $myNumber = NULL;

   public function __construct() {
      global myNumber;

      $this->myNumber = &myNumber; 
   }

   public function foo() {
      echo $this->myNumber;
   }

}

または、この方法ではるかに優れています(オブジェクトを初期化するときにグローバル変数をパラメータとして渡す-読み取り専用)

class myClass {

   $myNumber = NULL;

   public function __construct($myNumber) {
      $this->myNumber = $myNumber; 
   }

   public function foo() {
      echo $this->myNumber;
   }

}
$instance = new myClass($myNumber);
2
Petr Peller

私が経験したことは、グローバル変数をクラス変数に直接割り当てることはできないということです。

class myClass() {

    public $var = $GLOBALS['variable'];

    public function func() {
         var_dump($this->var);
    }
}

上記のコードでは、「解析エラー:構文エラー、予期しない '$ GLOBALS' "」というエラーが表示されます。

しかし、このようなことをすると、

class myClass() {

    public $var = array();

    public function __construct() {
        $this->var = $GLOBALS['variable'];
    }

    public function func() {
         var_dump($this->var);
    }

}

コードは正常に機能します。

グローバル変数をクラス変数に割り当てる場所は、関数内にある必要があります。そして、これにはコンストラクター関数を使用しました。

そのため、$ this-> var;を使用するだけで、クラスのすべての関数内でグローバル変数にアクセスできます。

2
emre

クラス内からプロパティにアクセスする場合は、次を行う必要があります。

private $classNumber = 8;
1
Gal

class myClass {protected $ foo;

public function __construct(&$var)
{
    $this->foo = &$var;
}

public function foo()
{
    return ++$this->foo;
}

}

0
Xerxes