2010-11-08 83 views
0

因爲我是一個喜歡清晰,簡潔並且不易出錯的代碼的程序員,所以在使用它之前,我總是將變量分配一個默認值;我相信我們都知道爲什麼這是一個好主意。設置對象的初始值

然而,我覺得非常煩人的一種情況是,當涉及到預先設置用於保存對象的變量時。我還沒有找到合適的值得設定的初始值。

我覺得很重要的一點是,我也不喜歡依賴PHP的鬆散類型的功能。我不喜歡在它的壽命期間改變變量的類型,因爲我發現它是一個混亂的,容易出錯的猜謎遊戲。在過去,我將對象變量的初始值設置爲NULL,但這在PHP中並不是一個合適的值,因爲這會從變量表中除去變量並允許由GC收集變量;在使用它之前不會收集它的可能性,但它仍然看起來很髒。

這就是說,當你的變量持有一個對象時,你們將你的初始值設置爲什麼?

$foo_id = 0; 
$is_foo = false; 
$foo  = ''; 
$obj_foo = NULL; // not really an appropriate initial value 

編輯

爲了澄清爲什麼我覺得默認的值不應設置爲null,採取如下:

$obj_foo = null; 
echo isset($obj_foo); // false 

通常情況下,這會不會導致問題,但我可以看到這樣做的痛苦1%。

+0

當您只是問人們如何做時,您如何確定接受哪個答案?那麼應該是一個CW。 – Gordon 2010-11-08 19:10:14

+0

'NULL'沒有那麼糟糕,至少比未定義的變量更好。 – 2010-11-08 19:14:20

+0

@戈登這是真的,應該是。當我發佈這個問題時,我沒有想到它。我在這裏是新的,不知道現在是否可以改變:/ – Craige 2010-11-08 19:18:22

回答

3

在這種情況下,我沒有設置任何值。無論如何,他們將是NULL而沒有明確的任務。

class Foo 
{ 
    /** 
    * @var SomeClass 
    */ 
    protected $_object; 

    public function __construct() 
    { 
     $this->_object = new SomeClass; 
    } 
} 

使用NULL是完全正常的,因爲隨着手冊指出

特殊的NULL值表示沒有值的變量。


既然你提到的值設置爲NULL具有作爲其使用unset同樣的效果,請考慮下面的單元測試。設置一個變量爲NULL不會破壞它,它不會被GC收集。使用unset將銷燬一個變量並立即將其刪除。

class NullTest extends PHPUnit_Framework_TestCase 
{ 
    public function testSettingNullDoesNotRemoveVariable() 
    { 
     $foo = NULL; 
     gc_collect_cycles(); // forcing GC to collect 
     $this->assertNull($foo); 
     $this->assertArrayHasKey('foo', get_defined_vars()); 
    } 
    public function testUnsetRemovesVariable() 
    { 
     $foo = NULL; 
     unset($foo); 
     $this->assertNull($foo); // raises Notice "Undefined variable: foo" 
     $this->assertArrayNotHasKey('foo', get_defined_vars()); 
    } 
} 
0

通過我自己,我更喜歡使用空和phpdoc意見,這也爲IDE自動完成,並自動生成文檔有用:

/* 
    @var Class 
*/ 
$obj = null; 

但如果你真的想擁有的東西,代表對象,你可以嘗試創建stdClass實例。

$obj = new stdClass(); 

UPD: 爲什麼你認爲空是不是合適?它被髮明來代表什麼。你不應該僅僅因爲它是「OO設計」或者一些奇怪的方法而使你的代碼變得複雜。

+1

我也考慮過stdClass,但是你的對象會評估爲true。所以這是不可行的。 – 2010-11-08 19:10:12

+0

我認爲null是不合適的,因爲在PHP中它與unset()變量具有相同的效果,這與您在設置初始值時想要完成的操作完全相反。 – Craige 2010-11-08 19:26:30

+0

請參閱上面有關isset()的其他示例。 – Craige 2010-11-08 19:40:11