0

重複の可能性:
クラスの文字列名から、静的変数を取得できますか?

親クラスのどこかで、現在のインスタンスによって決定される、可能な子クラスの1つの静的変数の値を見つける必要があります。

私が書いた:

  $class = get_class($this);
  $value = isset($class::$foo['bar']) ? $class::$foo['bar'] : 5;

この例では、名前がにあるサブクラスに$classはpublic static$fooがあります。

使用することはあまり美しいコードではないことは知って$class::$foo['bar']いますが、PHP5.3.4で仕事をこなすことができます。

ただし、PHP 5.2.6では、構文エラーが発生します。
解析エラー:構文エラー、予期しないT_PAAMAYIM_NEKUDOTAYIM、「、」または「)」が必要です。

同じことを行うPHP5.2.4+で動作する別の方法はありますか?

4

4 に答える 4

1

編集:反射が優れています。

あなたは方法を試すことができますget_class_vars。PHP 5.2.6にアクセスできませんが、これは5.2.11で機能します...

class Test {
    public static $foo;

    function __construct() {
        echo("...Constructing...<br/>");
        Test::$foo = array();
        Test::$foo['bar'] = 42;
    }

    function __toString() {
        return "Test";
    }
}


$className = 'Test';
$class = new $className();

$vars = get_class_vars($className);

echo($vars['foo']['bar'] . "<br/>");

出力:

...Constructing...
42
于 2011-04-14T12:58:45.247 に答える
1

これがPHP5.2で機能しない理由は、PHP 5.3より前では、クラス名で変数を使用することが許可されていないためです。したがって、可能であればevalこれを使用してください。

eval('$result = ' . $c . '::$foo[\'bar\'];');
echo $result;

それ以外の場合は、子クラスの関数を使用して値を受け取る必要があります。例えば:

class MyParent {
    public function __construct() {
        $var = $this->_getVariable();
        echo $var['bar'];
    }
}

class MyChild extends MyParent {
    static $var = array('bar' => 'foo');

    protected function _getVariable() {
        return self::$var;
    }
}

new MyChild();
于 2011-04-14T14:09:15.767 に答える
0
class Bar1 {
    static $var = array('index' => 'value');
}
class Bar2 extends Bar1 {
}
class Foo extends Bar2 {
    static $var = array('index' => 'value in Foo');
    public function __construct() {
        echo parent::$var['index'];
    }
}

$foo = new Foo();

'value'を出力しますが、'Fooのvalue'は出力しません

願わくば、それがあなたが探しているものです。

于 2011-04-14T12:48:55.247 に答える
-1

selfキーワードを使用して作業しているクラスで、またはを使用して親クラスのクラスstatic /callstaticメソッドを取得できますparentget_classPHP 5.3.0で機能が変更されたため、php5.2.6でこのエラーが発生する可能性があります。

于 2011-04-14T12:46:42.533 に答える