2012-02-24 41 views
0

我認爲它是一個相當簡單的問題,但不知道。PHP __set變量雖然__get傳遞參考

我有一個類:

<?PHP 
class PropertyTest { 
    private $data = array(); 

    public function __set($name, $value) { 
     $this->data[$name] = $value; 
    } 

    public function __get($name) { 
     if (array_key_exists($name, $this->data)) { 
      return $this->data[$name]; 
     } 

     $trace = debug_backtrace(); 
     trigger_error(
      'Undefined property via __get(): ' . $name . 
       ' in ' . $trace[0]['file'] . 
       ' on line ' . $trace[0]['line'], 
      E_USER_NOTICE); 
     return null; 
    } 

    public function __isset($name) { 
     echo "Is '$name' set?\n"; 
     return isset($this->data[$name]); 
    } 

    public function __unset($name) { 
     echo "Unsetting '$name'\n"; 
     unset($this->data[$name]); 
    } 

    public function getHidden() { 
     return $this->hidden; 
    } 
} 
?> 

不知道爲什麼,但「代碼」塊是惱人的地獄,反正。

只是基本的魔法得到確定。但是,當我改變__get按引用傳遞我不能再這樣做:

$object->$variableName = $variableValue; 

我不知道爲什麼,雖然我假設,因爲它會檢查其是否存在,但由於它具有參考返回的東西會失敗如果它不存在,就這樣做。 set函數不會被稱爲可能,即使我返回一個假值,它永遠不會調用set函數,因爲它'已經存在/有一個值'。

我能理解這個嗎?如果是這樣,是否有解決方法?如果不是如何工作,是否有解決方法?

+0

你能告訴我們具體哪一部分,你想改變傳遞參考?在設置參數爲這樣的** PHP致命錯誤時,我遇到了一個致命錯誤:Method PropertyTest :: __ get()不能通過引用接受參數** – quickshiftin 2012-02-24 10:29:40

+0

public function&__ get($ name){ – John 2012-02-24 10:31:06

回答

0

除非我失去了一些東西它的工作對我罰款

<?php 
class PropertyTest 
{ 

    private $data = array(); 

    public function __set($name, $value) 
    { 
     $this->data[$name] = $value; 
    } 

    public function &__get($name) 
    { 
     if(array_key_exists($name, $this->data)) 
      return $this->data[$name]; 
     return null; 
    } 

    public function __isset($name) 
    { 
     return isset($this->data[$name]); 
    } 

    public function __unset($name) 
    { 
     unset($this->data[$name]); 
    } 

    public function getHidden() 
    { 
     return $this->hidden; 
    } 
} 

$oPropTest = new PropertyTest(); 
$sField = 'my-field'; 

$oPropTest->$sField = 5; 

var_dump($oPropTest); 

輸出:

bash-3.2$ php test-get-set.php 
object(PropertyTest)#1 (1) { 
    ["data":"PropertyTest":private]=> 
    array(1) { 
    ["my-field"]=> 
    int(5) 
    } 
} 

一個好辦法,我建議你__get實現是充分利用__isset方法,而比重新執行支票(按照你的方式做2種不同的方式)

public function __get($name) 
{ 
    if($this->__isset($name)) 
     return $this->data[$name]; 
    return null; 
} 

關於從__get引用返回的想法;它將起作用,但對除公共屬性之外的任何內容都無用,因爲私有屬性和受保護屬性不能直接通過類範圍之外的引用來設置。

$oPropTest = new PropertyTest(); 
$sField = 'my-field'; 

$oPropTest->$sField = 5;  // sets $oPropTest->my-field to 5 (effectively) 
$iRef = $oPropTest->$sField; // $iRef is a reference to $oPropTest->my-field 
$iRef = 6;     // this will not set $oPropTest->my-field since it's private