Cosa sono i metodi magici in Php? Ho letto la guida su html.it ma non ho capito praticamente nulla.
Grazie
Cosa sono i metodi magici in Php? Ho letto la guida su html.it ma non ho capito praticamente nulla.
Grazie
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
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?
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è
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
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?
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?
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?![]()
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'oggettoOriginariamente 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?
IP-PBX management: http://www.easypbx.it
Old account: 2126 messages
Oldest account: 3559 messages