当一个值赋值给一个不存在的成员时,__set方法被调用。当尝试去访问一个不存在的成员时,__get方法被调用。如代码清单1-4所示。
代码清单1-4 有关_set和_get方法的例子
# __get和__set功能示例
# 设置和读取"speed_limit"这一不存在的属性
<?php
class test1 {
protected $members = array();
public function __get($arg) {
if (array_key_exists($arg, $this->members)) {
return ($this->members[$arg]);
} else { return ("No such luck!\n"); }
}
public function __set($key, $val) {
$this->members[$key] = $val;
}
public function __isset($arg) {
return (isset($this->members[$arg]));
}
}
$x = new test1();
print $x->speed_limit;
$x->speed_limit = "65 MPH\n";
if (isset($x->speed_limit)) {
printf("Speed limit is set to %s\n", $x->speed_limit);
}
$x->speed_limit = NULL;
if (empty($x->speed_limit)) {
print "The method __isset() was called.\n";
} else {
print "The __isset() method wasn't called.\n";
}
?>
当执行时,该脚本执行结果如下所示。
No such luck!
Speed limit is set to 65 MPH
The method __isset() was called.
不定义类成员speed_limit,而是引用它,这样不会产生错误。因为当我们引用不存在的成员时,__get方法被执行;当给一个不存在的成员赋值时,__set被执行。在一个关联数组里定义所有的成员(或属性),并指向它们,好像把它们作为单独的类属性定义,这是一种常见的做法。这种做法使类更易于扩展。