2013-05-20 40 views
4

我不確定在PHP中使用__get__set方法的值是多少。php __set(),__get和簡單設置,獲取函數之間的區別

這是在數組中設置值的代碼。

class myclass { 
public $sotre = array(); 

public function __set($arraykey,$value){ 
    echo 'Setting '.$arraykey.' to '.$value; 
    $this->store[$arraykey] = $value; 
} 
} 

$obj = new myclass; 
$obj->a = 'arfan'; 

這是另一個代碼。

class myclass { 
public $sotre = array(); 

public function setvalue($arraykey,$value){ 
    echo 'Setting '.$arraykey.' to '.$value; 
    $this->store[$arraykey] = $value; 
} 
} 

$obj = new myclass; 
$obj->setvalue('a','arfan'); 

這兩個函數都做同樣的事情。使用__get/__set魔術方法

代碼:

class myclass { 
public $store = 
array(
    'a'=>'arfan', 
    'b'=>'azeem', 
    'c'=>'hader' 
); 

public function __get($arraykey){ 
    echo 'Getting array key '.$arraykey.'<br />'; 
    if(array_key_exists($arraykey,$this->store)){ 
     return $this->store[$arraykey]; 
    } 
} 

public function getvalue($arraykey){ 
    echo 'Getting array key '.$arraykey.'<br />'; 
    if(array_key_exists($arraykey,$this->store)){ 
     return $this->store[$arraykey]; 
    } 
} 
} 

$obj = new myclass; 
echo $obj->a; 

$obj = new myclass; 
echo $obj->getvalue('a'); 

正如你看到的這些功能都做同樣的工作。

我很困惑,爲什麼PHP開發人員可以使用神奇的方法__get/__set時,他們可以自己實現?

我確定他們有一些用途,但我必須錯過一些東西。

+0

'$ obj->了'是比'obj- $>的GetValue( 'A')更具可讀性'...爲** MagicMethods – DCoder

回答

12

這不是關於他們做什麼,而是當他們被調用時。

__set() is run when writing data to inaccessible properties. 

__get() is utilized for reading data from inaccessible properties. 

所以,如果你想

echo $object->propertDoesnExists; //it will call get 

但這

$object->propertDoesnExists = 1; //it will call set 

使用get和set方法的很好的例子是here

使用MagicMethods使得代碼更容易閱讀和更短。

還有更有趣的MagicMethods

我也注意到您使用$store數組是公共的!它沒有意義。如果您將其標記爲公開,則無需使用方法即可訪問。這不是重點。當你使用方法或魔術方法來獲取/設置變量時,這是因爲方法在你想分配或獲取變量時給你更好的控制,你可以做一些驗證,檢查錯誤等。將變量作爲公共對象稱爲非常糟糕的約定。公共成員可以在項目的每個地方的類之外訪問,如果發生錯誤,需要檢查很多代碼,當通過方法訪問的私有成員出現問題時,可能只有兩種方法可以檢查(get/set)。

+0

注意新鏈接**是:HTTP://博客.marcomonteiro.net /後/ PHP-魔的方法最完整導(http://blog.marcomonteiro.net/post/php-magic-methods-the-complete-guide) – toddkaufmann

1

因爲它已經被告知有什麼不同,我會嘗試解釋目的。

這些魔術功能實際上是爲了一些代碼清除。有人認爲撥打$object->property比撥打$object->getProperty()更清楚。

當你使用鏈接ie時更加清楚。 object->getDatabase()->getTable()->getRow()->getType()->convertToString()->makeUppercase()等。使用「隱藏屬性」更清晰。

使用神奇的方法並不能解決一些問題(比如通過引用調用),但有時更容易閱讀。

使用屬性是在一些語言很受歡迎(如Object Pascal中,即德爾福或FreePascal的),你的類可以有這樣的事:

property count: Integer read getCount write getCount; 

其中兩個getCount()setCount()是由私人或保護。編碼員可以像他們是變量一樣思考他們,但是方法被調用。

在PHP中,還有一些優勢是__get()(和__set())神奇的方法。通常情況下,當你致電非現有財產時,會發出通知。但是,如果您實施__get()方法,則不會給出通知,您可以編碼__get()方法,例如在屬性不存在或處理錯誤或任何情況下返回NULL

這可能是什麼危險(但也有可能),請看看最後一個例子here

0

這種神奇的方法就像捷徑。其他語言,如Python,C#和Ruby也實現了這個功能。

我認爲當你需要把PHP代碼的HTML模板中,這是比較有用:

foreach($items as $item): 
    ?> 
    <li> 
     Title: <?php echo $item->getTitle(); ?> <br/> 
     Description: <?php echo $item->getLongDescription(); ?> <br/> 
     URL: <?php echo $item->getAbsoluteUrl(); ?> <br/> 
    </li> 
    <?php 
endforeach; 

這比上述更重要的是可讀性:

foreach($items as $item): 
    ?> 
    <li> 
     Title: <?php echo $item->title; ?> <br/> 
     Description: <?php echo $item->longDescription; ?> <br/> 
     URL: <?php echo $item->absoluteUrl; ?> <br/> 
    </li> 
    <?php 
endforeach; 

所以,你是對的,這絕對沒有什麼區別,只是讓事情變得更簡單的一種方法。

0

__set()在將數據寫入不可訪問的屬性時運行。

__get()用於從不可訪問屬性讀取數據。

Ex。

public void __set (string $name , mixed $value) 

EX。

public mixed __get (string $name) 
相關問題