48

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

私のクラスは:

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は私の名前です」を印刷するにはどうすればよいですか

4

5 に答える 5

109

がクラスの場合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

クラスリテラルアプローチを使用する場合、foreachPHP5.2.8でループを使用すると、スコープ解決演算子を使用すると構文エラーが発生します。

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を宣言するのですか?これは、オブジェクトをインスタンス化する必要なしに変数にアクセスするという考え全体を打ち負かします。

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

于 2010-09-29T02:27:59.820 に答える
10

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

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

$lstClass = array('A');

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

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

于 2010-09-29T02:41:11.257 に答える
2

セミコロンが欠落している構文エラーがあります。これは配列であるため、インデックス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;

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

アップデート

配列を反復処理してクラス変数を呼び出す場合は、次のようにします。

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

なぜそれが必要なのかわかりませんが、そこに行きます。そして、これはテストされており、エラーはスローされず、の有効な応答A is my nameが受信されました。

編集

どうやらこれはPHP5.3でのみ機能します

于 2010-09-29T02:30:22.313 に答える
0

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

私の解決策は:

eval('return '.$x[0].'::$strName;');
于 2010-09-29T08:57:52.033 に答える
0

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

于 2017-04-02T00:42:22.923 に答える