1.6 魔术方法

已经学习的魔术方法

__construct()
__destruct()
__clone()

1.6.1 ​​__tostring()、__invoke()​

​__tostring()​​:将对象当成字符串使用的时候自动调用

​__invoke()​​:将对象当成函数使用的时候自动调用

<?php
class Student {
//把对象当成字符串使用的时候自动执行
public function __tostring() {
return '这是一个对象,不是字符串<br>';
}
//把对象当成函数使用的时候自动执行
public function __invoke() {
echo '这是一个对象,不是函数<br>';
}
}
$stu=new Student;
echo $stu; //当成字符串使用
$stu(); //当成函数使用

1.6.2 ​​__set()、__get()、__isset()、__unset()​

__set($k,$v):给无法访问的属性赋值的时候自动执行
__get($k):获取无法访问的属性值的时候自动调用
__isset($k):判断无法访问的属性是否存在自动调用
__unset($k):销毁无法访问的属性的时候自动执行

例题

<?php
class Student {
private $name;
private $sex;
private $age;
//给无法访问的属性赋值的时候自动执行
public function __set($k,$v) {
$this->$k=$v;
}
//获取无法访问的属性值的时候自动调用
public function __get($k) {
return $this->$k;
}
//判断无法访问的属性是否存在自动调用
public function __isset($k) {
return isset($this->$k);
}
//销毁无法访问的属性的时候自动执行
public function __unset($k) {
unset($this->$k);
}
}
//测试
$stu=new Student;
//1、给私有属性赋值
$stu->name='tom';
$stu->sex='男';
$stu->age=22;
//2、获取私有属性的值
//echo $stu->name;
//3、判断私有属性是否存在
//var_dump(isset($stu->name));
//4、销毁私有属性
unset($stu->age);
print_r($stu);

应用:设置读写属性

<?php
class Student {
private $name; //读写属性
private $add='中国'; //只读属性
private $age; //只写属性

public function __set($k,$v) {
if(in_array($k,array('name','age')))
$this->$k=$v;
else
echo "{$k}属性是只读属性<br>";
}
public function __get($k) {
if(in_array($k,array('name','add')))
return $this->$k;
else
echo "{$k}是只写属性<br>";
}
}
//测试
$stu=new Student;
$stu->name='tom';
$stu->age=22;
echo '姓名:'.$stu->name,'<br>';
echo '地址:'.$stu->add,'<br>';

1.6.3 ​​__call()、__callstatic()​

__call():调用无法访问的方法时自动执行
__callstatic():调用无法访问的静态方法时自动执行

例题:

<?php
class Student {
/**
*作用:调用无法访问的方法时自动执行
*@param $fn_name string 方法名
*@param $fn_args array 参数数组
*/
public function __call($fn_name,$fn_args) {
echo "{$fn_name}不存在<br>";
}
//调用无法访问的静态方法时自动执行
public static function __callstatic($fn_name,$fn_args) {
echo "{$fn_name}静态方法不存在<br>";
}
}
//测试
$stu=new Student;
$stu->show(10,20);

Student::show();

1.6.4 ​​__sleep()、__wakeup()​

__sleep():当序列化的时候自动调用
__wakeup():当反序列化的时候自动调用

例题

<?php
class Student {
private $name;
private $sex;
private $add='中国';
public function __construct($name,$sex) {
$this->name=$name;
$this->sex=$sex;
}
/**
*序列化的时候自动调用
*@return array 序列化的属性名
*/
public function __sleep() {
return array('name','sex');
}
//反序列化的时候自动调用
public function __wakeup() {
$this->type='学生';
}
}
//测试
$stu=new Student('tom','男');
$str=serialize($stu); //序列化
$stu=unserialize($str); //反序列化
print_r($stu);