2010-11-08 84 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