Php 声明时的属性访问器
我正在寻找一种方法来维护$this->property=value语法,但使用getter和setter方法 我发现了一些关于神奇函数uuu get和uuu set的引用,但我希望更多地根据具体情况提供访问器 然后我发现了这一点:,这似乎正是我所要寻找的,但遗憾的是,它似乎并没有得到实现Php 声明时的属性访问器,php,oop,Php,Oop,我正在寻找一种方法来维护$this->property=value语法,但使用getter和setter方法 我发现了一些关于神奇函数uuu get和uuu set的引用,但我希望更多地根据具体情况提供访问器 然后我发现了这一点:,这似乎正是我所要寻找的,但遗憾的是,它似乎并没有得到实现 如果没有类范围的函数来检查每个属性分配,有没有办法做到这一点?对我来说,您有两个选项: 您希望使用神奇的方法覆盖所有的getter和setter,并将要获取/设置的数据存储在$this->\u data[]这样
如果没有类范围的函数来检查每个属性分配,有没有办法做到这一点?对我来说,您有两个选项: 您希望使用神奇的方法覆盖所有的getter和setter,并将要获取/设置的数据存储在$this->\u data[]这样的属性中,以避免与其他属性发生冲突 您希望创建特定的getter/setter,并在您希望在继承链中使用它们的类中或继承链的高层手动定义它们,以便每个扩展它的类都可以使用它们——这在MVC体系结构中很有用。 magic methods方法是一种很好的覆盖所有基础的方法,而单独的方法更清晰,更确切地知道实现/子级可以使用什么 选项1魔术方法的一个很好的例子是 我想补充一点,如果您希望属性以个案为基础,您还可以将白名单/黑名单添加到您的魔术方法中,以包括/排除特定的属性集,例如扩展手册中的内容:
private $data = array();
private $whitelist = array('PropertyIWant', 'AnotherOneIWant');
// ...
public function __get($name)
{
// ...
if (array_key_exists($name, $this->data) && in_array($name, $this->whitelist)) {
return $this->data[$name];
}
// ...
您可以使用电话:
class Test {
protected $a;
protected $b;
protected $valueForC;
protected $otherData = array('d' => null);
public function __call($method, $args) {
if (preg_match('#^((?:get|set))(.*)$#', $method, $match)) {
$property = lcfirst($match[2]);
$action = $match[1];
if ($action === 'set') {
$this->$property = $args[0];
} else {
return $this->$property;
}
}
}
public function getD() {
return $this->otherData['d'];
}
public function setD($value)
{
$this->otherData['d'] = $value;
}
}
$x = new Test();
$x->setA('a value');
$x->setB('b value');
$x->setValueForC('c value');
$x->setD('special value for D');
echo $x->getA() ."\n";
echo $x->getB() ."\n";
echo $x->getValueForC() ."\n";
echo $x->getD() ."\n";