プロパティごとに個別のメソッドを使用する代わりに、魔法のメソッド __get($property) および __set($property, $value) を使用したいと考えています。それは可能ですか?
その場合、各プロパティを定義しないでください。1 つの単純な配列コンテナーで十分です。だから、これはまさにあなたが探しているものです:
class Foo
{
private $container = array();
public function __set($property, $value)
{
$this->container[$property] = $value;
}
public function __get($property)
{
if (array_key_exists($property, $this->container)){
return $this->container[$property];
} else {
trigger_error(sprintf('Undefined property "%s"', $property));
}
}
}
$foo = new Foo();
$foo->bar = "123";
print $foo->bar; // prints 123
$foo->id = "test string";
print $foo->id; // test string
print $foo->nonExistingProp; //issues E_NOTICE
アクセサー/修飾子を主張する場合は、それらをオーバーロードするだけです。使用して__call()
class Foo
{
private $container = array();
public function __call($method, array $args)
{
$property = substr($method, 3);
if (substr($method, 0, 3) == 'get'){
// getter is being used
if (isset($this->container[$property])){
return $this->container[$property];
}
}
if (substr($method, 0, 3) == 'set'){
//setter is being used
$this->container[$property] = $args[0];
}
}
}
$foo = new Foo();
$foo->setId('__BAR__');
$foo->setStuff('__YEAH__');
print $foo->getId(); // prints __BAR__
print $foo->getStuff(); //prints __YEAH__