【问题标题】:Setting a static class property dynamically with squiqlies使用 squiqlies 动态设置静态类属性
【发布时间】:2013-05-23 23:05:25
【问题描述】:

我知道我能做到:

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

如果我尝试这样做:

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

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

【问题讨论】:

    标签: php static-members


    【解决方案1】:

    您不能动态设置静态属性(否则不是静态的: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';
        }
    }
    

    【讨论】:

    • 我认为您将 const 与 static 混淆了。静态属性不禁止动态设置它。这只意味着该属性由该类的所有实例共享。
    【解决方案2】:

    从 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); 
    

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

    【讨论】:

      猜你喜欢
      • 2014-04-04
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 2021-06-17
      • 2020-01-08
      • 1970-01-01
      相关资源
      最近更新 更多