zhaowj00 2020-02-17
思考:php对象复合数据类型,如果直接echo 输出对象会报错的,这样的报错会给用户体验不好,有没有办法能够解决这类问题呢?
引入:虽然上述问题出现是因为程序员的误操作,但是的确有可能出现这样的问题,尤其是我们的程序是给外部调用时,所以,面向对象关于很多对象可能出现
了一种容错机制,这种机制叫做重载。
定义 重载overload,本意指一个类中可以出现多个同名方法,彼此之间的参数个数和类型不一样,但是php中不支持同名方法,而且也不区分数据类型(所类型语言)
所以php不支持传统重载,php中的重载指的是当某些不允许操作发生时,会自动调用的一种内部机制,即自动调用相关的魔术方法。
1.魔术方法:指系统为类中预先设计好的,只需要开发者实际的方法,魔术方法以双下划线__开头,对象在某些特定情况下会自动调用的方法,构造方法,析构方法和克隆方法就是魔术方法
<?php class posoen{ public $name; } $s=new man(); //实例化后对象自动调用 触发时机:对象实例化
2.php重载是指某些容错处理(也可以理解:为了某些特殊情况下而自动调用),在访问没有权限或者不存在的属性或者方法的时候,会自动触发的魔术方法
方法重载
属性重载
3.属性重载:当php对象访问不存在的或这没有权限访问的属性时候会自动调用的方法
__get($key):读属性的时候触发
__set($key):写属性的时候触发
__inset($key):外部调用isset()函数或者empty()函数时自动触发
__unset($key):外部调用isset()结构删除对象属性时自动触发
__tostring():对象被当作普通变量输出或者连接时自动调用
<?php class posen{ private $name=‘duwei‘; //重载方法 //读取重载 function __get($key){ echo $key.__METHOD__.‘<br>‘; } //写重载 function __set($key,$values){ echo $key.‘:‘.$values.__METHOD__.‘<br>‘; } //判定重载 function __isset($key){ echo $key.__METHOD__.‘判定了我‘."<br>"; } //删除重载 function __unset($key){ echo $key.__METHOD__.‘你想删除我‘.‘<br>‘; } //普通输出 function __tostring(){ echo ‘-----‘.__METHOD__.‘还是我‘.‘<br>‘; return ‘不可能‘; } } $s=new posen(); //实例化后对象自动调用 触发时机:对象实例化 //访问 echo $s->name; //类中私有属性,外部访问 提示name posen__get() //设置 $s->name="tianguo"; //给私有属性赋值,本来就会报错 所以触发了__set() //判定 isset($s->name); //判定私有属性也会报错 出发了__isset();.......... //删除 unset($s->name); //输出 echo $s; //输出对象,报错 触发__tostring()
4.属性重载的目的:一方面为了不让程序运行出错,另一方面可以在类内部由我们自己控制内容的访问。
<?php class posen{ private $name=‘duwei‘; //私有不允许外部访问 private $age=‘80‘; //重载方法 //读取重载 function __get($key){ //定义一个允许访问列表:假设有很多私有属性 $list=array(‘age‘); //判断是否在列表内,在就允许访问,不在就返回null或者false if(in_array($key,$list)){ return $this->$key; //可变属性;$key是外部访问的目标,最终为$this->age; }else{ return ‘抱歉,这个属性不能访问‘; } } //写重载 function __set($key,$value){ if($value<50){ $this->$key=$value; }else{ echo ‘这个数值我不能接受‘; } } } $s=new posen(); echo $s->name; //输出抱歉,这个属性不能访问 $s->age=33; //设置成功 $s->age=100; //设置失败 这个值我不能接受 echo $s->age; //输出33
注意:属性的重载,就相当于c#中的属性get和set,非常相似。
可变参数,就相当于__construct()函数一样,当你实例化一个类的时候,调用的是构造函数__construct(),如果构造函数中有参数,必须在
实例化的时候也要添加上参一样,比如我们读取的操作,就是调用了__get($key)函数,其中$key 就是我们在外部调用对象输出的属性($s->name)name就是$key
读:指定访问列表,在就允许,不在就null或false
写:与get理论相似:允许就设置,不允许就说明都不操作
判定:给出内部判定结果
输出普通:返回一个指定的字符串(一般当类有属性保存某些信息时,输出某个属性)
<?php. if (!empty($_POST)) {. $data1 = $_POST["data1"];$data2 = $_POST["data2"];$fuhao = $_POST["fuh