web-dev-qa-db-ja.com

クラスの静的メンバーにアクセスするにはどうすればよいですか?

クラスの静的メンバーにアクセスしようとしています。

私のクラスは:

class A
{
    public static $strName = 'A is my name'
    public function xyz()
    {
        ..
    }
    ..
}
//Since I have bunch of classes stored in an array
$x = array('A');
echo $x::$strName;

印刷中にエラーが発生します。どのように印刷できますか'A is my name'

39
KoolKabin

Aがクラスの場合、A::$strNameを介して直接アクセスできます。

class A {
    public static $strName = 'A is my name';
}

echo A::$strName; // outputs "A is my name"

更新:

配列内にあるものに応じて、クラスオブジェクトまたはクラスリテラル要因になる可能性があります。これら2つの用語は、

$objClasses = array(new A(), new B()); // class objects
$myClasses = array('A','B');           // class literals

クラスリテラルアプローチを使用する場合、PHP5.2.8でforeachループを使用すると、 scope resolution operator を使用すると構文エラーが発生します。

foreach ($myClasses as $class) {
     echo $class::$strName;
  //syntax error, unexpected '::', expecting ',' or ';'
}

クラスオブジェクトアプローチを使用することを考えましたが、実際に静的変数を出力できる唯一の方法は、オブジェクトのインスタンスを使用し、selfキーワードを使用することでした。

class A {
    public static $strName = 'A is my name';

    function getStatic() {
        return self::$strName;
    }
}

class B {
    public static $strName = 'B is my name';

    function getStatic() {
        return self::$strName;
    }
}

そして、反復するときにそのメソッドを呼び出し、

foreach($objClasses as $obj) {
    echo $obj->getStatic();
}

その時点で、変数staticを宣言する理由はどれですか?オブジェクトをインスタンス化することなく変数にアクセスするという考え全体を打ち負かします。

要するに、あなたが何をしたいのかについてより多くの情報が得られたら、それから先へ進み、より良い答えを提供することができます。

96

PHP5.2の作業バージョンが必要な場合は、 reflection を使用してクラスの静的プロパティにアクセスできます。

class A {
    static $strName= '123';
}

$lstClass = array('A');

foreach ($lstClass as $value) {
    $c = new ReflectionClass($value);
    echo $c->getStaticPropertyValue('strName');
}

デモ: http://ideone.com/HFJCW

10
HoLyVieR

セミコロンが欠落している構文エラーがあります。これは配列であるため、0のインデックスにアクセスする必要があるか、クラス 'Array'を呼び出そうとしています。

class A
{
    public static $strName = 'A is my name';

    public function xyz()
    {
        // left blank and removed syntax error
    }
}
$x = array('A');
echo $x[0]::$strName;

それを修正する必要があります。

[〜#〜] update [〜#〜]

配列を反復処理してクラス変数を呼び出す場合:

$x = array('A', 'B');
foreach ($x as $class) {
     echo $class::$strName;
}

なぜあなたがそれを望むのか定かではありませんが、そこに行きます。これはテストされ、エラーはスローされず、A is my nameを受信しました。

[〜#〜] edit [〜#〜]

どうやらこれはPHP 5.3

2
Brad F Jacobs

次の簡単な解決策を見つけましたが、その良い解決策かどうかわかりません。

私のsolnは:

eval('return '.$x[0].'::$strName;');
0
KoolKabin

クラス内から独自の静的データメンバーにアクセスする場合は、self ::の代わりにstatic ::を使用することもできます

0
panjeh