Newsgroup: it.comp.www.php
Titolo: overloading di funzioni

da quanto ho capito (stavolta mi sono documentato, quindi non 
brontolate) in php non č possibile fare l'overloading, quindi il 
seguente codice non č accettato:
 
class Addition {
     function test($a,$b) {}
     function test($a,$b,$c) {}
}
 
L'unica cosa da fare č:
- cambiare nome alla seconda funzione
- creare una sola funzione dichiarando 'opzionale' il terzo parametro
 
Oltre a questi, c'č qualche metodo piů 'elegante' o bisogna rassegnarsi?

 Oltre a questi, c'è qualche metodo più 'elegante' o bisogna rassegnarsi?
 
qui c'è un altro tipo di soluzione... non so se è abbastanza elegante però:
http://www.dinke.net/blog/en/2007/08/01/method-overloading-in-php5/
 

 
http://www.dinke.net/blog/en/2007/08/01/method-overloading-in-php5/
 
 
 
Parse error: syntax error, unexpected T_STRING, expecting T_FUNCTION in 
/web/htdocs/......../override.php on line 4


ma hai copiato e incollato il primo pezzo di codice proposto o quello sotto?
no perchè il primo non è php...


Eh, ma in quanto a manutenibilità non ci siamo molto secondo me, 
eleganza non stiamo neanche a parlarne
 
@OP
No, non c'è overload delle fuunzioni per ora purtroppo. Anche a me piace 
quando scrivo in java, anche se devo dire la verità che ormai la uso 
molto poco
M
 
-- 
I fatti mi cosano

SOLUZIONE 1:
 
class Addition {
 
   function test($array){}
}
 
Un solo parametro che in realtà ne contiene tutti.
 
Certo devi valutare quale uso ne farai perchè ogni volta che usi la funzione devi fare la scansione di tutti i valori dell'array.
Può essere utile nel caso in cui sai che in futuro dovrai aggiungere dei parametri.
 
Non è molto ottimale, ma in casi estremi si può usare.
 
SOLUZIONE 2:
 
Non usi parametri nelle funzioni, ma usi campi della classe.
 
class Audition {
 
private $a;
private $b;
 
   function test(){
 
    /* $this->a;
      $this->b;  */
   }
 
}
Ovvio che bisogna gestire l'accesso alle variabili altrimenti si può incappare in grave falle di sicurezza.

 eleganza non stiamo neanche a parlarne
 
sono d'accordo... infatti era lui che lo cercava, io ho solo scritto quello che ho trovato... mai usato l'overloading in php :)

 eleganza non stiamo neanche a parlarne
 
Concordo per quanto riguarda la soluzione linkata.
 
Io pero` trovo che il singolo entry-point delle funzioni PHP sia molto 
piu` manutenibile del multiplo di Java, che non mi manca proprio per 
niente (sono costretto a usarlo quando sviluppo su Android, e ogni volta 
mi incazzo perche` non capisco dove sta l'errore, finche` non mi accordo 
di essere nel corpo della funzione sbagliata...).
 
Bye.

 no perchè il primo non è php...
 
si ho fatto un po' di confusione.
Cmq vabè, adesso sono sicuro in php non è implementato (almeno non per 
ora) un vero sistema per l'overloading, e bisogna per forza usare 
espedienti "fantasiosi"...

 Non usi parametri nelle funzioni, ma usi campi della classe.
 
si, solo che il tutto poi tende a diventare troppo macchinoso ;)
Vabè con php in questi casi bisogna reinventare la ruota...

 con php in questi casi bisogna reinventare la ruota...
 
No, non devi reinventare la ruota. Devi usare il linguaggio secondo le 
sue caratteristiche, e non cercare di forzare i workflow di altri 
linguaggio in questo.
 
Nessuno si sogna di programmare OOP in Lisp o in Haskell.
 
Bye.

 linguaggio in questo.
 
volevo dire che non esistendo l'overloading, bisogna "purtroppo" 
ingegnarsi in modo alternativo.
Tutto qui!!!

 ingegnarsi in modo alternativo.
 
