Ho fatto un esperimento usando il metodo magico __call. Non sono sicuro se dovrei pubblicarlo (a causa di tutti gli avvisi "NON UTILIZZARE METODI MAGICI" nelle altre risposte e commenti), ma lo lascerò qui ... nel caso qualcuno lo trovasse utile.
public function __call($_name, $_arguments){
$action = substr($_name, 0, 4);
$varName = substr($_name, 4);
if (isset($this->{$varName})){
if ($action === "get_") return $this->{$varName};
if ($action === "set_") $this->{$varName} = $_arguments[0];
}
}
Aggiungi quel metodo sopra nella tua classe, ora puoi digitare:
class MyClass{
private foo = "bar";
private bom = "bim";
// ...
// public function __call(){ ... }
// ...
}
$C = new MyClass();
// as getter
$C->get_foo(); // return "bar"
$C->get_bom(); // return "bim"
// as setter
$C->set_foo("abc"); // set "abc" as new value of foo
$C->set_bom("zam"); // set "zam" as new value of bom
In questo modo puoi ottenere / impostare tutto nella tua classe se esiste, quindi se ne hai bisogno solo per alcuni elementi specifici, puoi utilizzare una "lista bianca" come filtro.
Esempio:
private $callWhiteList = array(
"foo" => "foo",
"fee" => "fee",
// ...
);
public function __call($_name, $_arguments){
$action = substr($_name, 0, 4);
$varName = $this->callWhiteList[substr($_name, 4)];
if (!is_null($varName) && isset($this->{$varName})){
if ($action === "get_") return $this->{$varName};
if ($action === "set_") $this->{$varName} = $_arguments[0];
}
}
Ora puoi solo ottenere / impostare "foo" e "fee".
Puoi anche utilizzare quella "lista bianca" per assegnare nomi personalizzati per accedere ai tuoi var.
Per esempio,
private $callWhiteList = array(
"myfoo" => "foo",
"zim" => "bom",
// ...
);
Con quell'elenco ora puoi digitare:
class MyClass{
private foo = "bar";
private bom = "bim";
// ...
// private $callWhiteList = array( ... )
// public function __call(){ ... }
// ...
}
$C = new MyClass();
// as getter
$C->get_myfoo(); // return "bar"
$C->get_zim(); // return "bim"
// as setter
$C->set_myfoo("abc"); // set "abc" as new value of foo
$C->set_zim("zam"); // set "zam" as new value of bom
.
.
.
È tutto.
Doc:
__call () viene attivato quando si invocano metodi inaccessibili in un contesto di oggetto.