php中对象
2021-05-15 13:28
标签:需要 加载 hang 属性 bsp 网络 一个 new func php中对象 标签:需要 加载 hang 属性 bsp 网络 一个 new func 原文地址:http://www.cnblogs.com/HRurl/p/7751539.html【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(): 当对象反序列化时自动调用, 作用: 给新产生的对象赋初值