我正在尝试访问类的静态成员。
我的课程是:
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是我的名字'
答案 0 :(得分:92)
如果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
如果你采用类文字方法,那么使用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
?它无需访问变量而无需实例化对象。
简而言之,一旦我们获得了您想要做的更多信息,我们就可以继续提供更好的答案。
答案 1 :(得分:10)
如果您想要PHP5.2的工作版本,可以使用reflection来访问类的静态属性。
class A {
static $strName= '123';
}
$lstClass = array('A');
foreach ($lstClass as $value) {
$c = new ReflectionClass($value);
echo $c->getStaticPropertyValue('strName');
}
答案 2 :(得分: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
答案 3 :(得分:0)
我确实找到了下一个简单的解决方案,但不知道它是否是好的解决方案。
我的解决方案是:
eval('return '.$x[0].'::$strName;');
答案 4 :(得分:0)
From inside a class and want to access a static data member of its own you can also use static:: instead of self::