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"

更新:

根据您在数组中的内容,我喜欢将其定义为类对象还是类文字可能是一个因素。我通过以下方式区分这两个术语,

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

如果您采用类文字方法,那么foreach在 PHP5.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收到了有效的响应。

编辑

显然这只适用于 PHP 5.3

于 2010-09-29T02:30:22.313 回答
0

我确实找到了下一个简单的解决方案,但不知道它是否好。

我的解决方案是:

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

从类内部并想要访问它自己的静态数据成员,您也可以使用 static:: 而不是 self::

于 2017-04-02T00:42:22.923 回答