PHP jest mieszanym językiem paradygmatu, umożliwiającym używanie i zwracanie nieobiektywnych typów danych, takich jak tablice. Zadaję pytanie, aby spróbować wyjaśnić niektóre wytyczne dotyczące wyboru tablic vs obiektów przy podejmowaniu decyzji, jaką konstrukcję programistyczną zastosować w konkretnej sytuacji.
To jest naprawdę pytanie o sposoby kodowania danych za pomocą konstrukcji języka PHP i kiedy bardziej prawdopodobne jest wybranie jednego ze sposobów w celu przekazywania danych (tj. Architektura zorientowana na usługi lub usługi sieciowe).
Przykład
Załóżmy, że masz typ elementu składający się z {koszt, nazwa, numer części, liczba pozycji}. Twój program wymaga wyświetlenia kilku takich typów elementów, w przypadku gdy zdecydujesz się użyć tablicy jako zewnętrznego kontenera do przechowywania każdego z tych typów elementów. [Możesz także użyć PHP ArrayObject
do paradygmatu OO, ale moje pytanie nie dotyczy tej (zewnętrznej) tablicy]. Moje pytanie dotyczy tego, jak zakodować dane typu elementu i jaki paradygmat zastosować. PHP pozwala na użycie PHP Native Arrays
lub PHP Objects
.
Mogę tutaj zakodować takie dane na dwa sposoby:
//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
),
);
vs
//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) {..}
}
Co ja mysle
Kodowanie tablic jest lekkie i bardziej przystosowane do JSON, ale może być łatwiejsze do zepsucia. Błędnie przeliteruj jeden z kluczy tablicy asocjacyjnej i możesz napotkać błąd trudniejszy do uchwycenia. Ale łatwiej jest również zmienić kaprys. Powiedzmy, że nie chcę item_count
już przechowywać , mogę użyć dowolnego oprogramowania do przetwarzania tekstu, aby łatwo usunąć wszystkie item_count
wystąpienia w tablicy, a następnie zaktualizować inne funkcje, które z niego korzystają. Może to być bardziej żmudny proces, ale jest prosty.
Kodowanie obiektowe wywołuje funkcje języka IDE i PHP i ułatwia wcześniejsze wykrycie błędów, ale przede wszystkim trudniej jest je programować i kodować. Mówię mocniej, ponieważ musisz trochę pomyśleć o swoich obiektach, myśleć z wyprzedzeniem, a kodowanie OO wymaga nieco większego obciążenia poznawczego niż pisanie struktur tablicowych. To powiedziawszy, po zakodowaniu niektóre zmiany mogą być łatwiejsze do wdrożenia, w pewnym sensie, że usunięcie item_count
, na przykład, wymagać będzie zmiany mniejszej liczby wierszy kodu. Jednak same zmiany mogą nadal wymagać większego obciążenia poznawczego w porównaniu z metodą tablicową, ponieważ w grę wchodzą urządzenia OO wyższego poziomu.
Pytanie
W niektórych przypadkach jest to jasne, jak w przypadkach, w których będę musiał wykonywać manipulacje na danych. Ale w niektórych przypadkach, gdy muszę po prostu przechowywać kilka wierszy danych „Typu przedmiotu”, nie mam jasnych wytycznych ani rozważań, na których mogę się oprzeć przy podejmowaniu decyzji, czy użyć tablic, czy też zbudować obiekty. Wygląda na to, że mogę rzucić monetą i wybrać jedną. Czy tak jest w tym przypadku?
array
, 2: User-defined Class
, 3: stdClass
. Wydajność pod względem prędkości jest prawie taka sama podczas porównywania array
i a User-defined class
(jak twoje ItemType
), ale zdefiniowane class
es zwykle zużywają mniej pamięci niż array
s. stdClass
z drugiej strony jest najwolniejsza z trzech opcji i zużywa najwięcej pamięci.
(object)['foo'=>'bar']
. Wynikowa wartość ma klasęStdClass
, zostanie w całości zakodowana w JSON,json_encode()
a nazwy właściwości można zmienić tak łatwo, jak indeksy tablic (co nie zawsze jest takie łatwe, gdy dostęp do nich jest pośrednio przez zmienną). Istnieją jednak różne operacje na takich wartościach; na przykład nie masz związków obiektowych, ponieważ masz związki tablicowe i nie możesz bezpośrednio korzystać zarray_*()
funkcji.