2014-11-22 173 views
1

我可以使用神奇的方法来捕捉Access to undeclared static property不可访问的静态属性吗?魔术方法 - 我可以使用它们来捕捉无法访问的静态属性吗?

例如,

class greeting 
{ 
    static public function init() 
    { 
     static::$message = 'Hello World!'; 
    } 

    /* 
    * Set the inaccessible property magically. 
    */ 
    public function __set($name, $value) 
    { 
     var_dump($name); // set the property here? 
    } 

    /* 
    * Get the inaccessible $class magically. 
    */ 
    public function __get($name) 
    { 
     var_dump($name); // set the property here? 
    } 
} 

greeting::init(); 
var_dump(greeting::$message); 

我得到的,

Fatal error: Access to undeclared static property: greeting::$messsage in C:...

回答

1

不这么认为。没有像__getStatic或__setStatic这样的神奇方法。至于与注册表模式你的问题的交易,你可以这样做:

使用标准的注册表模式:

class Reg { 

    private $register = array(); 

    private static $instance = null; 

    public static function getInstance() 
    { 
     if (self::$instance === null) 
     { 
      self::$instance = new Registry; 
     } 

     return self::$instance; 
    } 

    public function __set($key, $val) 
    { 
     $this->register[$key] = $val; 
    } 

    public function __get($key) 
    { 
     if (isset($this->register[$key])) 
     { 
      return $this->register[$key]; 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 

电话:

$reg = Reg::getInstance(); 
$reg->foo = 'bar'; 
echo $reg->foo; 

,或者使用与抽象注册类(非魔术)获得者和接球者:

abstract class Reg { 

    private static $register = array(); 

    public static function set($key, $val) 
    { 
     self::$register[$key] = $val; 
    } 

    public static function get($key) 
    { 
     if (isset(self::$register[$key])) 
     { 
      return self::$register[$key]; 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 

电话:

Reg::set('foo','bar'); 
echo Reg::get('foo'); 

优势:无需实例化一个Registry类

,或者使用一个抽象的注册表类魔法callStatic方法:

abstract class Reg { 

    private static $register = array(); 

    public static function __callStatic($key, $val) 
    { 
     if(count($val)) 
     { 
      self::$register[$key] = $val[0]; // $val is passed as array, so take first item 
     } 
     else 
     { 
      if (isset(self::$register[$key])) 
      { 
       return self::$register[$key]; 
      } 
      else 
      { 
       return null; 
      }   
     } 
    } 
} 

电话:

Reg::foo('bar'); 
echo Reg::foo(); 

优势:更少的字符需要设置和获取变量。

缺点:性能不佳。

与1.000.000循环一个小测试我有以下几点:

方法1)2,319s

方法2)1,416s

方法3)3,708s

所以与非魔术(但至少是静态的)获取者和制定者的抽象注册表似乎是最好的解决方案。

+0

感谢您的回答!顺便说一句,[主题问题]你用什么程序来测试以获得这些结果'2,319s/1,416s/3,708s'? – laukok 2014-11-23 14:10:42

+1

没有使用任何,只是写了一个小脚本和测量时间戳执行前后用php方法microtime(true) – sasha 2014-11-24 08:55:37

+0

我应该写测试呢!谢谢! – laukok 2014-11-24 09:41:37

相关问题