Saya membuat percobaan menggunakan metode ajaib __call. Tidak yakin apakah saya harus mempostingnya (karena semua peringatan "JANGAN GUNAKAN METODE MAGIK" dalam jawaban dan komentar lain) tetapi saya akan meninggalkannya di sini .. kalau-kalau ada orang yang merasa berguna.
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];
}
}
Cukup tambahkan metode di atas di kelas Anda, sekarang Anda dapat mengetik:
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
Dengan cara ini Anda bisa mendapatkan / mengatur segala sesuatu di kelas Anda jika ada, jika Anda membutuhkannya hanya untuk beberapa elemen tertentu, Anda bisa menggunakan "daftar putih" sebagai filter.
Contoh:
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];
}
}
Sekarang Anda hanya bisa mendapatkan / menetapkan "foo" dan "biaya".
Anda juga dapat menggunakan "daftar putih" untuk menetapkan nama khusus untuk mengakses vars Anda.
Sebagai contoh,
private $callWhiteList = array(
"myfoo" => "foo",
"zim" => "bom",
// ...
);
Dengan daftar itu sekarang Anda dapat mengetik:
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
.
.
.
Itu saja.
Doc:
__call () dipicu ketika memanggil metode yang tidak dapat diakses dalam konteks objek.