PHP中静态变量的通用回调

时间:2011-03-10 19:09:36

标签: php

我需要一种方法来使用变量作为类名来访问类的静态变量。由于PHP处理静态方法和继承的方式,我需要访问变量本身而不是静态函数。

class Item
{
   public static $name = 'parent';
}

class SubItem extends item
{
   public static $name = 'child';
}

$classname = 'SubItem';

// This won't work
$value = $classname::$name;

// This obviously won't work either. Not a function.
$value = call_user_func(array($classname, '$name'));

PHP处理静态方法的本质,尝试在类Item中定义静态方法,如果调用类SubItem,则总是返回“parent”而不是“child”。

我假设有一种方法,但我的阅读并没有提供任何有用的东西。

2 个答案:

答案 0 :(得分:2)

事实上,这一行:

// This won't work
$value = $classname::$name;

不适用于PHP 5.2,但适用于PHP 5.3 :如果我在var_dump()上使用$value,我会得到以下结果

string 'child' (length=5)


我想你的答案就在这里:PHP 5.3;它会解决:

  • $classname::$name问题(quoting):
  

从PHP 5.3.0开始,它是可能的   使用变量引用类。   
变量的值不能是a   关键字(例如selfparent和   static)。

  • 它还应该解决“在类中定义一个静态方法将始终返回”parent“而不是”child“”问题,如果您使用static而不是{ {1}}:使用PHP 5.3,static关键字具有新含义 - 请参阅Late Static Binding

答案 1 :(得分:0)

class Item
{
   public static $name = 'parent';

   public function getName(){
     return static::$name;
   }
}

class SubItem extends Item
{
   public static $name = 'child';
}

$classname = 'SubItem';

$value = call_user_func(array($classname, 'getName'));