Может быть, я что-то упускаю, но __get и __set срабатывают только тогда, когда вы уже пытались получить доступ к синтаксически допустимому имени свойства, которое недоступно через открытый API объекта. Если вы хотите убедиться, что элемент, к которому вы пытаетесь получить доступ, существует в приватном массиве, используйте array_key_exists
:
class Foo {
protected $data = array(
'bar' => 'baz'
);
public function __get($name)
{
if(array_key_exists($name, $this->data)) {
return $this->data[$name];
}
throw new BadMethodCallException('Invalid property');
}
}
$obj = new Foo;
$obj->123; // Syntax Error => __get won't be called
$obj->foo; // valid syntax, but not in array => BadMethodCall Exception
$obj->bar; // returns baz