【clone 和 __clone】 1、对象是引用数据类型: 当使用 = 将一个对象赋值给另一个对象时, 赋的是对象的地址, 两个变量指向同一地址, 一个跟着另一个也跟着变 $lisi = $zhangsan; 2、clone: 如果想要将一个对象完全克隆出一个互不干扰的对象, 需要使用clone关键字 $lisi = clone $zhangsan; 3、__clone(): ① 当使用clone关键字克隆对象时, 将自动调用魔术方法 ② __clone()函数, 相当于克隆对象时的构造函数, 用于给新克隆对象赋初值 ③ 在clone()函数中, $this 指向的是新克隆出的对象 【__toString()】 当使用 echo 等输出语句时, 直接打印对象时, 将调用__toString()方法, 打印方法返回的 字符串内容 function __toString(){ return "[name:{$this->name},age:{$this->age}]";//数组格式 [name:zhangsan,age:14] //return "{name:{$this->name},age:{$this->age}}";//对象格式 {name:zhangsan,age:14} } echo $zhangsan;//echo 只能打印字符串 【__call()】 调用类中未公开或者未定义的方法时, 将自动执行__call() 方法 自动调用时, 将给 __call()方法传递两个参数: ① 调用的方法名 ②调用方法时传递的参数, 数组格式 【__autoload()】 ① 这是唯一一个不需要在类中调用的模式方法 ② 当实例化一个不存在的类时, 将自动调用这个魔术方法 ③ 调用方法时, 将自动给__autoload()传递一个参数, 表示实例化的类名 所以, 可以根据类名, 自动导入对应的类文件(类名命名必须规范) function __autoload($class){ include "class/".strtolower($class).".class.php"; } $zhangsan = new Person();//本文件中没有Person类, 将自动执行__autoload() 并加载"class/person.class.php" 【对象的串行化与反串行化(序列化与反序列化)】 1、 串行化: 将对象通过一系列操作, 转化为一个字符串 2、反串行化: 将串行化以后的字符串, 重新转化为对象 3、什么时候使用串行化: ① 当对象需要在网络中传输的时候 ② 当对象需要持久化保存在文件或数据库中的时候 4、如何进行对象的串行化与反串行化 ① 串行化: $str = serialize($zhangsan); ② 反串行化: $obj = unserialize($str); 5、__sleep()魔术方法: ① 当执行对象串行化时, 会自动执行__sleep()方法 ② __sleep()方法要求返回一个数组, 数组中的值就是可以串行化的属性, 不在数组中的值, 将不能串行化 function __sleep(){ return ["name"]; // 只有name属性, 可以进行串行化 } 6、__wakeup()魔术方法: ① 当执行对象反串行化时, 自动执行 ② 自动调用时, 用于给反串行化新产生的对象赋默认值 function __wakeup(){ $this->name = "lisi"; //$this 指向反串行化新产生的对象 } 【json_encode 和 json_decode 对数组和对象进行串行化】 1、json_encode: 将对象和数组, 串行化为一个JSON字符串 $str = json_encode($arr); 2、json_decode: 将JSON字符串, 反串行化为对象或数组 第一个参数: 为JSON字符串 第二个参数: 为true 或 false, true表示转为数组, false 表示转为对象(默认) $obj = json_decode($str); $arr = json_decode($str,true); 【类型约束】 1、类型约束: 在变量前加上数据类型, 用于约束变量只能存放对应数据类型的值(这种操作子强类型语言中非常常见, 在PHP中, 只能实现数组和对象(属于符合类型)的约束, 不能约束标量和特殊类型) 2、在PHP 中, 类型约束, 只能发生在函数的形参中, 声明普通的变量, 不能进行类型约束 function func(array $arr){} √ array $arr = []; × 3、如果类型约束为一个类, 则本类或者子类的所有对象, 都可通过约束 class Person{} class Student extends Person{} function func(Person $num){} func(new Person()); √ func(new Student()); √ func("1111"); × 【魔术方法小总结】 1、__construct(): 构造函数, new一个对象时, 自动调用, 用于给对象赋初值 2、__destruct() : 析构函数, 当 一个对象被销毁时, 自动调用 3、__set(): 当 给对象的非公开属性赋值时, 自动调用; 参数: 属性名, 属性值 4、__get(): 当读取对象的非公开属性赋值时, 自动调用; 参数: 属性名; 返回值: $this->属性名; 5、__isset(): 当使用__isset()检测对象私有属性时, 自动调用; 参数: 属性名; 返回值: isset($this->属性名); 6、__unset(): 当使用__unset()删除对象私有属性时, 自动调用; 参数: 属性名; 在方法中执行unset($this->属性名); 7、__clone(): 当使用clone关键字克隆对象时, 自动调用; 用于给新客隆对象赋初值 8、__toString(): 当使用echo语句打印对象时, 自动调用; 返回值: 需要打印的内容 9、__call(): 当执行对象中非公开的方法时, 自动调用; 参数: 调用的方法名, 数组格式的参数列表, 返回值随意 10、__autoload(): 唯一一个在类外使用的魔术方法, 当实例化一个没有生命的类时自动调用。 参数: 实例化的类名 作用: 在函数中include对应的类文件 11、__sleep(): 当对象序列化时自动调用, 返回值: 数组格式, 表示能够序列化的属性名 12、__wakeup(): 当对象反序列化时自动调用, 作用: 给新产生的对象赋初值