php chiamare metodo parent

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
eaghezzi
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 725
Iscrizione: martedì 21 luglio 2009, 10:27
Desktop: Lubuntu
Distribuzione: Ubuntu 14.04.1 LTS i686
Sesso: Maschile
Località: Valleambrosia

php chiamare metodo parent

Messaggio da eaghezzi »

classe A
public function foo() {}

classe B estende A
public function foo(){}

come faccio a chiamare il metodo foo() di A dall'esterno delle classi ?

avendo un'istanza di B
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: php chiamare metodo parent

Messaggio da Zoff »

Non puoi.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
eaghezzi
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 725
Iscrizione: martedì 21 luglio 2009, 10:27
Desktop: Lubuntu
Distribuzione: Ubuntu 14.04.1 LTS i686
Sesso: Maschile
Località: Valleambrosia

Re: php chiamare metodo parent

Messaggio da eaghezzi »

mmmhh è una limitazione di php o anche altri linguaggi oop fanno così?
p.ex java
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: php chiamare metodo parent

Messaggio da Zoff »

No, tutti i linguaggi ad oggetti funzionano così.

In alcuni puoi castare l'oggetto alla classe parent e richiamare il metodo ma usi un altro reference Errato, con il cast continui ad usare la stessa implementazione.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
eaghezzi
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 725
Iscrizione: martedì 21 luglio 2009, 10:27
Desktop: Lubuntu
Distribuzione: Ubuntu 14.04.1 LTS i686
Sesso: Maschile
Località: Valleambrosia

Re: php chiamare metodo parent

Messaggio da eaghezzi »

se non ricordo male facendo un programmino in c# nella stessa situazione, con l'unica variante che il metodo nelle due classi aveva parametri diversi (cosa che php non ti fa fare)

potevo scegliere quale dei due chiamare con i rispettivi parametri

cmq sia allora non riesco a capire a cosa serva "l'overloading'"
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: php chiamare metodo parent

Messaggio da Zoff »

PHP ha tipizzazione dinamica e argomenti opzionali, non puoi distinguere i metodi dagli argomenti.
Quindi hai a disposizione solo l'overriding.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: php chiamare metodo parent

Messaggio da crap0101 »

ma le classi le scrivi tu o le puoi solo usare? Perchè altrimenti potresti aggiungere un metodo a B apposta per richiamare quello di A. Non so in tutti gli altri linguaggi OO come funzioni, probabilmente c'è il modo per farlo ma non credo che la cosa venga particolarmente agevolata, che potrebbe non avere molto senso fare una cosa del genere... il tuo scopo finale qual'è? Cioè, le motivazioni per cui vuoi fare così.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
disko
Prode Principiante
Messaggi: 217
Iscrizione: sabato 27 ottobre 2007, 16:52

Re: php chiamare metodo parent

Messaggio da disko »

Se si potrebbe fare un cast da B al tipo A sarebbe semplice. Invecein PHP il cast si può fare solo a tipi di dato predefiniti(object,int) ect.

Tuttavia se deserializzi l'oggetto puoi vedere che la prima parola descrive la classe, quindi se la cambi ed effettui la serializzazione hai fatto un cast.

Codice: Seleziona tutto

class A{
    public function foo()
    {
        echo "inside A";
    }
    
}
class B extends A
{
    public function foo()
    {
        echo "inside B";
    }    
}

function cast($obj, $to_class) {
  if(class_exists($to_class)) {
    $obj_in = serialize($obj);
    $obj_out = 'O:' . strlen($to_class) . ':"' . $to_class . '":' . substr($obj_in, $obj_in[2] + 7);
    return unserialize($obj_out);
  }
  else
    return false;
}

$b = new B();
$a = cast($b, "A");
$a->foo(); // stampa "inside A"

Ovviamente questo non è un vero e propio cast, se lo fosse dovrebbe essere chiamata la funzione in B
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: php chiamare metodo parent

Messaggio da Zoff »

