Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22

Discussione: Metodi Magici

  1. #1

    Metodi Magici

    Cosa sono i metodi magici in Php? Ho letto la guida su html.it ma non ho capito praticamente nulla.

    Grazie

  2. #2
    Utente di HTML.it L'avatar di Laxus
    Registrato dal
    Oct 2010
    Messaggi
    251
    per farla breve, sono metodi che vengono automaticamente richiamati in determinate situazioni. il costruttore è uno di questi.

    http://php.net/manual/en/language.oop5.magic.php

  3. #3
    Facciamo un esempio perchè io non ho capito nulla.

    class MyClass {
    public function __call($name, $args) {
    echo "È stato richiamato il metodo " . $name . " con i seguenti argomenti: ";
    foreach($args as $arg) echo $arg . " ";
    }

    public function __callStatic($name, $args) {
    echo "È stato richiamato il metodo " . $name . " in un contesto statico con i seguenti argomenti: ";
    foreach($args as $arg) echo $arg . " ";
    }
    }

    $obj1 = new MyClass();

    // stampa "È stato richiamato il metodo setName con i seguenti argomenti: George"
    $obj1->setName("George");


    // stampa "È stato richiamato il metodo setName in un contesto con i seguenti argomenti: George"
    MyClass::setName("George");

    ################################################## #################################

    I metodi magici presenti in questo codice sono 2:

    __call

    __callstatic

    call riceve come parametri $name e $args giusto?

    Si istanzia la classe $obj1=new MyClass();

    $obj-> setName("George"); >>>>>Qui cosa fa esattamente? Cosa richiama?

  4. #4
    Utente di HTML.it L'avatar di Secta
    Registrato dal
    May 2002
    Messaggi
    365
    Non richiama nulla. Il metodo magico "__call" non fà altro che intercettare il tentativo (voluto o meno) di richiamare un metodo non esistente. Cosa poi fare concretamente spetta a te (terminare tutto, lanciare un'eccezione, chiamare un metodo alternativo...).
    "Dai diamanti non nasce niente, dal letame nascon fiori."
    Fabrizio De Andrè

  5. #5
    avrai in __call $name = 'Name' (o setName, non ricordo esattamente) e args = array('George').. poi cosa ci deve fare la funzione __call con questi parametri dipende da te...
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  6. #6
    Class MyClass{

    public $a=10;

    public function sayHello(){
    echo "Hello";

    $myClass=new Myclass();

    echo $myClass->a;

    echo $myClass->sayHello();

    }
    }

    Lasciando perdere eventuali errori sintattici, se vedete bene io posso richiamare la proprietà a con echo $myClass->a; e il metodo con echo $myClass->sayHello();

    Invece nel caso del metodo magico

    class MyClass {
    public function __call($name, $args) {
    echo "È stato richiamato il metodo " . $name . " con i seguenti argomenti: ";
    foreach($args as $arg) echo $arg . " ";
    }
    $obj1 = new MyClass();

    // stampa "È stato richiamato il metodo setName con i seguenti argomenti: George"
    $obj1->setName("George");

    Quest'ultima riga di codice chiama un qualcosa di inesistente e gli passa George come parametro. Boh!!!

    Comunque la teoria ad oggetti l'ho fatta tutta e capita anche abbastanza bene. Il problema sono questi metodi magici. Li posso tralasciare o sono importanti?

  7. #7
    Un momento forse mi è venuta un'illuminazione:

    class MyClass {
    public function __call($name, $args) {
    echo "È stato richiamato il metodo " . $name . " con i seguenti argomenti: ";
    foreach($args as $arg) echo $arg . " ";
    }
    }

    $obj1 = new MyClass();

    // stampa "È stato richiamato il metodo setName con i seguenti argomenti: George"
    $obj1->setName("George");


    Il metodo che si va a chiamare è setName con il parametro George. Poichè questo metodo è insistente/inaccessibile php automaticamente va a chiamare il metodo magico __call
    In $name va a mettere il nome del metodo chiamato e inesistente (setName) in args va a mettere i parametri nel nostro caso George. Se ci sono più parametri li mette in un array e poi li scorre con forech.

    Giusto?

  8. #8
    Originariamente inviato da bismark2005
    Un momento forse mi è venuta un'illuminazione:

    class MyClass {
    public function __call($name, $args) {
    echo "È stato richiamato il metodo " . $name . " con i seguenti argomenti: ";
    foreach($args as $arg) echo $arg . " ";
    }
    }

    $obj1 = new MyClass();

    // stampa "È stato richiamato il metodo setName con i seguenti argomenti: George"
    $obj1->setName("George");


    Il metodo che si va a chiamare è setName con il parametro George. Poichè questo metodo è insistente/inaccessibile php automaticamente va a chiamare il metodo magico __call
    In $name va a mettere il nome del metodo chiamato e inesistente (setName) in args va a mettere i parametri nel nostro caso George. Se ci sono più parametri li mette in un array e poi li scorre con forech.

    Giusto?

  9. #9
    Cavolo era più semplice di quanto pensassi. Mi ha tratto in inganno il fatto che si chiamassero magici, chissà cosa pensavo.
    Però non capisco a cosa serva esattamente questo "precauzione". Perchè si dovrebbe chiamare un metodo inaccessibile/inesistente?

  10. #10
    Originariamente inviato da bismark2005
    Cavolo era più semplice di quanto pensassi. Mi ha tratto in inganno il fatto che si chiamassero magici, chissà cosa pensavo.
    Però non capisco a cosa serva esattamente questo "precauzione". Perchè si dovrebbe chiamare un metodo inaccessibile/inesistente?
    l'ho visto molto usato per non dover scrivere tutti i getter/setter di una classe (anche se l'idea mi piace poco)... molto comodo se vuoi creare un proxy... cmq, c'ha la sua utilità dipende da che deve fare e come lo deve fare l'oggetto
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.