2010-12-03 50 views
0

是否有可能覆蓋我已經設置的參數的get和set方法?所以每次我設置一個參數,我都可以使用它/驗證它?PHP覆蓋獲取設置方法

class User { 

    public $username; 

    function custom_set($name, $value) { 
     if(strlen($value) < 5) { 
     return "not long enough"; 
     } else { 
     $this->$name = $value; 
     } 

    } 
} 

$u = new User(); 
$u->username = "ted"; 
echo $u->username; 

輸出:「不夠長」

這是一個非常簡單的例子,我只是寫了,可能有錯誤,它只是傳達什麼,我試圖做的。我想要調用custom_set方法。

我不想做的構造函數中的驗證,我不想創造這樣$u->setVal("ted");

單獨的方法,這可能嗎?

+1

爲什麼不使用一個簡單的數組來存儲*參數*而不真正使用真正的*對象屬性*?這樣,你的`__set`和`__get`魔術方法總是被稱爲 – dcestari 2010-12-03 01:02:52

回答

2

使這些屬性爲protectedprivate然後__get__set將被調用,您可以委託給任何你想要的邏輯。

個人而言,我還沒有看到一個案例,我會考慮使用任何東西public屬性。

+0

DTO。歡迎來到適當編碼的世界。 – Andrew 2014-12-29 17:38:40

0

您是否在談論Magic Methods

+0

不,因爲那些只會被調用未定義的屬性:「當你嘗試檢索未定義屬性的數據時,會自動調用這些方法。在上面的例子中,我正在談論我已經定義的屬性,比如`$ username`。 – imns 2010-12-03 01:06:52

3

執行__set方法。這在嘗試訪問不可訪問的屬性時被調用。

function __set($name, $value) { 
    $this->custom_set($name, $value); 
} 

但是請注意,這$username是公共屬性,因此除非它被聲明privateprotected這是不行的。

+0

還有__get – Webnet 2010-12-03 01:44:59