我正在寻找一种维护$this->property = "value"
语法的方法,但是使用getter和setter方法。
我发现了几个对魔术函数__get()
和__set()
的引用,但我希望在更多情况下提供访问器。
然后我发现了这个:https://wiki.php.net/rfc/propertygetsetsyntax-v1.2,这看起来就像我在寻找的那样,但唉似乎没有实现。
有没有办法在没有类范围的函数的情况下检查每个属性赋值?
答案 0 :(得分:0)
对我来说,你有两个选择:
魔术方法方法很好,涵盖所有基础"方法,而个别方法更清晰,更准确地了解实施/儿童可用的内容。
选项1(魔术方法)的一个很好的例子是available in the manual, here。
我想补充一点,如果你想要一个" case by case"在属性的基础上,您还可以在魔术方法中添加白名单/黑名单,以包含/排除一组特定的属性,例如扩展手册中的内容:
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];
}
// ...
答案 1 :(得分:0)
你可以使用电话:
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";