- __set: 给类不存在或者不可访问的属性赋值时会被自动调用
- __get: 读取类不存在或者不可访问的属性时会被自动调用
二者的原型如下public mixed __get ( string $name ) public void __set ( string $name , mixed $value )
================================= ================================= =============================
class A{ protected $names; public function __get($name){ //读取类不存在 或 不可访问的属性是会被调用 var_dump($name); } public function __set($name,$value){ //赋值类中不存在的 或 没有访问权限时会调用到 var_dump($name,$value); } } $a = new A; echo $a->age;//访问 未声明或 访问权限的属性 $a->names = 'namesss11111'; class B { public $name; private $_definitions = []; public function __get($name) { return isset($this->_definitions[$name]) ? $this->_definitions[$name] : null; } public function __set($name, $value) { $this->_definitions[$name] = $value; } } $config = [ 'class' => 'B', 'name' => 'zhangsan', 'age' => 20, ]; $class = $config['class']; //获取配置的类 unset($config['class']); //删除配置类名 $object = new $class; //实例化类名 foreach ($config as $k=>$v){ //遍历配置属性 $object->$k = $v; //B类里面,如果有配置项目里面属性值,就赋值; } //如果赋值类 里面没有值,就调用了__set方法,根据方法,放在了 私有属性$_definitions里面 var_dump($object->name); //然后访问类里面没有声明的属性的话,就会调用 __get方法 var_dump($object->age);