设置对象的初始值

时间:2010-11-08 19:05:13

标签: php

因为我是一个喜欢清晰,简洁且不易出错的代码的程序员,所以我总是在使用之前为我的变量分配一个默认值;我相信大家都知道为什么这是一个好主意。

然而,我发现非常讨厌的一个案例是预先设置用于保存对象的变量。我没有找到合适的初始值值得设置。

我发现重要的是要指出我也不依赖于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%。

2 个答案:

答案 0 :(得分:3)

在这种情况下,我没有设置任何值。无论如何,他们将NULL没有明确的作业。

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

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

使用NULL完全没问题,因为手册说明了

  

特殊的NULL值表示没有值的变量。


由于您提到将值设置为NULL与使用unset具有相同的效果,请考虑下面的UnitTest。将变量设置为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());
    }
}

答案 1 :(得分:0)

我自己更喜欢使用null和phpdoc注释,它对于ide自动完成和自动生成文档也很有用:

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

但是如果你真的想拥有代表对象的东西,你可以尝试创建stdClass实例。

$obj = new stdClass();

<强> UPD: 为什么你认为null不合适?它被发明为什么都不代表。你不应仅仅因为它是“OO设计”或一些奇怪的方法而使你的代码变得复杂。