Oppure attribuire dei nomi ragionevoli alle funzioni.


class test{
function showArticle($text){
echo $text;
}
 
function showArticle($text, $author) {
$this->showArticle($text);
echo $author;
}
}
 
Alla seconda function che nome attribuisco?

 Alla seconda function che nome attribuisco?
 
public function showArticle($text, $author='')
{
 echo $test . $author;
}
 

 Alla seconda function che nome attribuisco?
 
showArticleAndEchoAuthor

 }
 
eh si, funziona... ma l'eleganza? :D

 eh si, funziona... ma l'eleganza? :D
 
ehehehh infatti...
Se ad esempio volessi eseguire una determinata azione solo quando 
l'author è specificato devo per forza ricorrere ad un if ...bla bla bla...
Avendo invece l'overloading a disposizione ciò non sarebbe necessario ;)


semmai showArticleAndShowAuthor oppure echoArticleAndEchoAuthor.
Chi ha una certa esperienza in programmazione certe incoerenze le nota ;)

 semmai showArticleAndShowAuthor oppure echoArticleAndEchoAuthor.
 
No, visto che il corpo della funzione in questione richiama 
showArticle() e poi chiama un echo esplicito, showArticle() non è detto 
che faccia output.


Ownage :)



ero sarcastico ovviamente... se devo risolvere un problema lo faccio nel modo più pratico possibile e l'eleganza fine a se stessa la lascio in secondo piano... l'eleganza a tutti i costi senza poi risolvere il problema non mi fa mangiare a fine mese. :)

 ero sarcastico ovviamente... se devo risolvere un problema lo faccio nel modo più pratico possibile e l'eleganza fine a se stessa la lascio in secondo piano... l'eleganza a tutti i costi senza poi risolvere il problema non mi fa mangiare a fine mese.:)
 
certamente, ma prima di ricorrere ai rimedi "estremi" si cerca sempre di 
trovare soluzioni soft.
Tentar non nuoce, ed è anche un modo per allargare le conoscenze ;)

alex scriveva il 16/01/2012 :

CHE PALLE ALEX!!!
io sarei curioso...stracurioso ...iperCurioso...di vedere un tuo codice 
in VB.net per vedere se è tutto questo "mare" di eleganza che reclami 
per il PHP!
L'eleganza in programmazione spesso non è sinonimo di praticità!
 
come saprai dal .Net ci sarà un metodo che è considerato "generale" 
(non te lo chiamo base per non farti confuzzzz...ronf...zzzione con 
l'ereditarietà)
 
Ad esempio
1)RiempiArrayDaDB($nomeVista)
2)RiempiArrayDaDB($txtsql)
3)RiempiArrayDaDB($txtsql,$parserDati)
4)RiempiArrayDaDB($txtsql,$parserDati,$creaLog)
 
1) Do solo il nome dell'array e mi carica i dati
2) Do una query sql e mi carica i dati di quella query nell'array
3) Do una query sql ed i risultati me li controlla prima di scriverli 
nell'array (ad esempio mi scrive un * nelle stringhe nulle o un bel 0 
nei numeri)
4) come 3 ma mi crea anche un log dell'avvenuta operazione
 
Soluzioni...
Anche in NET posso al posto dell'overloading creare tanti 
metodi...l'overloading è comodo (NON ELEGANTE...COMODO) per scrivere 
MENO codice ...quindi UTILE non ELEGANTE!
 
Soluzione php meno elaborata ovvio!
 function 
RiempiArrayDaDB($txtsql='#nomeVista',$parserDati=false,$creaLog=false)
 
pseudo codice
if $txtsql inizia con #
   crea SQL per recuperare Vista
 else
   è una query sql...al limite trimma la stringa
end if
 
ConnettiDB
Esegui query
loop recupera dati
 if $parser == true invoca funzione
end loop
 
if $crealog == true invoca funzione
 
Chiudi DB (io lo faccio sempre esplicitamente...abitudine NET...vero!)
 
ritorna array caricato
 
