先看看官方文档的解释
__set() is run when writing data to inaccessible properties.
__get() is utilized for reading data from inaccessible properties.
究竟用中文怎么翻译呢? inaccessible :n. 难达到;难接近;无法理解。
有代码有真相:
<?php
error_reporting
(E_ALL);
class
stu{
private
$a
;
private
$b
= 0;
public
$c
;
public
$d
= 0;
//这里的 private 可以用 protected public 替代
private
function
__get(
$name
) {
return
123;
}
//这里的 private 也可以用 protected public 替代
private
function
__set(
$name
,
$value
) {
echo
"This is set function"
;
}
}
$s
=
new
stu();
var_dump(
$s
->a);
//output: 123
var_dump(
$s
->b);
//output: 123
var_dump(
$s
->c);
//output: null
var_dump(
$s
->d);
//output: 0
var_dump(
$s
->e);
//output: 123
$s
->a = 3;
//output: This is set function
$s
->c = 3;
//no output
$s
->f = 3;
//output: This is set function
?>
|
结果:
如果没有__get方法,执行 var_dump($s->a) var_dump($s->b) 会有致命的错误
如果没有__get方法,执行 var_dump($s->e) 会有一个notice,提示没有定义属性 $e
总结:
1. 从一个难以访问的属性读取数据的时候 __get() 方法被调用
2. 向一个难以访问的属性赋值的时候 __set() 方法被调用
3. 难以访问包括:(1)私有属性,(2)没有初始化的属性
4. __isset() __unset() 也类似
另外一个我自己的案例: