PHP 中静态属性的魔术__get getter

2022-08-30 09:12:10
public static function __get($value)

不起作用,即使它起作用,碰巧我已经需要魔术__get获取器,例如同一类中的属性。

这可能是一个是或否的问题,所以,有可能吗?


答案 1

不,这是不可能的。

引用__get手册页

成员重载仅适用于对象上下文。这些神奇的方法不会在静态上下文中触发。因此,这些方法不能声明为静态。


在 PHP 5.3 中,添加了 __callStatic ;但是没有,还没有;即使拥有/编码它们的想法经常回到php internals@邮件列表中。__getStatic__setStatic

甚至还有一个征求意见:PHP
的静态类但是,仍然没有实现(还没有?


答案 2

也许有人仍然需要这个:

static public function __callStatic($method, $args) {

  if (preg_match('/^([gs]et)([A-Z])(.*)$/', $method, $match)) {
    $reflector = new \ReflectionClass(__CLASS__);
    $property = strtolower($match[2]). $match[3];
    if ($reflector->hasProperty($property)) {
      $property = $reflector->getProperty($property);
      switch($match[1]) {
        case 'get': return $property->getValue();
        case 'set': return $property->setValue($args[0]);
      }     
    } else throw new InvalidArgumentException("Property {$property} doesn't exist");
  }
}

推荐