Come faccio a passare i dati in modo orientato agli oggetti in PHP?


11

Trovo che anche quando lavoro con un framework MVC (ad esempio CodeIgniter), ricorro regolarmente a matrici nidificate anziché a oggetti.

Ciò non segue la mia comprensione del bene orientato agli oggetti. Ad esempio, se dovessi trasferire il codice su Java, non mi sognerei di passare array (o vettori o altro) in quel modo.

Mi chiedevo se questo è il modo appropriato di gestire i dati. C'è un motivo per cui gli array vengono passati in questo modo in PHP o perché gli oggetti non vengono utilizzati? Qual è il modo migliore per trasferire i dati?

Risposte:


8

Non confondere OO di Java con PHP. Java è un linguaggio a paradigma singolo che significa che fa solo OO. PHP d'altra parte è un linguaggio multi paradigma, puoi fare la programmazione funzionale o OO o entrambi.

Ora non esiste una "cattiva" implementazione di OO. OO di Java non è un'implementazione definitiva che ogni altra lingua dovrebbe o deve seguire. Ci sono alcuni concetti definitivi, ed entrambi i linguaggi li implementano completamente a modo loro (Java dall'inizio, PHP dalla versione 5).

Quindi, per rispondere alla tua domanda: cosa fa CI e cosa stai facendo è giusto nel mondo PHP. Le matrici di PHP sono una delle sue strutture più flessibili e utili ed è effettivamente una buona cosa usare le matrici sugli oggetti quando i tuoi dati sono solo informazioni (non portare la logica con loro). Il codice OO completo non è la stessa cosa di "solo codice OO".

Se stai iniziando con PHP, usa Java come riferimento per le buone pratiche OO ma non limita la tua comprensione di PHP a causa della cosa "Java fa diversamente". Puoi davvero rovinare entrambi, il paradigma non ti salverà se non capisci i concetti.

Se in ogni caso trovi Java più di tuo gradimento (come preferenza personale) dai un'occhiata a Ruby per lo sviluppo web, sono un po 'più strettamente correlati.


Perché non dovremmo confondere Java OO con PHP OO? Sono praticamente uguali, tranne per il fatto che PHP ha un tipo di dati array / hash nativo.
Martin Wickman,

Le implementazioni sono abbastanza simili. Mi riferivo al modo in cui vengono utilizzati in entrambe le lingue.
yannis,

Ho un problema con OOP. Voglio creare il design OOP per un'applicazione (base PHP), in cui un oggetto dipenderà da altri oggetti. Come posso gestirlo in PHP? per favore aiutami ...
Imran Khan,

Scenario di esempio: l'oggetto hotel ha oggetti Room, dove un oggetto room deve avere oggetti Date ... e un oggetto Date ha prezzi per i tipi di persona. Ora come gestire questo tipo di scenario in PHP dalla base OOP (perché ci sono dati di grandi dimensioni che devono essere elaborati ad ogni livello).
Imran Khan,

@Walter sto aspettando la tua risposta .... per favore aiutami.
Imran Khan,

2

Usando oggetti invece di array solo perché i suoi oggetti non sono paradigma OO, sono solo preferenze personali :)

Oggetti fornisce un pratico completamento del codice in IDE, è possibile utilizzare le interfacce (tipo di suggerimento) e l'ereditarietà.

Se vuoi usare oggetti invece di array perché vedi qualche vantaggio - usali, ma se vuoi usarli solo perché sono oggetti - non perdere tempo con questo refactoring :)


"L' uso degli oggetti così come gli array richiederà più memoria e CPU. " Questo non è (sempre) vero. Un oggetto che contiene la stessa quantità di dati con un array occuperà quasi esattamente la stessa quantità di memoria.
yannis,

@Yannis Rizos, sì, anche gli oggetti possono usare meno memoria, modificati.
OZ_

Non è solo che possono usare meno memoria, è che il loro uso della memoria è irrilevante perché è banale rispetto ad altri aspetti delle prestazioni di memoria del sistema e ai vantaggi dell'uso degli oggetti. Se ci tenessimo così tanto all'utilizzo della memoria, non useremmo mai gli oggetti. Ciò a cui teniamo è che gli oggetti ci forniscano strumenti migliori per ragionare e costruire sistemi.
Rein Henrichs,

@Rein Henrichs, lo so, grazie. Ecco perché tutte le parole su "memoria" sono state rimosse dalla mia risposta. Non sto cercando di fare una stupida ottimizzazione, ma sono sicuro che objects just because they are objectsnon è un motivo per il refactoring :) Leggi la mia risposta, non solo i commenti.
OZ_

abbastanza giusto, ho commentato prima delle modifiche.
Rein Henrichs,

1

In realtà non si trasmettono dati in un sistema OO, si passano oggetti in giro. La differenza è che gli oggetti contengono comportamento e dati. Ecco perché lo chiamano orientato agli oggetti e non orientato ai dati.

Finché non hai bisogno di un comportamento con i tuoi dati, allora i vecchi array php semplici sono altrettanto buoni (o cattivi, a seconda del punto di vista) degli oggetti valore.


0

Penso che questa sia solo una questione di adattamento - ci sono molte implementazioni di "oggetti" nella programmazione - Python e Javascript hanno proprietà sorprendentemente diverse. PHP OO è probabilmente un hack - le matrici PHP non sono "oggetti" nel senso tradizionale - ma hanno uno scopo ovvio. A meno che tu non desideri che i dati abbiano un COMPORTAMENTO personalizzato, allora perché usare un oggetto?

MODIFICARE:

re: oggetti valore immutabili

http://bradley-holt.com/2010/09/immutable-value-objects-in-php/


Per dare ai dati una struttura affidabile. Sì, posso costruire una funzione che genera un particolare formato / annidamento dell'array ma chi può dire che non scrivo un'altra funzione che lo modifica leggermente e poi lo trasmette.
Matteo,

1
certo - allora avresti bisogno di un oggetto per proteggere l'accesso variabile - dal momento che non ci sono equivalenti PHP di tuple Python per esempio. Ma ecco qua: hai definito il problema, devi solo usare i costrutti disponibili per la lingua ... o semplicemente imparare a convivere con le sue "stranezze". Ho aggiunto un link al mio post iniziale che contiene un'interessante discussione sul problema.
Sunwukung,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.