<?php
header("content-type:text/html;charset=utf8");
/**
* 魔术方法类
* 系统在特定的时机调用的方法称为魔术方法
*/
class Magic {
public $name; //公共的
protected $age; //受保护的
private $height; //私有的
//在内外实例化对象的时候自动调用此方法,一般用来初始化某些变量
public function __construct($name,$age,$height) {
$this->age = $age;
$this->name = $name;
$this->height = $height;
}
//在类外调用受保护的以及私有的成员属性时自动执行该方法
//或者在调用不存在的属性是自动执行该方法
public function __get($name) { //参数为:类外调用属性的属性名称
echo $name."该属性你没有权限进行调用或者该属性不存在".'<br/>';
}
//在类外调用受保护的以及私有的成员属性设置值的时候自动执行此方法
//或者类中不存在的属性设置值的时候
public function __set($name,$value) {//参数为:类外调用属性的属性名称以及对属性需要设置的值
$this->$name = $value.'<br/>';
}
//在类外调用一个不存在的普通方法时,调用此方法
public function __call($name,$value) { //参数为:类外调用的方法名称以及调用此方法时传递的参数
echo $name."这个普通方法不存在,你调用这个不存在方法传递的值为".'<br/>';
var_dump($value).'<br/>';
}
//在类外调用一个不存在的静态方法时,调用此方法 !!!注意,此方法本身必须是一个静态方法,使用static修饰过的方法称为静态方法
public static function __callStatic($name,$value) { //参数为:类外调用的方法名称以及调用此方法时传递的参数
echo $name."这个静态方法不存在,你调用这个不存在方法传递的值为".'<br/>';
var_dump($value).'<br/>';
}
//在类外销毁受保护的以及私有的成员属性时调用此魔术方法
public function __unset($name) { //参数为:类外销毁属性的属性名称
echo $name."权限很高,就是不让你销毁啊".'<br/>';
}
//在类外判断受保护的以及私有的成员属性是否设置时调用此魔术方法
public function __isset($name) { //参数为:类外判断属性的属性名称
echo $name."权限很高,你在类外就是不给你判断呀".'<br/>';
}
//将类实例化为对象之后,使用clone克隆这个类的时候调用此方法,可以在此设置克隆的类的成员属性
public function __clone() {
$this->name = '小羽';
$this->age = '18';
$this->height = '165';
}
// public function getVlaue($name) {
// echo $this->$name.'<br/>';
// }
//在类外实例化这个对象之后,序列化这个对象之后调用此方法 作用为只序列化这个方法中返回的成员属性
public function __sleep() {
return ['age','height'];
}
//在类外实例化这个对象之后,反序列化的时候调用此方法 可以在反序列化的时候重新初始化成员属性
public function __wakeup() {
$this->name = '小羽';
$this->age = '18';
$this->height = '165';
}
//将类实例化为对象的时候,echo对象调用此方法。!!!注意,此方法内只能return不能echo
public function __toString() {
return "你是不是闲得慌,没事你去输出对象,有病啊".'<br/>';
}
//将类实例化为对象的时候,打印对象时调用此方法,打印此方法返回的数组 5.6之后才有这个魔术方法
public function __debugInfo() {
return ['age'=>$this->age,'height'=>$this->height];
}
//执行完脚本之后会自动调用此方法
public function __destruct() {
echo '你就这么不要我了吗?'.'<br/>';
}
}
//这是唯一的一个写在类外的魔术方法 在实例化一个不存在的类的时候就会调用此方法 可以用在需要某些类但是没有引入的情况
function __autoload($className) {
$file = $className.'.php';
include $file;
}
额外补充一个__invoke
public function __invoke($param){
var_dumo($param); //参数就是你传递的数值
return “这里是将实例化之后的类当成方法进行调用时触发的魔术方法”;
}