2013-02-07 74 views
3

我正在嘗試在我無法修改的類中的變量上編寫「偵聽器」。我正在擴展有問題的類,取消設置我想要聽的屬性,然後使用__set來截取對該變量的寫入。在那一點上,我會比較以前的版本,並報告是否有變化。如何從擴展類的父對象中刪除屬性?

class A { 
    var $variable; 

    ... 
} 

class B extends A { 
    var $new_variable 

    function __construct() { 
     parent::__construct(); 
     unset($this->variable); 
    } 

    function __set($thing, $data) { 
     if ($thing == 'variable') { 
      // Report change 
      // Set $new_variable so we can use __get on it 
     } 
    } 

    public function __get($var) { 
     if (isset($this->$var)) { 
      // Get as normal. 
      return $this->$var; 
     } elseif ($var == 'variable' && isset($this->new_variable)) { 
      return $this->new_variable; 
     } 
    } 

    ... 
} 

如果我修改類問題,而不是直接通過擴展類,除去變量的聲明和引入setter和getter方法這工作。問題是,當我使用上面顯示的模式時,unset()調用看起來實際上並沒有從父類中移除繼承的變量,因此使__set方法無法截取變量的值。

到目前爲止,我認爲這是我可以觀察變量變化的唯一方法,但我不想破解框架的核心,只能檢查它的方便工作(解析器)。是否有可能做出這項工作,或以其他方式解決這個問題?

+0

原來問題的一部分,但不是全部,是我用property_exists()在__get方法,而不是isset()函數來檢查屬性的存在。 – epocsquadron

回答

1

嗯,這很奇怪。下面的代碼工作正常:

class A 
{ 
    var $variable; 
} 

class B extends A 
{ 
    var $new_variable; 

    function __construct() 
    { 
     unset($this->variable); 
    } 

    function __set($thing, $data) 
    { 
     if ($thing == 'variable') 
     { 
     echo "\nThe variable value is '" . $data . "'\n"; 
     } 
    } 
} 

$b = new B(); 
$b->variable = 'Intercepted'; //Output: The variable value is 'Intercepted' 
$b->new_variable = 'Not intercepted'; // No output 

你能告訴我,如果這一段代碼做了你需要什麼,如果沒有,你會需要呢?

HTH

+0

這個例子的確對我有用,但是當它特別適用於我的代碼庫時,它不會。我已經慢慢地將邏輯加回到幾乎具有相同代碼的地步。測試示例工作正常,而實際的代碼則沒有。我仍在調查什麼可能是不同的.. – epocsquadron

+0

我已經跟蹤到我的重載類被父類的實例替換的問題。看起來它一直工作。我接受你的回答,認爲它沒有任何問題。 :) – epocsquadron

+0

好的,謝謝。雖然我沒有太多幫助,但我很高興你發現問題:) –

相關問題