2009-09-25 145 views
11

我經常創建一個具有幾個私有變量的類。 當設置了該類的一個實例時,應該可以用getter和setter填充該類的所有變量。在php中爲類自動生成getter和setter的最佳方式是什麼?

有沒有一種簡單的方法來做到這一點,而不必在創建類時爲每個變量輸入所有這些setter和getters?

現在我不得不在課堂

public function setVar($var){ 
$this->var = $var; 
} 

public function getVar(){ 
return $this->var; 
} 

我們現在使用正則表達式爲每個變種鍵入這一點,但我不知道這是最簡單的方法.. 我們使用Eclipse作爲環境,所以也許有一些有用的插件?

+0

雖然很痛苦,但實現這些幾乎不需要太多時間。我通常在吃午飯的時候做他們。更好的是,將代碼傳遞給學生添加。 – Chris 2010-09-06 15:14:02

+0

@Chris將它傳遞給別人不能被認爲是一個好的解決方案。一個學生或插件可能想要有一個適當的解決方案,以及... – Kennethvr 2011-08-18 11:57:08

回答

33

使用Eclipse去首選項 - > PHP - >編輯 - >模板 - >新建,使用這樣的:

private $$${PropertyName}; 
${cursor}  
public function get${PropertyName}() 
{ 
    return $$this->${PropertyName}; 
} 

public function set${PropertyName}($$value) 
{ 
    $$this->${PropertyName} = $$value; 
} 

要使用該模板鍵入它的名稱,然後按Ctrl +空格鍵 - 上下文菜單應當你輸入名字時也會自動出現。

+0

任何與這些屬性中駱駝事件使用相關的修復? – porfiriopartida 2014-12-30 06:00:14

+0

@porfiriopartida我想知道同樣的事情,並最終在get和set中使用了一個不同的變量。使用模板時,只需設置屬性和getter函數。 ;-) – andreas 2015-01-06 20:35:01

2

你看過__set和__get方法嗎?不知道這是否是你的意思,但是隻要一個班級成員被設置或檢索/獲取/訪問,這些都會被自動調用。

0

也許更好sollution:

class base { 

    protected $_vars = array(); 


    public function setVar($name, $value = null) { 
     $this->_vars[$name] = $value; 
    } 

    public function getVar($name) { 
     return isset($this->_vars[$name]) ? $this->_vars[$name] : null; 
    } 
} 

,只需擴展此類。或者你也可以使用__set和__get方法,但它們相當慢。

+0

這可能是一個很好的解決方案,但它是一個好主意,把所有在一個數組,而不是所有不同的變量?或者沒有關係? – Kennethvr 2009-09-25 10:08:36

+1

如果它是工作數據(如數組,字符串等),那就沒問題。但是,如果你想設置一些像數據庫對象或其他對象,你不應該這樣做。然後使用構造函數或其他方式。 – Pawka 2009-09-25 10:34:58

+0

你確定__set和__get mehods慢? – andho 2009-09-25 14:09:02

1

Zend Studio具有自動獲取/設置生成器的功能。

1

我認爲最好的方法是使用帶有一些字符串函數的__set和__get,在這裏讓我給你看看。

class UserProfile 
{ 
    public function __get($key) 
    { 
     if(isset($this->$key)) 
     { 
      return $this->$key; 
     } 
    } 

    public function __set($key,$val) 
    { 
     $this->cahnge($key,$val); 
    } 

    public function __call($key,$params) 
    { 
     if(substr("set",$key)) 
     { 
      //Update 
     }elseif(substr("get",$key)) 
     { 
      //return 
     } 

     //Else Blah 
    } 

    private function change($key,$val) 
    { 
     if(isset($this->$key)) 
     { 
      $this->$key = $val; 
     } 
    } 
} 

的__call()方法將讓你與功能,如

$profile->setUsername('Robert Pitt');只要設置爲你substr設置/獲取並檢查字符串作爲類的值的其餘部分: )

另一個例子

public function __call($method,$params = array()) 
{ 

    if(isset($params[0]) && is_string($params[0])) 
    { 
     $this->$method = $params[0]; 
    } 
} 

//.... 

$profile->username('Robert Pitt'); 

即使世界更多的工作在這裏完成

+0

你確定這可以嗎?我無法管理它。這是一種PHP魔法嗎?我可以調用'$ profile-> __get(username)',但我想調用'$ profile-> getUsername()' – azerafati 2015-07-23 05:11:03

相關問題