使用squiqlies动态设置静态类属性

时间:2013-05-23 23:05:26

标签: php static-members

我知道我可以这样做:

class Foo {
   public function bar( $k, $v ){
       $this->{$k} = $v;
   }
}

如果我尝试:

class Foo {
    public static function bar( $k, $v ){
       self::${$k} = $v;
    }
}

它不起作用。我可能不太了解静态属性。谁能解释一下?

2 个答案:

答案 0 :(得分:2)

您无法动态设置静态属性(否则不是静态的:P),但您可以对其进行管理,例如

class Foo {
    static $vars;
    public static function set( $k, $v ){
        self::$vars[$k] = $v;
    }
    public static function get( $k ){
        return isset(self::$vars[$k]) ? self::$vars[$k] : 'error';
    }
}

答案 1 :(得分:1)

从PHP 5.1.0起,如果属性是预定义的,但您想动态分配新值,则可以使用ReflectionClass

class Foo {
    public static $prop1; 

    public static function bar( $k, $v ){
       $class = new ReflectionClass("Foo");
       $class->setStaticPropertyValue($k, $v);
    }
}

$k = 'prop1';
$v = 'test';
Foo:bar($k, $v); 

免责声明:使用反射会产生难以阅读的代码,并且可能会被利用。它还使得以后重构代码变得困难。因此,请先检查您的问题是否无法以不同的方式解决。