PHP - это язык смешанной парадигмы, позволяющий использовать и возвращать необъектные типы данных, такие как массивы. Я задаю вопрос, чтобы попытаться прояснить некоторые рекомендации по выбору массивов и объектов при принятии решения о том, какую программную конструкцию использовать в конкретной ситуации.
Это действительно вопрос о способах кодирования данных с использованием языковых конструкций PHP и о том, когда один путь должен быть более вероятен, чем другой для целей передачи данных (т. Е. Сервис-ориентированная архитектура или веб-сервисы).
пример
Предположим, у вас есть тип элемента, состоящий из {cost, name, part_number, item_count}. Ваша программа требует отображения нескольких таких типов элементов, чтобы вы решили использовать массив в качестве внешнего контейнера для хранения каждого из типов элементов. [Вы также можете использовать PHP ArrayObject
для ОО-парадигмы, но мой вопрос не об этом (внешнем) массиве]. Мой вопрос о том, как кодировать данные типа элемента и какую парадигму использовать. PHP позволяет использовать PHP Native Arrays
или PHP Objects
.
Я могу закодировать такие данные двумя способами, вот так:
//PHP's associative arrays:
$ret = array(
0 => array(
'cost' => 10.00,
'name' => 'item1',
'part_number' => 'zyz-100',
'item_count' => 15
),
1 => array(
'cost' => 34.00,
'name' => 'item2',
'part_number' => 'abc-230',
'item_count' => 42
),
);
против
//here ItemType is encapsulated into an object
$ret = array(
0 => new ItemType(10.00, 'item1', 'zyz-100', 15),
1 => new ItemType(34.00, 'item2', 'abc-230', 42),
);
class ItemType
{
private $price;
private $name;
private $partNumber;
private $itemCount;
function __construct($price, $name, $partNumber, $itemCount) {..}
}
О чем я думаю
Кодирование массива облегчено и более готово к JSON, но может быть проще испортить. Неправильно написан один из ключей ассоциативного массива, и может возникнуть ошибка, которую сложнее отследить. Но это также легче изменить по прихоти. Скажем, я не хочу item_count
больше хранить , я могу использовать любое программное обеспечение для обработки текста, чтобы легко удалить все item_count
экземпляры в массиве и затем обновить другие функции, которые используют его соответствующим образом. Это может быть более утомительный процесс, но это просто.
Объектно-ориентированное кодирование требует использования языковых возможностей IDE и PHP и облегчает обнаружение любых ошибок заранее, но в первую очередь сложнее для программирования и кодирования. Я говорю сложнее, потому что вы должны немного подумать о своих объектах, подумать заранее, и ОО-кодирование требует немного большей когнитивной нагрузки, чем типизация структур массива. Тем не менее, после его кодирования некоторые изменения могут быть легче реализованы, в том смысле, что удаление item_count
, например, потребует изменения меньшего количества строк кода. Но сами изменения могут по-прежнему требовать более высокой когнитивной нагрузки по сравнению с методом массива, так как задействованы средства OO более высокого уровня.
Вопрос
В некоторых случаях это понятно, например, в случаях, когда мне нужно будет выполнять манипуляции с данными. Но в некоторых случаях, когда мне нужно просто сохранить несколько строк данных «Тип элемента», у меня нет четких рекомендаций или соображений, на которые следует опираться при попытке решить, использовать ли массивы или создавать объекты. Кажется, я могу просто бросить монетку и выбрать одну. Это тот случай здесь?
array
, 2: User-defined Class
, 3: stdClass
. Производительность с точки зрения скорости почти одинакова при сравнении array
и a User-defined class
(например, вашего ItemType
), но определенные class
es, как правило, используют меньше памяти, чем array
s. stdClass
с другой стороны, это самый медленный из трех вариантов, который также использует больше всего памяти.
(object)['foo'=>'bar']
. Полученное значение имеет классStdClass
, будет полностью закодировано в JSON-коде,json_encode()
и свойства можно будет переименовывать так же легко, как индексы массива (что не всегда так просто, когда к нему обращаются косвенно через переменную). Однако существуют разные операции с такими значениями; например, у вас нет объединений объектов, так как у вас есть объединения массивов, и вы не можете напрямую использоватьarray_*()
функции.