本文实例讲述了PHP面向对象程序设计重载(overloading)操作。分享给大家供大家参考,具体如下: 重载 未定义或 不可见的类属性或方法时,重载方法会被调用。是通过魔术方法(magic methods)来实现的。 通俗一点来说,重载在php中的含义是指,当一个对象或类使用其未定义或不可见的属性和方法时,其中的一些“处理机制”。 属性重载 取值: 赋值: 判断(isset): 销毁(unset): 魔术方法 __GET($属性名): p1; //1 echo $a1->p2; //未定义$p2,会报错, Notice: Undefined property: A::$p2 ?> {$prop_name}属性还未定义(不存在)!"; return ""; //也可以返回0,或false等 */ //还可以这样处理 trigger_error("发生错误:属性不存在!", E_USER_ERROR); die(); } } $a1 = new A(); echo $a1->p1; //1 echo $a1->p2; //未定义$p2,但经过"处理" ?> name = $name; $this->sex = $sex; $this->age = $age; } private function __get($propertyName){ //这里要用private修饰,防止类外部调用 if($propertyName == 'age'){ return $this->age; } } } $p = new Person('yeoman', '男',23); $v1 = $p->name; $v2 = $p->sex; $v3 = $p->age; //自动调用了__get()方法获取私有属性age(函数定义里面返回) echo "name=$v1, sex=$v2, age=$v3"; ?> __SET($属性名, 值): prop_list[$p] = $v; } function __get($p){ return $this->prop_list[$p]; } } $a1 = new A(); $a1->p1 = 1; //不存在的属性名赋值,此时会调用_set(),并传过去"p1"和1 $a1->p2 = 2; $a1->ac = 'avc'; echo " 输出这些“不存在的属性”的值:"; echo " a1->p1:" . $a1->p1; //不存在的属性名取值,此时会调用_get(),并传过去"p1" echo " a1->p2:" . $a1->p2; echo " a1->ac:" . $a1->ac; ?> a1->p2:2 a1->ac:avc __ISSET($属性名): $v1 = isset($对象->不存在的属性); //此时会调用这个对象所属类中的魔术方法:isset() prop_list[$p] = $v; } function __get($p){ if($this->prop_list[$p]){ return $this->prop_list[$p]; }else{ return "该属性不存在!"; } } function __isset($prop){ //__isset()是自定义的方法, isset()是系统函数 $re = isset($this->prop_list[$prop]); return $re; } } $a1 = new A(); $a1->p1 = 1;//不存在的属性名赋值,此时会调用_set(),并传过去"p1"和1 $a1->p2 = 2; $a1->ac = 'avc'; echo " 输出这些“不存在的属性”的值"; echo " a1->p1:" . $a1->p1;//不存在的属性名取值,此时会调用_get(),并传过去"p1" echo " a1->p2:" . $a1->p2; echo " a1->ac:" . $a1->ac; //下面演示isset判断不存在的属性 $v1 = isset($a1->p1); //存在 $v2 = isset($a1->ppp1); //不存在 var_dump($v1); echo " "; var_dump($v2); ?> a1->p2:2 a1->ac:avc boolean true boolean false __UNSET($属性名) prop_list[$p] = $v; } function __get($p){ if($this->prop_list[$p]){ return $this->prop_list[$p]; }else{ return "该属性不存在!"; } } function __unset($prop){ unset($this->prop_list[$prop]); } } $a1 = new A(); $a1->p1 = 1;//不存在的属性名赋值,此时会调用_set(),并传过去"p1"和1 echo " a1->p1:" . $a1->p1;//不存在的属性名取值,此时会调用_get(),并传过去"p1" //下面演示unset销毁一个不存在的属性 unset($a1->p1); echo " a1->p1:" . $a1->p1; ?> a1->p1:该属性不存在!__isset() name = $name; $this->sex = $sex; $this->age = $age; } private function __isset($propertyName){ //需要一个参数,是测定的私有属性的名称 if($propertyName == 'name'){ return false; //返回假,不允许在类外部测定name属性 } return isset($this->$propertyName); //这里propertyName要加$符,因为这是参数,不是属性 } private function __unset($propertyName){ if($propertyName == 'name') return; //退出方法,不允许删除对象中的name属性 unset($this->$propertyName); //这里propertyName要加$符 } public function say(){ echo "名字:" . $this->name . ",性别:" . $this->sex . ",年龄:" . $this->age . " "; } } $person = new Person("yeoman", "男", 23); var_dump(isset($person->name)); //输出bool(false),不允许测定name属性 var_dump(isset($person->sex)); //输出bool(true),存在sex私有属性 var_dump(isset($person->age)); //输出bool(true),存在age私有属性 var_dump(isset($person->id)); //输出bool(false),测定对象中不存在id属性 unset($person->name); //删除私有属性name,但在 __unset()中不允许删除 unset($person->sex); //删除对象中的私有属性sex,删除成功 unset($person->age); $person->say(); //对象中的sex和age属性被删除,输出:名字:yeoman,性别:,年龄: ?> boolean true boolean true boolean false 名字:yeoman,性别:,年龄: 方法重载这个魔术方法;这个魔术方法。 f1(); //不存在的方法 ?> f1(); //不存在的方法,但经过处理 ?> 这个魔术方法。和上面的处理类似。php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
查看更多关于PHP面向对象程序设计重载(overloading)操作详解的详细内容...