<?php
//魔术方法
//__get方法:当程序员去使用不可访问的属性时;系统就会调用__get方法 //不可访问的属性是指:该属性不存在;直接访问了protected或者private属性 //__set方法:当程序员去给不可访问的属性赋值时系统会去调用__set方法 //示例: header(‘content-type:text/html;charset=utf8‘); echo ‘
‘;
class Monkey{
public $name;
protected $food;
public function __construct($name,$food){
$this->food = $food;
$this->name = $name;
}
// 魔术方法__get
// __get和后面的pro_name形参为固定的不可更改
// 通过__get取出protected或者private里面的
public function __get($pro_name){
echo ‘
pro_name:‘.$pro_name;
// 写法如下
// 通过property_exists()方法用于检测有无此属性
if(property_exists($this,$pro_name)){
return $this->$pro_name;
}else{
return ‘没有这个属性无法返回!‘;
}
}
// __set魔术方法改变受保护属性值
public function __set($pro_name,$pro_val){
echo ‘
‘.$pro_name;
echo ‘
‘.$pro_val;
// 通过property_exists()方法用于检测有无此属性
if(property_exists($this,$pro_name)){
$this->$pro_name = $pro_val;
}else{
return ‘没有这个属性无法修改!‘;
}
}
}
//创建一个monkey1
$monkey1 = new Monkey(‘孙悟空‘,‘蟠桃‘,‘30‘);
echo ‘
猴子的名字是:‘.$monkey1->name;
//如果想直接取出protected和private里面的
echo ‘
猴子的食物是:‘.$monkey1->food;
//__set魔术方法
//修改猴子的食物和名字
$monkey1->name = ‘野猴子‘;
$monkey1->food = ‘苹果‘;
var_dump($monkey1);
//__isset和__unset魔术方法
//当对不可访问的属性进行了isset($对象名->属性名)或者empty($对象名->属性)操作;那么__isset函数就会被调用
//当对不可访问的属性进行了unset($对象名->属性名)那么__unset函数就会被调用
//unset是直接销毁的变量
//案例:
echo ‘
‘;
class Cat{
public $name;
private $food;
public function __construct($name,$food){
$this->food = $food;
$this->name = $name;
}
// 执行__set魔术方法将避免下面的age成员属性的重载;如果不添加这个魔术方法age属性将会被动态的添加给$cat对象
public function __set($pro_name,$pro_val){
}
}
$cat1 = new Cat(‘张三‘,‘鸡肉‘);
var_dump($cat1);
$cat1 ->age = ‘20‘;
var_dump($cat1);
页面输出:

原文:https://www.cnblogs.com/lxc-bky/p/9817463.html