2014-11-22 30 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

相關問題