disko [url=http://forum.ubuntu-it.org/viewtopic.php?p=4430410#p4430410][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Se si potrebbe fare un cast da B al tipo A sarebbe semplice. Invecein PHP il cast si può fare solo a tipi di dato predefiniti(object,int) ect.
No, il cast cambia il modo in cui viene tratta l'oggetto non la sua implementazione.
Come esempio basta provare in JAva questo codice:
[code2=java]public class TestCall {
private static class A {
public void foo() {
System.out.println("A");
}
}

private static class B extends A {
public void foo() {
System.out.println("B");
}
}

public static void main(String[] args) {
B b = new B();
A a = (A) b;
a.foo(); // Stampa B
}
}[/code2]
disko [url=http://forum.ubuntu-it.org/viewtopic.php?p=4430410#p4430410][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto: Tuttavia se deserializzi l'oggetto puoi vedere che la prima parola descrive la classe, quindi se la cambi ed effettui la serializzazione hai fatto un cast.

Codice: Seleziona tutto

class A{
    public function foo()
    {
        echo "inside A";
    }
    
}
class B extends A
{
    public function foo()
    {
        echo "inside B";
    }    
}

function cast($obj, $to_class) {
  if(class_exists($to_class)) {
    $obj_in = serialize($obj);
    $obj_out = 'O:' . strlen($to_class) . ':"' . $to_class . '":' . substr($obj_in, $obj_in[2] + 7);
    return unserialize($obj_out);
  }
  else
    return false;
}

$b = new B();
$a = cast($b, "A");
$a->foo(); // stampa "inside A"

Così però crei un'altro oggetto non lavori sullo stesso.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
disko
Prode Principiante
Messaggi: 217
Iscrizione: sabato 27 ottobre 2007, 16:52

Re: php chiamare metodo parent

Messaggio da disko »

sì infatti ho modificato il post dicendo che non è un cast vero e proprio ma mi hai risposto prima :). Certamente l'oggetto che si crea è un clone fisico
Avatar utente
eaghezzi
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 725
Iscrizione: martedì 21 luglio 2009, 10:27
Desktop: Lubuntu
Distribuzione: Ubuntu 14.04.1 LTS i686
Sesso: Maschile
Località: Valleambrosia

Re: php chiamare metodo parent

Messaggio da eaghezzi »

ringrazio tutti per i post la situazione reale è la seguente

Codice: Seleziona tutto

class ajax  {

public function termina_errore($messaggio,$extra=NULL){
}
la classe ajax è una mia classe base che gestisce l'interazione ajax in tutti i miei progetti

all'interno di un progetto estendo la classe per ogni richiesta ajax

Codice: Seleziona tutto

class AjaxLogin extends ajax
e finora oltre un centinaio di classi estese e nessun problema

il metodo termina_errore
crea un oggetto std class che ritorna la risposta json alla pagina web che lo elabora
oggi per la prima volta mi sono imbatutto in un problema
sto facendo un upload utilizzando ajax con jQuery Form Plugin
la funzione di callback ajax che normalmente ritorna i dati in formato json in questo caso no ritorna solo una stringa di test

quello che volevo fare era di implementare termina_errore nella classe AjaxLogin in modo che torni i dati in formato testo
questo senza dover cambiare tutte le parti già implementate e di richiamare termina_errore sulla classe base quando necessario
è ovvio che ci sono una serie di workaround però comportano cambiare qualche centinaio di righe di codice.
e vvvabè :devilmad:
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: php chiamare metodo parent

Messaggio da Zoff »

Mi sembra chiaro che sia un problema di ingegnerizzazione della classe.

Il modo pulito di risolvere il problema sarebbe riscrivere la classe per il supporto al formato della risposta.

Il modo piu' sporco può essere aggiungere un argomento al metodo termina_errore di AjaxUpload (o come l'hai chiamata) che ti permette di discriminare se vuoi richiamare quello o quello del parent.
Il tutto si risolverebbe con qualcosa tipo:
[code2=php]if( $terzoArgomento === TRUE ){
return parent::termina_errore($primoArgomento, $secondoArgomento);
}[/code2]
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
eaghezzi
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 725
Iscrizione: martedì 21 luglio 2009, 10:27
Desktop: Lubuntu
Distribuzione: Ubuntu 14.04.1 LTS i686
Sesso: Maschile
Località: Valleambrosia

Re: php chiamare metodo parent

Messaggio da eaghezzi »

eh sì non è bello ma è veloce.
grazie.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: php chiamare metodo parent

Messaggio da Zoff »

Beh in ogni caso in un qualche modo dovrai far sapere alla classe quando vuoi un formato o l'altro.
Un argomento lo devi aggiungere comunque...

PS: Questo però è il genere di problematiche che si risolvono utilizzando il pattern MVC e un template manager che filtra tutte le risposte.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: php chiamare metodo parent

Messaggio da UbuNuovo »

OT: per favore correggete "Se si potrebbe fare un cast da B al tipo A sarebbe semplice" non si può vedere.
"Se si potesse fare..."
Scusate l'intromissione.
Salva l'Ucraina! 🇺🇦
Avatar utente
disko
Prode Principiante
Messaggi: 217
Iscrizione: sabato 27 ottobre 2007, 16:52

Re: php chiamare metodo parent

Messaggio da disko »

Per fortuna ci sono utenti di immensa utilità come te..
Questo è un forum di supporto tecnico non il bar dietro casa tua
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: php chiamare metodo parent

Messaggio da UbuNuovo »

l'ho detto per te! la figura di palta la fai te. Correggi e io cancello il mio commento. Altrimenti fai come vuoi!
Non mi metto a discutere con nessuno, figuriamoci con chi non si rende conto di cosa scrive!
addio!
Salva l'Ucraina! 🇺🇦
Avatar utente
disko
Prode Principiante
Messaggi: 217
Iscrizione: sabato 27 ottobre 2007, 16:52

Re: php chiamare metodo parent

Messaggio da disko »

Se lo vuoi dire ad una persona singola puoi scrivere un messaggio privato visto che esistono ed è possibile utilizzarli.
Invece sei venuto quì a scrivere inutilmente in un thread risolto di un piccolo errore ortografico che ho commesso scrivendo una possibile soluzione al problema.
Direi che date le circostanze sei tu che non ti rendi conto di cosa scrivi, tesi maggiormente dimostrata dal fatto che pure hai risposto.
Dovresti partire dal presupposto di non discutere inutilmente invece di scegliere la persona con cui farlo pubblicamente. saluti
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: php chiamare metodo parent

Messaggio da UbuNuovo »

Hai ragione, guardo di risponderti in privato
Salva l'Ucraina! 🇺🇦
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: php chiamare metodo parent

Messaggio da crap0101 »

Zoff [url=http://forum.ubuntu-it.org/viewtopic.php?p=4430414#p4430414][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:
disko [url=http://forum.ubuntu-it.org/viewtopic.php?p=4430410#p4430410][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Se si potrebbe fare un cast da B al tipo A sarebbe semplice. Invecein PHP il cast si può fare solo a tipi di dato predefiniti(object,int) ect.
No, il cast cambia il modo in cui viene tratta l'oggetto non la sua implementazione.
Come esempio basta provare in JAva questo codice:
OT: riguardo il tuo esempio, forse si può usare qualche trucchetto con reflection, però non son sicuro possa funzionare in ogni caso.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: steff e 5 ospiti