ORA dimmi che ENORME DIFFERENZA c'è con (ad esempio):
 
 '********************** COSTRUTTORE start *********************
    Sub New()
        'caso particolare del più generico new sotto!
        Me.New(My.Resources.PATHPROG, "")
    End Sub
 
    Sub New(ByVal pathDatabase As String, Optional ByVal 
passwordDatabase As String = "")
.......
 
Considera il PHP come un lingaggio che unisce queste 2 sub in una unica 
function
 
poi...e ovvio che
pippo(stringa)
pippo(intero)
pippo(immagine)
pippo(streamfile)
pippo(miaClasse)
va trattato un po diversamente in PHP...essendo anche tipizzato 
diversamente...ma si può fare!
 
CONCLUSIONE:
io personalmente starei attento a definire INELEGANTE il lavoro di 
altri.
Perchè per definire INELEGANTE una cosa...bisogna essere MAESTRI di 
stile (e un maestro di stile è sempre opinabile).
ORA io non lo sono...come te vengo dal NET...non essendo scemo ... VEDO 
le differenze tra PHP e dotNet..!
Ma siccome non ho anni di esperienza di sviluppo php sulle spalle...mi 
perito ALQUANTO a "spregiare" l'ambiente di sviluppo di altri!
 
Su ICLVB c'abbiamo il nostro amato John che spara cazzate a raffica su 
dotNet in generale e VB.net in particolare e rimpiange python e 
php...regolarmente viene impallinato da chi ne sa più di lui!
Non avendo voglia di documentarsi...programma "a caso"...e poi intasa 
il NG di "non funziona..."  "che schifo..." "Ma possibile....che..."
gli dai la soluzione.....copia e incolla...cambia qualcosa (sospettiamo 
a caso)...e poi rimpesta il ng "...il codice che mi date non 
funziona...." "che schifo..." ...e via flame infiniti!(John è ottimo 
per sfogarsi...costa meno di un caffe...e non ha la caffeina!)
 
 
....chissà come mai...sento aria di casa anche qui! B-) eh eh
 
-- 
----- Italliaaaaa 3227! -----
Please, visits website, but please visit Italy. We’re t’best country in 
the world in terms of: Culture, Landscapes, Arts, History, Cities, 
Villages, Beautiful countryside, seaside, mountains. That is Italy. You 
know, perhaps, you dreaming about. But please, visit or country. We 
will welcome you warmly and with a better organization.
(Francesco Rutelli Video a: 
http://www.martek.it/dblog/mostraVideo.asp?p=/public/dblog/Rutelli1.wmv
 
)
 
 

 L'eleganza in programmazione spesso non è sinonimo di praticità!
 
QUOTO!!!

 necessario ;)
 
Io trovo piu` elegante avere un singolo entry point (e un singolo exit 
point) per funzione, piuttosto che diversi.
 
Se un if li` dentro mi fa risparmiare di avere due funzioni che fanno 
quasi la stessa cosa, amo l'if. :P
 
Piuttosto spezzo il corpo della funzione in altre funzioni che non 
pubblicizzo come API.
 
public function showArticle($text, $author=null)
{
 echo $text;
 if ( ! is_null($author)) {
  $this->showAuthor($author);
 }
}
 
public function showAuthor($author)
{
 echo $author;
}
 
