PHP ist eine gemischte Paradigmasprache, mit der Datentypen, die keine Objekte sind, wie z. B. Arrays, verwendet und zurückgegeben werden können. Ich stelle eine Frage, um zu versuchen, einige Richtlinien für die Auswahl von Arrays gegenüber Objekten zu klären, wenn ich mich für ein Programmierkonstrukt in einer bestimmten Situation entscheide.
Dies ist wirklich eine Frage zu Möglichkeiten, Daten mithilfe von PHP-Sprachkonstrukten zu codieren, und zu der Frage, ob eine Möglichkeit für die Datenübermittlung (d. H. Serviceorientierte Architektur oder Webservices) wahrscheinlicher als eine andere gewählt werden soll.
Beispiel
Angenommen, Sie haben einen Artikeltyp bestehend aus {cost, name, part_number, item_count}. Ihr Programm fordert die Anzeige mehrerer solcher Elementtypen an, in denen Sie ein Array als äußeren Container für die einzelnen Elementtypen verwenden möchten. [Sie können auch PHP ArrayObject
für das OO-Paradigma verwenden, aber meine Frage bezieht sich nicht auf dieses (äußere) Array]. Meine Frage ist, wie die Artikeltypdaten zu codieren sind und welches Paradigma zu verwenden ist. Mit PHP können Sie PHP Native Arrays
oder verwenden PHP Objects
.
Ich kann solche Daten auf zwei Arten kodieren:
//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) {..}
}
Was ich denke
Die Array-Codierung ist leicht und JSON-fähiger, kann jedoch leichter durcheinander gebracht werden. Wenn Sie einen der assoziativen Array-Schlüssel falsch schreiben, liegt möglicherweise ein Fehler vor, der schwerer abzufangen ist. Aber es ist auch einfacher, aus einer Laune heraus zu wechseln. Angenommen, ich möchte nicht item_count
mehr speichern , ich kann jede Textverarbeitungssoftware verwenden, um auf einfache Weise alle item_count
Instanzen im Array zu entfernen und dann andere Funktionen zu aktualisieren, die sie entsprechend verwenden. Es mag ein langwieriger Prozess sein, aber es ist einfach.
Die objektorientierte Codierung ruft die IDE- und PHP-Sprachfunktionen auf und erleichtert das Abfangen von Fehlern im Voraus, ist jedoch in erster Linie schwieriger zu programmieren und zu codieren. Ich sage es härter, weil Sie ein wenig über Ihre Objekte nachdenken und vorausdenken müssen und die OO-Codierung eine etwas höhere kognitive Belastung erfordert als das Schreiben von Array-Strukturen. Das heißt, wenn es einmal codiert ist, können einige Änderungen in gewissem Sinne einfacher implementiert werden, da zum Entfernen item_count
beispielsweise weniger Codezeilen erforderlich sind. Änderungen selbst können jedoch im Vergleich zur Array-Methode noch eine höhere kognitive Belastung erfordern, da übergeordnete OO-Einrichtungen beteiligt sind.
Frage
In einigen Fällen ist es klar, wie in Fällen, in denen ich Manipulationen an den Daten vornehmen muss. In einigen Fällen, in denen ich nur ein paar Zeilen mit "Artikeltyp" -Daten speichern muss, kann ich mich nicht auf klare Richtlinien oder Überlegungen stützen, um zu entscheiden, ob Arrays verwendet oder Objekte erstellt werden sollen. Es scheint, als könnte ich einfach eine Münze werfen und eine auswählen. Ist das hier der Fall?
array
, 2: User-defined Class
, 3: stdClass
. Die Leistung in Bezug auf die Geschwindigkeit ist im Vergleich array
mit a User-defined class
(wie z. B. Ihrer ItemType
) ziemlich gleich , aber definierte class
es belegen tendenziell weniger Speicher als array
s. stdClass
Auf der anderen Seite ist die langsamste der drei Optionen und verwendet auch den meisten Speicher.
(object)['foo'=>'bar']
. Der resultierende Wert hat die KlasseStdClass
, wird in seiner Gesamtheit von JSON-codiertjson_encode()
und Eigenschaften können genauso einfach umbenannt werden wie Array-Indizes (was nicht immer so einfach ist, wenn indirekt über eine Variable darauf zugegriffen wird). Es gibt jedoch unterschiedliche Operationen für solche Werte. Sie haben beispielsweise keine Objekt-Unions, wie Sie Array-Unions haben, und Sie können diearray_*()
Funktionen nicht direkt verwenden .