PHP è un linguaggio di paradigma misto, che consente di utilizzare e restituire tipi di dati non oggetto, come gli array. Pongo una domanda per cercare di chiarire alcune linee guida per la selezione di matrici contro oggetti quando decido quale costrutto di programmazione usare in una particolare situazione.
Questa è davvero una domanda sui modi per codificare i dati usando i costrutti del linguaggio PHP e quando è più probabile che un modo sia scelto su un altro per scopi di trasferimento dei dati (ovvero architettura orientata ai servizi o servizi web).
Esempio
Supponiamo di avere un tipo di articolo costituito da {costo, nome, numero_part, numero_articolo}. Il programma richiede la visualizzazione di diversi di questi tipi di elementi, in cui si decide di utilizzare un array come contenitore esterno per contenere ciascuno dei tipi di elementi. [Puoi anche usare i PHP ArrayObject
per il paradigma OO, ma la mia domanda non riguarda quell'array (esterno)]. La mia domanda è su come codificare i dati del tipo di elemento e su quale paradigma usare. PHP ti permette di usare PHP Native Arrays
o PHP Objects
.
Posso codificare tali dati, in due modi qui, in questo modo:
//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) {..}
}
Quello che sto pensando
La codifica dell'array è leggera e più predisposta per JSON, ma può essere più facile da confondere. Digitare erroneamente una delle chiavi dell'array associativo e si potrebbe avere un errore che è più difficile da rilevare. Ma è anche più facile cambiare per capriccio. Supponiamo che non voglia item_count
più archiviare , posso utilizzare qualsiasi software di elaborazione testi per rimuovere facilmente tutte le item_count
istanze dell'array e quindi aggiornare altre funzioni che lo utilizzano di conseguenza. Potrebbe essere un processo più noioso, ma è semplice.
La codifica orientata agli oggetti fa appello alle strutture del linguaggio IDE e PHP e facilita la rilevazione preventiva di eventuali errori, ma è più difficile programmare e codificare in primo luogo. Dico di più, perché devi pensare un po 'ai tuoi oggetti, pensare in anticipo e la codifica OO richiede un carico cognitivo un po' più elevato rispetto alla digitazione di strutture di array. Detto questo, una volta codificato, alcune modifiche potrebbero essere più facili da implementare, in un certo senso, la rimozione item_count
, ad esempio, richiederà la modifica di meno righe di codice. Ma i cambiamenti stessi possono ancora richiedere un carico cognitivo più elevato rispetto al metodo array, poiché sono coinvolte strutture OO di livello superiore.
Domanda
In alcuni casi è chiaro, come i casi in cui dovrò eseguire manipolazioni sui dati. Ma in alcuni casi, dove devo solo memorizzare alcune righe di dati "Tipo di elemento", non ho linee guida chiare o considerazioni su cui basarmi quando provo a decidere se usare gli array o se costruire oggetti. Sembra che posso semplicemente lanciare una moneta e sceglierne una. È questo il caso qui?
array
, 2: User-defined Class
, 3: stdClass
. Le prestazioni in termini di velocità sono praticamente le stesse durante il confronto array
e un User-defined class
(come il tuo ItemType
), ma definiti class
es tendono a usare meno memoria rispetto all'utilizzo di array
s. stdClass
d'altra parte è la più lenta delle tre opzioni e utilizza anche la maggior quantità di memoria.
(object)['foo'=>'bar']
. Il valore risultante ha classeStdClass
, sarà codificato JSON nella sua interezza dajson_encode()
e le proprietà possono essere rinominate con la stessa facilità degli indici di array (che non è sempre così facile, quando si accede indirettamente tramite una variabile). Tuttavia, ci sono diverse operazioni su tali valori; ad esempio, non si hanno unioni di oggetti come si hanno unioni di array e non è possibile utilizzare direttamente learray_*()
funzioni.