PHP中的值对象与关联数组

45

(这个问题以PHP为背景,但并不仅限于PHP。例如任何具有内置哈希的语言也是相关的)

让我们看一下这个例子(PHP):

function makeAFredUsingAssoc()
{
    return array(
        'id'=>1337,
        'height'=>137,
        'name'=>"Green Fred");
}

对比:

class Fred
{
    public $id;
    public $height;
    public $name;

    public function __construct($id, $height, $name)
    {
        $this->id = $id;
        $this->height = $height;
        $this->name = $name;
    }
}

function makeAFredUsingValueObject()
{
    return new Fred(1337, 137, "Green Fred");
}

当然,方法#1更加简洁,但是它很容易导致错误,例如

$myFred = makeAFredUsingAssoc();
return $myFred['naem']; // notice teh typo here
当然,人们可能会争论$myFred->naem同样会导致错误,这是正确的。但是,对我来说,有一个正式的类感觉更加严格,但我无法真正证明它。
使用每种方法的优缺点是什么,人们应该在何时使用哪种方法?
11个回答

0

我更喜欢像你第二个示例中那样硬编码属性。我觉得它更清晰地定义了预期的类结构(以及类上所有可能的属性)。而不像第一个示例,只是不断记住使用相同的键名。对于第二个示例,您始终可以返回并查看类文件顶部以了解其属性。

第二个示例会更好地让您知道自己在做什么错误--如果您尝试echo $this->doesntExist,您将会收到一个错误,而如果您尝试echo array['doesntExist'],则不会。


3
实际上,您会收到一条 NOTICE,其中包含 PHP Notice: Undefined index: doesntExist - Corey Ballou
3
抱歉,没错,你会收到通知,但有时候要比页面直接崩溃更难发现。这可能会被忽略一段时间(无恶意意味)。 - Parrots

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接