2014-06-23 86 views
2

由於輸入錯誤,我創建了一個新的對象級變量。這很難調試。雖然這可能是一個懶惰的功能,但有沒有辦法阻止對象級別的變量被賦值?我希望error_reporting至少會告訴我我做到了,如果不能阻止的話。php:防止創建對象級變量

<?php 

error_reporting(E_STRICT|E_ALL); 

class SearchField { 
    var $field1; 
} 

$field = new SearchField(); 
$field->field1 = 'value1'; 
echo '<p>'.var_dump($field).'</p>'; 

$field->feild1 = 'value2'; 
echo '<p>'.var_dump($field).'</p>'; 

$field = new SearchField(); 
$field->field1 = 'value1'; 
echo '<p>'.var_dump($field).'</p>'; 


?> 

在這裏,錯字相當明顯。有時候它並不那麼明顯。

object(SearchField)#1 (1) { ["field1"]=> string(6) "value1" } 
object(SearchField)#1 (2) { ["field1"]=> string(6) "value1" ["feild1"]=> string(6) "value2" } 
object(SearchField)#2 (1) { ["field1"]=> string(6) "value1" } 
+0

可能重複的[有沒有方法來禁用從類的實例添加屬性到類?](http://stackoverflow.com/questions/8631133/is-there-a-way-to-disable從屬性到類的實例) –

回答

1

你可以使用一個魔法二傳手:

public function __set() { 
    throw new LogicException('Thou shalt not create variables on me'); 
} 

http://www.php.net/manual/en/language.oop5.overloading.php#object.set

雖然我懷疑的想法是多麼的好,它添加到您的所有類只是爲了防禦這個一個可能的錯誤。您應該使用protected屬性和明確的getter和setter方法,並養成使用$field->setField('foo')的習慣,這是更好的OOP練習。

+0

好吧,protected/private不會阻止以這種方式創建新屬性,但是 - 當然,使用這種「保護」機制不是所有情況下的一個好主意。因爲它沒有什麼意義。如果類有一些API - 所以它應該使用它,其餘的東西應該是它的擔心(除非它們與實例內的其他東西衝突)當然, –

+0

@Alma *「...並養成習慣使用[setters]「*。如果你這樣做,你會發現非常詳細的錯誤消息,如果你用手指着一個setter。是的,它不會阻止屬性的創建,但是如果您的類在所有環境中使用getter和setter時都會設置一些無用的屬性,那麼這是無關緊要的。 – deceze

+1

非常感謝。我將其視爲調試技術而不是編碼實踐。當然,編寫新代碼時使用好的實踐應該是顯而易見的(並且應該始終歡迎提供建議)。但是,如果一個人拿着一個10年前的腳本交給一個擁有很多命名規則屬性的類,並且有十幾個方法可以做幾個更改,那麼重寫並不總是一種選擇。 –