本文实例讲述了PHP面向对象程序设计重载(overloading)操作。分享给大家供大家参考,具体如下:
重载
PHP中的”重载”与其它绝大多数面向对象语言不同,只是他们都是用的相同的名词而已。传统的”重载”是用于提供多个同名的 类方法,但各方法的参数类型和个数不同。 PHP所提供的”重载”(overloading)是指动态地”创建”类属性和方法。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。是通过魔术方法(magic methods)来实现的。
一般来说,把类中的成员属性都定义为private的,这更符合现实的逻辑,能够更好的对类中成员起到保护作用。但是,对成员属性的读取和赋值操作是非常频繁的,而如果在类中为每个私有属性都定义可以在对象的外部获取和赋值的公有方法,又是非常非常烦恼的。因此在PHP5.1.0以后的版本中,预定义了两个方法“__get()”和“__set()”,用来完成对所用私有属性都能获取和赋值操作,以及用来检查私有属性是否存在的方法“__isset()”和用来删除对象中私有属性方法“__unset()”。
通俗一点来说,重载在php中的含义是指,当一个对象或类使用其未定义或不可见的属性和方法时,其中的一些“处理机制”。
属性重载
对一个对象不存在的属性进行使用时,这个类中预先设定好的应对办法(处理机制)。
属性,本质就是变量,其只有4个操作:
取值:
当对一个对象不存在(未定义或不可见)的属性进行“取值”时,就会自动调用方法:__GET()
方法不区分大小写。
赋值:
当对一个对象不存在(未定义或不可见)的属性进行“赋值”时,就会自动调用方法:__SET()
判断(isset):
当对一个对象不存在(未定义或不可见)的属性进行isset()判断时,就会自动调用方法:isset()
销毁(unset):
当对一个对象不存在的(未定义或不可见)属性进行unset()判断时,就会自动调用方法:unset()
以上4个方法,被称为魔术方法。
魔术方法
__GET($属性名):
在对一个对象不存在的属性进行“取值”的时候,会自动调用的方法,其中该方法可以带一个形参,表示要对之取值而又不存在的属性名(字符串),可以使用该方法对意外情况进行某种特殊的处理。
例如:
<"htmlcode"><"<br />{$prop_name}属性还未定义(不存在)!"; return ""; //也可以返回0,或false等 */ //还可以这样处理 trigger_error("发生错误:属性不存在!", E_USER_ERROR); die(); } } $a1 = new A(); echo $a1->p1; //1 echo $a1->p2; //未定义$p2,但经过"处理" "htmlcode"><"name=$v1, sex=$v2, age=$v3"; "color: #339966">__SET($属性名, 值):当对一个对象不存在的属性进行“赋值”时,就会自动调用这个内部的魔术方法;其有2个形参,分别代表要对不存在的属性进行赋值的“属性名”和“属性值”。
这个方法,结合_GET方法,往往可以使我们定义的类,有一种可扩展的特性。即:类或对象的属性,可以更为方便自由。例子:
<"使用不存在的属性!"; $this->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 "<br />输出这些“不存在的属性”的值:"; echo "<br />a1->p1:" . $a1->p1; //不存在的属性名取值,此时会调用_get(),并传过去"p1" echo "<br />a1->p2:" . $a1->p2; echo "<br />a1->ac:" . $a1->ac; "color: #339966">__ISSET($属性名):当对一个对象不存在的属性进行
isset()
判断时,就会自动调用内部方法:isset()
;用法:
$v1 = isset($对象->不存在的属性); //此时会调用这个对象所属类中的魔术方法:isset()例子:
<"使用不存在的属性!"; $this->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 "<br />输出这些“不存在的属性”的值"; echo "<br />a1->p1:" . $a1->p1;//不存在的属性名取值,此时会调用_get(),并传过去"p1" echo "<br />a1->p2:" . $a1->p2; echo "<br />a1->ac:" . $a1->ac; //下面演示isset判断不存在的属性 $v1 = isset($a1->p1); //存在 $v2 = isset($a1->ppp1); //不存在 var_dump($v1); echo "<br />"; var_dump($v2); "color: #339966">__UNSET($属性名)当对一个对象不存在的属性进行
unset()
销毁时,就会自动调用内部方法:unset()
;<"使用不存在的属性!"; $this->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 "<br />a1->p1:" . $a1->p1;//不存在的属性名取值,此时会调用_get(),并传过去"p1" //下面演示unset销毁一个不存在的属性 unset($a1->p1); echo "<br />a1->p1:" . $a1->p1; "htmlcode"><"名字:" . $this->name . ",性别:" . $this->sex . ",年龄:" . $this->age . "<br />"; } } $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,性别:,年龄: "font-size: medium">方法重载当对一个对象不存在的实例方法进行“调用”时,会自动调用类中的
__call()
这个魔术方法;当对一个类不存在的静态方法进行“调用”时,会自动调用类中的
__callstatic()
这个魔术方法。例子:直接调用不存在的方法
<"htmlcode"><"__call被调用了!"; echo $methodName . "()方法不存在!"; } } $a = new A(); $a->f1(); //不存在的方法,但经过处理 "_blank" href="//www.jb51.net/Special/43.htm">php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》希望本文所述对大家PHP程序设计有所帮助。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com桃源资源网 Design By www.nqtax.com暂无“PHP面向对象程序设计重载(overloading)操作详解”评论...