【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(): 当对象反序列化时自动调用, 作用: 给新产生的对象赋初值
php中对象
原文地址:http://www.cnblogs.com/HRurl/p/7751539.html