Si`, mi sono letto The Pragratic Programmer e sto cercando di farne il 
mio stile di vita (da programmatore) :)
 
Bye.

 }
 
e se quando specifico l'autore volessi specificare anche la data di 
pubblicazione?
function showArticle($text, $author=null, $pudDate=null)
 
Si, ma se quando chiamo la funzione mi dimentico di specificare il terzo 
parametro me ne accorgerei solo in fase di running; ammesso che la 
chiamata venga effettuata.
 
Ci potrebbe infatti essere una condizione:
if (isset($_GET['nome'])) showArticle('a','b')
 
Per cui finchè nessuno specificherà quel 'nome', l'errore resterà celato :-(
 
Mi dispiace ma su certi punti non andremo mai d'accordo ;)


questo spesso è vero, ma altrettanto spesso è vero che la troppa 
praticità, va a discapito della stabilità.
 
Se specialmente devo scrivere del codice che verrà riutilizzato in più 
progetti, invece di fare il 'praticone', preferisco perdere qualche ora 
in più, strutturandolo (nei limiti del possibile) in modo tale che 
l'utilizzatore (spesso io stesso), possa accorgersi di eventuali errori, 
dimenticanze, ecc., in fase di design-time.
Ho fatto un esempio pratico rispondendo ad Alessandro...

 Mi dispiace ma su certi punti non andremo mai d'accordo ;)
 
E` probabile. Oppure magari cominci a entrare nella logica dei linguaggi 
dinamici (e a tipizzazione dinamica) e cambi idea quando usi PHP, per 
rimanere della tua idea quando ne usi uno statico (o a tipizzazione 
statica).
 
Bye.
 

 Mi dispiace ma su certi punti non andremo mai d'accordo ;)
 
Parla con me allora che veniamo dal solito mondo!
quello che tu vuoi non c'entra un kaiser con l'OOP!
...tu vuoi che l'intellisense si accorga che hai passato un parametro 
dell'overload....
Ora converrai con me che in dotNet ed in Java si può fare facilmente
in javascript e php già diventa un casino!
perchè
 dim pippo as bitmap
 dim pluto as string
mi permette di fare
 
sub Stampa(dato as string)....
sub Stampa(dato as bitmap)....
 
qui tu hai
$dato....in cui c'è tutto
lo tradurresti con
dim dato as Object
...o fallo un overload con Object anche in C# o Vb.net
guarda se non sarebbe un bagno di sangue di
If TypeOf dato Is mioOggetto Then e via andare!
 
per me ...E LO RIPETO ANCORA..e ancora...e ancora...e ancora...(prima o 
poi lo capirà)....e ancora...e ancora...
IL VOLER A TUTTI I COSTI affrontare una cosa diversa con i parametri 
che hai acquisito! SE NON RESETTI non ci capisci nulla!
il tuo PECCATO originale è:
DI LA' hai un linguaggio ESTREMAMENTE tipizzato
QUI un linguaggio SCARSAMENTE tipizzato
 
Se poi vieni dal VB.net hai anche un livello di formalismo esasperato 
(più del C#)....QUI vige la libertà quasi assoluta!
NON PUOI applicare le regole di formalismo che hai acquisito di LA'!
per farti un esempio:
Non puoi interpretare un quadro di KLIMT con i soliti schemi formali di 
un quadro di GIOTTO!
 
Ed allora?
IN PHP che faccio?
Allora semplicemente hai 2 strade
1) Come ti han detto "atomizzi" ....non usi l'overload ed usi 3 4 5 6 7 
8 n funzioni con nome diverso ...
2) Usi php come hai tempi del VB4
   function pippo($datofisso, $arrayopzioni)
stabilisci una regola e assegni ad un array associativo tutte le 
variazioni che vorresti nell'overload...
quindi avro ad esempio $arrayopzioni['nomefile'] o VUOTO(o con un 
valore che per te è "vuoto") o riempito con il dato che ti interessa!
Considerando che in php puoi anche mettere riferimenti a funzioni...mi 
sembra estremamente potente una cosa del genere...traduco...di non 
ALTRETTANTA immediatezza in C# o vb.Net dove bisogna spippolare con 
delegate o reflection ed amenità varie!
 
Spero di averti chiarito una volta per tutte le idee....considero 
sempre la tua posizione inutilmente testona...alla "capra sarda" per 
dirla tutta!
Hai un ambiente gratis ...JAVA...che ti permetterebbe di non buttar via 
nulla e di non far tutta questa fatica...ma ti intestardisci, in un 
atteggiamento gretto, ad applicare i tuoi pregressi schemi mentali al 
PHP...per me è inspiegabile!
 
...BOH!...aggiungo anche un ... MAH!
 
Saluti!
 
