PHP - це змішана мова парадигми, що дозволяє використовувати та повертати необ'єктивні типи даних, наприклад масиви. Я ставлю запитання, щоб спробувати уточнити деякі вказівки щодо вибору масивів проти об’єктів, вирішуючи, яку програмування побудувати для конкретної ситуації.
Це справді питання про способи кодування даних за допомогою конструкцій мови PHP та коли з більшою ймовірністю можна вибрати один із інших для цілей передачі даних (тобто, орієнтована на сервісну архітектуру чи веб-сервіси).
Приклад
Припустимо, у вас є тип предмета, що складається з {вартість, ім'я, номер_посередництва, номер_об'єкта}. Ваша програма вимагає відображення декількох таких типів елементів, до яких ви вирішите використовувати масив як зовнішній контейнер для зберігання кожного з типів елементів. [Ви також можете використовувати 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 та полегшує заздалегідь зафіксування будь-яких помилок, але важче програмувати та кодувати в першу чергу. Я говорю важче, тому що ви повинні трохи подумати над своїми об'єктами, заздалегідь задумайтеся, і кодування OO займає трохи більшу пізнавальну навантаження, ніж введення структур масивів. Однак, після того, як це закодовано, деякі зміни, можливо, простіше здійснити, в певному сенсі, що для видалення item_count
, наприклад, потрібно буде змінити менше рядків коду. Але самі зміни все ж можуть вимагати більшого когнітивного навантаження порівняно з методом масиву, оскільки задіяні засоби вищого рівня.
Питання
У деяких випадках це зрозуміло, як у випадках, коли мені потрібно буде виконати маніпуляції над даними. Але в деяких випадках, коли мені потрібно просто зберегти кілька рядків даних "Тип предмета", я не маю чітких вказівок або міркувань, на яких слід спиратися, чи потрібно використовувати масиви чи будувати об'єкти. Здається, я можу просто кинути монету і забрати її. Це так?
array
, 2: User-defined Class
, 3: stdClass
. Продуктивність за швидкістю майже однакова при порівнянні array
та User-defined class
(наприклад, вашій ItemType
), але визначені class
es, як правило, використовують менше пам'яті, ніж використання array
s. stdClass
з іншого боку, найповільніший з трьох варіантів, а також використовує найбільшу кількість пам'яті.
(object)['foo'=>'bar']
. Отримане значення має класStdClass
, буде кодовано JSON у повному обсязі,json_encode()
а властивості можна перейменовувати так само легко, як і індекси масиву (що не завжди так просто, коли до нього можна отримати опосередковано через змінну). Однак існують різні операції з такими значеннями; наприклад, у вас немає об'єктних об'єднань, оскільки у вас є об'єднання масивів, і ви не можете безпосередньо використовуватиarray_*()
функції.