查看PHP的重载与覆盖及魔术方法使用的源代码
←
PHP的重载与覆盖及魔术方法使用
跳转至:
导航
、
搜索
因为以下原因,你没有权限编辑本页:
你刚才请求的操作只对属于该用户组的用户开放:
用户
您可以查看并复制此页面的源代码:
'''重载'''(overload),是发生在同一类中(与什么父类子类、继承毫无关系) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载overload是一个类中多态性的一种表现。 '''覆盖'''(override), 是发生在子类中,(也就是说必须有继承的情况下才有覆盖发生) 子类继承一个类,也就有了父类了全部方法,如果功能要变,那就把那个函数在子类中重新实现一遍。覆盖override也是一个类多态性的一种表现 严格意义上讲:重载必须函数名相同,参数在类型或者参数个数上必须有所不同,子类中具有与父类相同的返回类型及参数表,子类方法覆盖父类方法 PHP是弱类型语言,不支持严格意义上的重载,重写则对参数类型和个数也没有严格要求。 重写实例: <?php class Animal{ $height = 1; public function eat($energy){ $this->height = $this->height+$energy/1000; } } class Cat extend Animal{ public function eat($energy){ $this->height = $this->height+energy/2000; } } $smallCat = new Cat(); $energy= 1000; $smallCat->eat($energy); ?> 由于PHP不支持重载,但是可以曲线救国,实现方法就是使用PHP5.3的新特性:魔术方法__call(),__callStatic() 重载实例: <?php class Cat{ public $height = 1; public $weight = 1; public function __call($name,$arg){ $count = count($arg); if($count>0){ switch($count){ case 1: $this->height++; break; case 2: $this->height++; $this->weight++; break; default : $this->height = $this->height+2; $this->weight = $this->weight+2; break; } } } } $smallCat = new Cat(); $<span>fruit</span> = 1; $meat = 1; $smallCat->eat($<span>fruit</span>); $smallCat->eat($<span>fruit</span>,$meat); } ?> 如果是静态调用使用__callStatic,用法同上 <span style="font-size:14px"><span style="color:#ff0000">__call</span> 当要调用的方法不存在或权限不足时,会自动调用__call 方法。</span> <span style="font-size:14px"><span style="color:#ff0000">__callStatic</span> 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。</span> <span style="font-size:14px">'''__call($funcname, $arguments)'''</span> <span style="font-size:14px">'''__callStatic($funcname, $arguments)'''</span> <br/><span style="font-size:14px; color:#ff0000">'''参数说明:'''</span> <span style="font-size:14px">'''$funcname''' String 调用的方法名称。</span> <span style="font-size:14px">'''$arguments''' Array 调用方法时所带的参数。</span> '''<span style="font-size:14px; color:#ff0000">__call 例子</span>''' <div class="dp-highlighter bg_php"> #<span><span><?php </span></span> #<span> </span> #<span><span class="keyword">class</span><span> Member{ </span></span> #<span> </span> #<span> <span class="keyword">protected</span><span> </span><span class="vars">$memberdata</span><span> = </span><span class="keyword">array</span><span>(); </span></span> #<span> </span> #<span> <span class="keyword">public</span><span> </span><span class="keyword">function</span><span> __call(</span><span class="vars">$func</span><span>, </span><span class="vars">$arguments</span><span>){ </span></span> #<span> list(<span class="vars">$type</span><span>, </span><span class="vars">$name</span><span>) = </span><span class="func">explode</span><span>(</span><span class="string">'_'</span><span>, </span><span class="vars">$func</span><span>); </span></span> #<span> </span> #<span> <span class="keyword">if</span><span>(!in_array(</span><span class="vars">$type</span><span>, </span><span class="keyword">array</span><span>(</span><span class="string">'set'</span><span>,</span><span class="string">'get'</span><span>)) || </span><span class="vars">$name</span><span>==</span>''<span>){ </span>''</span> #<span> <span class="keyword">return</span><span> </span>''<span>; </span>''</span> #<span> } </span> #<span> </span> #<span> <span class="keyword">switch</span><span>(</span><span class="vars">$type</span><span>){ </span></span> #<span> <span class="keyword">case</span><span> </span><span class="string">'set'</span><span>: </span></span> #<span> <span class="vars">$this</span><span>->memberdata[</span><span class="vars">$name</span><span>] = </span><span class="vars">$arguments</span><span>[0]; </span></span> #<span> <span class="keyword">break</span><span>; </span></span> #<span> </span> #<span> <span class="keyword">case</span><span> </span><span class="string">'get'</span><span>: </span></span> #<span> <span class="keyword">return</span><span> isset(</span><span class="vars">$this</span><span>->memberdata[</span><span class="vars">$name</span><span>])? </span><span class="vars">$this</span><span>->memberdata[</span><span class="vars">$name</span><span>] : </span>''<span>; </span>''</span> #<span> <span class="keyword">break</span><span>; </span></span> #<span> </span> #<span> <span class="keyword">default</span><span>: </span></span> #<span> } </span> #<span> </span> #<span> } </span> #<span> </span> #<span>} </span> #<span> </span> #<span> </span> #<span><span class="keyword">class</span><span> User </span><span class="keyword">extends</span><span> Member{ </span></span> #<span> </span> #<span> <span class="keyword">public</span><span> </span><span class="keyword">function</span><span> show(){ </span></span> #<span> <span class="keyword">if</span><span>(</span><span class="vars">$this</span><span>->memberdata){ </span></span> #<span> <span class="keyword">foreach</span><span>(</span><span class="vars">$this</span><span>->memberdata </span><span class="keyword">as</span><span> </span><span class="vars">$key</span><span>=></span><span class="vars">$member</span><span>){ </span></span> #<span> <span class="func">echo</span><span> </span><span class="vars">$key</span><span>.</span><span class="string">':'</span><span>.</span><span class="vars">$member</span><span>.</span><span class="string">'<br>'</span><span>; </span></span> #<span> } </span> #<span> } </span> #<span> } </span> #<span> </span> #<span>} </span> #<span> </span> #<span> </span> #<span><span class="keyword">class</span><span> Profession </span><span class="keyword">extends</span><span> Member{ </span></span> #<span> </span> #<span> <span class="keyword">public</span><span> </span><span class="keyword">function</span><span> show(){ </span></span> #<span> <span class="keyword">if</span><span>(</span><span class="vars">$this</span><span>->memberdata){ </span></span> #<span> <span class="keyword">foreach</span><span>(</span><span class="vars">$this</span><span>->memberdata </span><span class="keyword">as</span><span> </span><span class="vars">$key</span><span>=></span><span class="vars">$member</span><span>){ </span></span> #<span> <span class="func">echo</span><span> </span><span class="vars">$key</span><span>.</span><span class="string">':'</span><span>.</span><span class="vars">$member</span><span>.</span><span class="string">'<br>'</span><span>; </span></span> #<span> } </span> #<span> } </span> #<span> } </span> #<span> </span> #<span>} </span> #<span> </span> #<span><span class="vars">$userobj</span><span> = </span><span class="keyword">new</span><span> User(); </span></span> #<span><span class="vars">$userobj</span><span>->set_name(</span><span class="string">'fdipzone'</span><span>); </span></span> #<span><span class="vars">$userobj</span><span>->set_age(29); </span></span> #<span><span class="vars">$userobj</span><span>->show(); </span></span> #<span> </span> #<span><span class="vars">$probj</span><span> = </span><span class="keyword">new</span><span> Profession(); </span></span> #<span><span class="vars">$probj</span><span>->set_profession(</span><span class="string">'IT SERVICE'</span><span>); </span></span> #<span><span class="vars">$probj</span><span>->set_price(2500); </span></span> #<span><span class="vars">$probj</span><span>->show(); </span></span> #<span> </span> #<span>?> </span> <span style="font-size:14px; color:#ff0000">'''_callStatic例子'''</span> <div class="dp-highlighter bg_php"> #<span><span><?php </span></span> #<span> </span> #<span><span class="keyword">class</span><span> Member{ </span></span> #<span> </span> #<span> <span class="keyword">protected</span><span> </span><span class="keyword">static</span><span> </span><span class="vars">$memberdata</span><span> = </span><span class="keyword">array</span><span>(); </span></span> #<span> </span> #<span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">function</span><span> __callStatic(</span><span class="vars">$func</span><span>, </span><span class="vars">$arguments</span><span>){ </span></span> #<span> </span> #<span> list(<span class="vars">$type</span><span>, </span><span class="vars">$name</span><span>) = </span><span class="func">explode</span><span>(</span><span class="string">'_'</span><span>, </span><span class="vars">$func</span><span>); </span></span> #<span> </span> #<span> <span class="keyword">if</span><span>(!in_array(</span><span class="vars">$type</span><span>, </span><span class="keyword">array</span><span>(</span><span class="string">'set'</span><span>,</span><span class="string">'get'</span><span>)) || </span><span class="vars">$name</span><span>==</span>''<span>){ </span>''</span> #<span> <span class="keyword">return</span><span> </span>''<span>; </span>''</span> #<span> } </span> #<span> </span> #<span> <span class="vars">$feature</span><span> = get_called_class(); </span></span>//获取静态方法调用的类名 #<span> </span> #<span> <span class="keyword">switch</span><span>(</span><span class="vars">$type</span><span>){ </span></span> #<span> <span class="keyword">case</span><span> </span><span class="string">'set'</span><span>: </span></span> #<span> self::<span class="vars">$memberdata</span><span>[</span><span class="vars">$feature</span><span>][</span><span class="vars">$name</span><span>] = </span><span class="vars">$arguments</span><span>[0]; </span></span> #<span> <span class="keyword">break</span><span>; </span></span> #<span> </span> #<span> <span class="keyword">case</span><span> </span><span class="string">'get'</span><span>: </span></span> #<span> <span class="keyword">return</span><span> isset(self::</span><span class="vars">$memberdata</span><span>[</span><span class="vars">$feature</span><span>][</span><span class="vars">$name</span><span>])? self::</span><span class="vars">$memberdata</span><span>[</span><span class="vars">$feature</span><span>][</span><span class="vars">$name</span><span>] : </span>''<span>; </span>''</span> #<span> <span class="keyword">break</span><span>; </span></span> #<span> </span> #<span> <span class="keyword">default</span><span>: </span></span> #<span> } </span> #<span> </span> #<span> } </span> #<span> </span> #<span>} </span> #<span> </span> #<span> </span> #<span><span class="keyword">class</span><span> User </span><span class="keyword">extends</span><span> Member{ </span></span> #<span> </span> #<span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">function</span><span> show(){ </span></span> #<span> </span> #<span> <span class="vars">$feature</span><span> = get_called_class(); </span></span> #<span> </span> #<span> <span class="keyword">if</span><span>(self::</span><span class="vars">$memberdata</span><span>[</span><span class="vars">$feature</span><span>]){ </span></span> #<span> <span class="keyword">foreach</span><span>(self::</span><span class="vars">$memberdata</span><span>[</span><span class="vars">$feature</span><span>] </span><span class="keyword">as</span><span> </span><span class="vars">$key</span><span>=></span><span class="vars">$member</span><span>){ </span></span> #<span> <span class="func">echo</span><span> </span><span class="vars">$key</span><span>.</span><span class="string">':'</span><span>.</span><span class="vars">$member</span><span>.</span><span class="string">'<br>'</span><span>; </span></span> #<span> } </span> #<span> } </span> #<span> } </span> #<span> </span> #<span>} </span> #<span> </span> #<span> </span> #<span><span class="keyword">class</span><span> Profession </span><span class="keyword">extends</span><span> Member{ </span></span> #<span> </span> #<span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">function</span><span> show(){ </span></span> #<span> </span> #<span> <span class="vars">$feature</span><span> = get_called_class(); </span></span> #<span> </span> #<span> <span class="keyword">if</span><span>(self::</span><span class="vars">$memberdata</span><span>[</span><span class="vars">$feature</span><span>]){ </span></span> #<span> <span class="keyword">foreach</span><span>(self::</span><span class="vars">$memberdata</span><span>[</span><span class="vars">$feature</span><span>] </span><span class="keyword">as</span><span> </span><span class="vars">$key</span><span>=></span><span class="vars">$member</span><span>){ </span></span> #<span> <span class="func">echo</span><span> </span><span class="vars">$key</span><span>.</span><span class="string">':'</span><span>.</span><span class="vars">$member</span><span>.</span><span class="string">'<br>'</span><span>; </span></span> #<span> } </span> #<span> } </span> #<span> } </span> #<span> </span> #<span>} </span> #<span> </span> #<span>User::set_name(<span class="string">'fdipzone'</span><span>); </span></span> #<span>User::set_age(29); </span> #<span>User::show(); </span> #<span> </span> #<span>Profession::set_profession(<span class="string">'IT SERVICE'</span><span>); </span></span> #<span>Profession::set_price(2500); </span> #<span>Profession::show(); </span> #<span> </span> #<span>?> </span> </div></div>
返回
PHP的重载与覆盖及魔术方法使用
。
导航菜单
个人工具
创建账户
登录
名字空间
页面
讨论
变种
查看
阅读
查看源代码
查看历史
操作
搜索
导航
wiki首页
API文档说明
数据结构变更
技术开发文档
市场相关文档
产品相关文档
前端相关文档
测试相关文档
运维相关文档
编辑运营文档
入职帮助手册
周末值班安排
开发小组规范
数据查询文档
知识分享计划
wiki语法手册
客户端相关文档
工具箱
链入页面
相关更改
特殊页面
页面信息