..p.s.
Come ti han già detto
Overload è soltanto una comodità che hanno alcuni linguaggi
con l'OOP non c'entra un cazzo!...solo per essere chiari! In VB6 non 
l'abbiamo mai avuto eppure abbiamo fatto gestionali per decenni!
una cosa OOP davvero...l'eredità multipla...il dotNet non ce l'ha e la 
simula con le interfacce(credo anche il java faccia così)....l'unico 
linguaggio con grande diffusione che ce l'ha è , pensa un po, il C++ 
!!!
 
-- 
----- Italliaaaaa 3227! -----
Io sono Attila:
A come atrocità,
doppia T come terremoto e tragedia,
I come ira di dio,
L come laco ti sangue
e A come adesso vengo e ti sfascio le corna!
(Diego Abatantuono "Attila Flagello di Dio")
 
 

 funzioni). Tutto sta a usarli in modo corretto.
 
si questo è giusto, stavo solo pensando che sarebbe stato utile poter 
definire delle funzioni che accettino solo 1 o 3 parametri, e non da 1 a 3.
Cmq non ho nessuna intenzione di cambiare la "religione" del php: se la 
concezione del linguaggio è questa, farò di tutto per accettarla ;)

 la tua posizione inutilmente testona...alla "capra sarda" per dirla tutta!
 
ma dai ;)
Ad ogni modo, che con php bisogna cambiare approccio, ormai l'ho capito.
Le mie sono solo disquisizioni ;)

 azz... e parlavi del risparmio sul numero di funzioni ;)
 
No, non parlavo di risparmio sul numero di funzioni. Le classi sono fatte 
apposta per contenere funzioni (relative a quell'oggetto).
 
Quando diventano troppe vanno spezzate in piu` classi.
 
Il principio e` quello della minima responsabilita`. Se le funzioni 
sull'autore diventano tante (es.: stampalo in HTML, stampalo in JSON, 
dammi lo pseudonimo, dammi l'email, ecc.), l'autore diventa una classe a 
se`, e la classe Articolo usa la classe Autore.
 
Ma questo e` refactoring che fai man mano che il progetto cresce.
 
Quello che dicevo io e` che devi avere un singolo entry point per 
funzione, quindi l'overloading (che definisce la stessa funzione, con lo 
stesso nome, ma corpo diverso, piu` volte) non mi piace.
 
Ha un senso in linguaggi a tipizzazione statica come Java, in cui, per 
esempio, per salvare dati su un DB come SQLite, o per metterli in un JSON 
o in un XML, hai bisogno di piu` versioni della stessa funzione: una per 
String, una per Integer, una per Float, ecc. ecc.
 
In PHP non serve.
 
Bye.

 "overload" con due funzioni con stesso numero di parametri...?
 
L'overload e` nato esattamente per quel motivo: stesso numero di 
parametri ma di tipo diverso.
 
Se una funzione accetta un numero diverso di parametri, probabilmente 
(non sempre, ma spesso) significa che fa due cose diverse, quindi deve 
avere due nomi diversi.
 
Bye.

 "overload" con due funzioni con stesso numero di parametri...?
 
e perchè non lo sarebbe?


BENE detto questo...chiudo il pc...sgombro la scrivania ....stacco la 
corrente...chiudo casa...espatrio...chiamo un UFO...cambio pianeta...e 
l'abbozzo qui!
La tua esperienza di dotNet/VB.net è solo fuffa quindi...
...
http://media.247sports.com/Uploads/Boards/949/70949/171521.jpg
 
...Aloha! Mi basta John su ICLVB...non cerco il clone! Lascio 
volentieri ai "santi" di ICWP  il resto della discussione e come 
risponderti!
 
Ciao Miao Bau!
 
p.s.
ehm...anche se OT....
ripassati i fondamentali di dotNet!...e di VB.net!
http://msdn.microsoft.com/it-it/library/s3tbathb.aspx
 
...ce ne è di roba da imparare prima di dare giudizi!!!



 
ho avuto una svista, pardon


ne ho contate diverse in questi ultimi giorni :D

Viste le enormi discussioni per un argomento così "innoquo" io la metteri su questo piano:
 
1) il php ha pregi e difetti -> per te è scomodo? passa ad una altro linguaggio! Ce ne sono a palate!
2) se vieni da un altro linguaggio e non trovi alcune funzioni in questo di arrivo, non tentare di cambiare il linguaggio ma il tuo modo di pensare! altrimenti vai al punto 1
3) eleganza e praticità dovrebbero andare allo stesso passo ma non sempre è possibile -> bisogna trovare un compromesso per avere il massimo della scalabilità non renderlo più leggibile a te.
4) per imparare un linguaggio da autoditatta non basta scopiazzare qua e là o leggere due post su qualche blog. Serve un libro di esperti o guide complete (dalla semplice dichiarazione di variabili in su)
5) in tutti i libri che ho letto (universitari compresi -> o'really e mc grawhill) e libri di creatori di linguaggi (es. Guido Van Rossum di Python) nessuno incoraggia l'uso di parametri in funzioni, ma solo uso di campi di classe!
Troppi parametri obbligano ad usare vecchie funzioni per nuovi progetti. La programmazione ad oggetti va a farsi fottere in questo modo...
 
Questo è un mio pensiero, puoi prenderlo come consiglio o come critica. A te la scelta! :)

 ne ho contate diverse in questi ultimi giorni :D
 
