Newsgroup: it.comp.www.php
Titolo: orm

Salve 
Tempo fa avevo chiesto se qualcuno conoscesse una libreria che permette 
di tirar fuori nel result set di una query direttamente oggetti? O 
trasformi il result set in oggetti...
Cioè immaginiamo di avere un db con una tabella utente, se faccio una
"SELECT * FROM utente" vorrei che mi restituisse una lista/array/oggetto 
di oggetti utente con una serie di metodi get che corrispondono ai campi 
della tabella e che restituiscono il valore della tupla corrispondente!
Esistono framework che implementano già questo, ma per usarli dovrei 
imparare a usare il framework stesso, e volevo provare a scrivere io 
quello che mi serviva:
ma ora la mia domanda è:
immaginiamo che la tabella utente ha 3 campi nome, cognome, data di 
nascita, in teoria il mio oggetto utente dovrà avere 3 metodi get per 
ottenere questi campi e 3 metodi set per impostarli ad altri valori, ma 
come faccio a creare uno script che crea tali metodi in automatico, cioè 
su mysql nella tabella information_schema posso tirare fuori tutte le 
info sui campi, ma poi come creo il getNome o il getCampo1 ecc... 
dinamicamente? Magari mantenedo il nome del campo?
Grazie

 dinamicamente? Magari mantenedo il nome del campo?
Puoi usare il magic method __call() per intercettare quando viene chiamato 
un getter non definito, e prendere i valori da un array privato della 
classe che riempi durante il fetch ma, come dicevo sopra, sei sicuro di 
averne bisogno?
Bye.

il mio intento è quello di provare a fare in php quello che solitamente 
si fa in java, a quel punto non conviene usare my_fetch_array?
quale sarebbe il vantaggio?
Grazie



Quota bene, per favore.
In java, di solito, si fa come dice il framework che usi, per quel poco 
che ho visto. :)
Trovo comunque sbagliato cercare di fare in un linguaggio cio` che si fa 
con un altro (non il risultato finale, proprio il procedimento).
Chiediti: ti serve davvero l'ORM (che comunque non e` il banale creare 
getter e setter) o puoi fare in altri modi?
Bye.

 getter e setter) o puoi fare in altri modi?
forse no, allo stato attuale le competenze che ho mi permettono di fare 
in php senza usare oggetti tutto quello che mi serve, era per fare 
qualcosa di nuovo!
grazie mille in ogni caso per le risposte, ma tornando al discorso del 
fetch, l'uso di uno dei 2 non ha implicazioni su performance o altro, 
cioè cosa può farmi pensare di usare uno invece dell'altro?
Ancora grazie

 cioè cosa può farmi pensare di usare uno invece dell'altro?
L'object e` un po' piu` lento dell'array, e personalmente non lo uso mai 
anche perche` meno flessibile (non puoi farci un foreach, per esempio).
Bye.

 anche perche` meno flessibile (non puoi farci un foreach, per esempio).
ok, mi sembra che avevo letto qualcosa in merito!
Grazie

 vantaggio, per ogni progetto deve essere riprogrammato! :(
Parti camminando, poi inizia a correre, e poi a saltare. Non iniziare a 
saltare come prima cosa. ;)
Vedi sopra per una (schifida) implementazione.
 
Bye.

mmm...
spunto di riflessione... :P
grazie

 in Java. Nessun altro linguaggio che supporti la OOP li usa/consiglia.
sei sicuro ? non è corretto.
Linguaggio di programmazione e metodologia di programmazione sono due cose 
diverse.
Usare i getter/setter in java non lo dice il linguaggio, nè tantomeno lo 
obbliga.
Se vuoi in java puoi fare a meno di usare getter e setter, basta che 
dichiari i campi public e li usi direttamente.
I getter / setter si usano per ottenere il cosidetto "incapsulamento": cioè 
mantieni lo stato dell'oggetto in campi private, e ne gestisci l'accesso 
solo mediante i getter/setter (information hiding).
Questo ti consente di avere un unico e noto punto di ingresso verso i campi, 
dove puoi ad esempio tanto per dire inserire del comportamento.
E questo non ha a che vedere con lo specifico *linguaggio* di 
programmazione, ma è un concetto di *programmazione*.
Ciò premesso.
Se non ti serve non lo fai. Posso supporre che un'applicazione semplice può 
fare a meno di usare getter/setter. Ma se un domani vorrai inserire del 
comportamento aggiuntivo quando accedi ai campi di un oggetto, potresti 
trovarti male a non avere getter/setter.
Ma se non ti serve non lo fai, ed è più semplice. C'è sempre un compromesso, 
e le cose si fanno quando servono o se si pensa che potranno servire in 
futuro.

 quando servono o se si pensa che potranno servire in futuro.
La differenza e` che in PHP/Python non devo fare refactoring quando non 
metto setter e getter, mentre in Java si`, quindi un programmatore Java, 
per evitare la rogna del refactoring (che potrebbe cannare anche con un 
tool automatico come Eclipse) mette sempre getter e setter.
Buona parte dei tool di generazione automatica del codice, da UML per 
esempio, creano da soli getter e setter, senza nemmeno chiedertelo.
E` questo che intendevo quando dicevo che Java li usa/consiglia. Anzi, 
direi che li raccomanda.
Per questo dicevo di non voler programmare in PHP come fosse Java.
Bye.

 $c.valore = 10;
Scusate, troppo language switching ultimamente. :)
Intendevo $c->valore = 10;
Bye.

> Lo so, ma lo devi fare appunto perche` in Java non hai magic methods.
ok ho capito meglio cosa volevi dire, ma comunque io la vedo più dal punto 
di vista "filosofico" e non legato al linguaggio.
Nel senso che, come dicevo, l'uso dei get/set è legato al concetto di 
programmazione dell' "encapsulation".
E se stai seguendo un paradigma di programmazione a oggetti e hai 
un'applicazione piuttosto complessa tipicamente "ti pari il culo" e metti 
getter e setter.
Il resto sono dettagli tecnici legati allo specifico linguaggio. I costrutti 
specifici dipendono dal linguaggio, è corretto, ma la metodologia no. Del 
resto mica chi programma in Java sta automaticamente programmando a oggetti 
solo perchè sta usando le classi ;-)
I magic methods di php e la possibilità di assegnare variabili non 
dichiarate dal mio punto di vista è una bella cosa ma può anche essere un 
pericolo, pensaci un attimo ;-)