详解php的魔术方法__get()和__set()使用介绍

时间:2022-08-28 20:23:18

先看看php官方文档的解释: 
__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() 也类似