troppo lavoro!!!

 Questo è un mio pensiero, puoi prenderlo come consiglio o come critica. A te la scelta! :)
 
lo prendo come critica costruttiva ;)

pippo(), per esempio) e a indici di un array tornato (print funzione()
[5], per esempio) per PHP 5.4, ora in beta
 
Dalla 5.0 in su, ad ogni versione ci sono stati miglioramenti e aggiunte 
alle classi in SPL, e in PECL continuano a venire aggiunti moduli.
 
Per il resto ci sono i framework.
 
Le innovazioni ci sono di continuo, non ha senso cercare quelle recenti.
 
Bye.
 

 [5], per esempio) per PHP 5.4, ora in beta
 
bene ;)


zac
Spetta ! eccoci!....o non eri esperto di DotNet?
Se vieni da VB (3 4 5 6)...allora php è ancora meno traumatico!
Ma è traumatico in genere pensare OOP!(come è stato per tutti noi 
programmatori vb->
vb.net
)
 
ORA ....come ti han detto....sei ad un bivio
 
A)
Sviluppi web come sempre (come facevi con vb3 4 5 6) ossia 
procedurale...e il php diventa un vbscript più potente...!
Per dire...io ci sto facendo un progetto in questo modo...so che non 
crescerà più di tanto come esigenze e scalerà molto poco...non metto di 
mezzo un framework o la programmazione ad oggetti!
 
B)
Sviluppi secondo i dettami OOP.
le strade si biforcano ancora:
 
B1) Hai MOLTA esperienza! ...fai tutto con PHP...a costo di reinventare 
la ruota ed avendo TANTO tempo per il debug! Avrai il massimo di 
personalizzazione! La versatilità è direttamente proporzionale alla tua 
bravura!
 
B2) l' 80% degli sviluppatori in qualsiasi linguaggio...quindi anche in 
PHP...si affida ad un framework!!!(anche in dotNet eh!)
in php
Quale framework????
http://www.phpframeworks.com/
 
buona scelta!
(...io Zend(o) lo odio! Prado interessante...YII è...LI' )
 
-- 
----- Italliaaaaa 3227! -----
Là dove l'uomo scopre un minimo di ordine, immediatamente ne suppone 
troppo.
(Francesco Bacone)
 
 


 
eh ancora sono all'inizio, vedrò quale usare...

 Avendo invece l'overloading a disposizione ciò non sarebbe necessario ;)
 
Bel guadagno, elimini l'if ma hai due funzioni da mantenere, magari
con duplicazione di codice...
 
bye!

 con duplicazione di codice...
 
duplicazione?
Se per duplicazione del codice, intendi quello per la ri-dichiarazione 
della funzione, allora vabč...