Объекты значений против ассоциативных массивов в PHP - PullRequest
37 голосов
/ 13 января 2010

(Этот вопрос использует PHP в качестве контекста, но не ограничивается только PHP. Например, любой язык со встроенным хешем также имеет значение)

Давайте посмотрим на этот пример (PHP):

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

Versus:

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 голосов
/ 13 января 2010

Я предпочитаю иметь жестко закодированные свойства, как во втором примере. Мне кажется, что он более четко определяет ожидаемую структуру класса (и все возможные свойства в классе). В отличие от первого примера, который сводится к тому, чтобы всегда помнить об использовании одинаковых имен ключей. Со вторым вы всегда можете вернуться и посмотреть на класс, чтобы получить представление о свойствах, просто взглянув на верхнюю часть файла.

Вам лучше знать, что вы делаете что-то не так со вторым - если вы попытаетесь echo $this->doesntExist, вы получите ошибку, тогда как, если вы попытаетесь echo array['doesntExist'], вы не будете.

...