<?php
class person
{
public $name;
public $gender;
public function __set($name, $value)
{
echo "Setting $name to $value", "<br />";
$this->$name = $value;
}
public function __get($name)
{
if (!isset($this->$name))
{
echo "此变量 $name 不存在,现在动态创建并为其设定值", "<br />";
$this->$name = '默认值';
}
return $this->$name;
}
}
$student = new person();
$student->age; //断点
?>
运行结果是:
此变量 age 不存在,现在动态创建并为其设定值<br />Setting age to 默认值<br />
如果是浏览器上,运行结果是(<br />不显示):
此变量 age 不存在,现在动态创建并为其设定值
Setting age to 默认值
在以上代码25行设定断点后,代码运行的行号顺序是:
3 {
24 $student = new person();
25 $student->age;
15 if (!isset($this->$name))
17 echo "此变量 $name 不存在,现在动态创建并为其设定值", "<br />";
18 $this->$name = '默认值';
9 echo "Setting $name to $value", "<br />";
10 $this->$name = $value;
11 }
20 return $this->$name;
26 ?>
解释:
25行$student->age;访问一个不存在的变量age,自动调用__get('age')函数
__get('age')执行到18行 $this->age = '默认值',此时给一个原本类person中没有声明的变量age赋值,自动调用了__set('age', '默认值')函数
执行__set('age', '默认值')函数后,回到20行return $this->age;返回$this->age给__get('age')函数。此时25行$student->age;执行结束,此时这个表达式语句有个返回值($this->age,即'默认值'),如果此语句是echo $student->age;那么可以在原输出结果基础上多得到一个输出结果为:'默认值'