因为我是一个喜欢清晰,简洁且不易出错的代码的程序员,所以我总是在使用之前为我的变量分配一个默认值;我相信大家都知道为什么这是一个好主意。
然而,我发现非常讨厌的一个案例是预先设置用于保存对象的变量。我没有找到合适的初始值值得设置。
我发现重要的是要指出我也不依赖于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 :(得分: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)