PHP基础之 重载 的实现方式
===================PHP中的伪重载Overloading==================
PHP中没有像C#或java中的重载,但可以通其它方法实现重载
重载:属性重载与方法重载
属性重载:
__set($proName,$val)给变量设值、__get($proName)给变量赋值
在PHP5.1以后有__isset($proName)检查变量是否存在、_unset($proName)释放变量
给私有的或未定义的类的变量取值和赋值时,会自动调用__get()和_set()方法
方法的重载:
[不能通过多个构造函数或多个方法名相同的方法来实现重载]
方法一:通过‘魔术方法’:__call($methodName,$prams) 、__callStatic($methodName,$prams)来实现方法的重载[参数只能值传递]
方法二:通过判断参数个数和类型来实现重载
当调用一个不可访问方法(如未定义,或者不可见)时,__call() 会被调用。[PHP5.3手册]
当在静态方法中调用一个不可访问方法(如未定义,或者不可见)时,__callStatic() 会被调用。[PHP5.3手册]
<?php
class Overloading
{
private $oName;
private $oCount; //使用__set()来约束所有的私有属性
public function __set($proName,$val)
{
if($proName=="oName"){
$this->oName=$val;
}elseif ($proName=="oCount") {
if($val>0)
{
$this->oCount=$val;
}else
{
echo "赋值失败,必须大于0\n";
}
}
} //使用__get()来获取的私有属性
public function __get($proName)
{
if(isset($proName))
{
return $this->proName;
}
else
{
return null;
}
} //外部在调用未定义的静态方法时,被自动调用
public static function __callStatic($methodName,$prams)
{
if($methodName=="Sum")
{ echo "静态方法:'$methodName' 被调用了,参数:". implode(', ', $prams). "\n";
}
} //外部在调用未定义的方法时,被自动调用
public function __call($method,$prams)
{
if($method=="JiSuan")
{
if(count($prams)==2&&is_int($prams[0])){
return $this->JiSuan1($prams[0],$prams[1]);
}
elseif (count($prams)==3) {
return $this->JiSuan2($prams[0],$prams[1],$prams[2]);
}
}
} public function JiSuan1($n1,$n2)
{
return $n1+$n2;
} public function JiSuan2($n1,$n2,$n3)
{
return $n1*$n2*$n3;
} //通过判断参数个数和类型is_int()/is_array()来实现重载
public function Compute()
{
$args = func_get_args();
switch (func_num_args()) {
case 2:
return $this->JiSuan1($args[0],$args[1]);
case 3:
return $this->JiSuan2($args[0],$args[1],$args[2]);
}
} } $o1 = new Overloading(); echo $o1->oName="小强"."\n";
echo ($o1->oCount=2)."\n";
echo ($o1->oCount=-1)."\n\n";//因为赋值失败,返回值为-1 //调用未定义的实例方法(通过_call()内部来判断方法名和参数个数和类型实现方法重载)
echo "两个数的和:".$o1->JiSuan(55,5)."\n";
echo "三个数的积:".$o1->JiSuan(5,5,5)."\n\n"; //调用未定义的静态方法(通过_callStatic()内部来判断方法名和参数个数和类型实现静态方法的重载)
Overloading::Sum(3,2,1); //调用公共方法(内部判断参数 实现重载)
echo "两个数的和:".$o1->Compute(5,6)."\n";
echo "三个数的积:".$o1->Compute(2,2,2)."\n\n"; /*
输出结果:
小强
2
赋值失败,必须大于0
-1 两个数的和:60
三个数的积:125 静态方法:'Sum' 被调用了,参数:3, 2, 1
两个数的和:11
三个数的积:8
*/
PHP基础之 重载 的实现方式的更多相关文章
- Javascript基础 函数“重载”
Javascript不像其他编程语言一样具有函数签名(什么是函数签名,简单的说就是说函数的接受参数类型和参数个数,也有人认为返回类型也应该包括.具体概念大家可以到网上查询). 所以Javascript ...
- 【java基础】重载与重写
前言 : 很早的时候,我就知道这两个东西,但是,也仅仅是停留在知道的程度而已,对于什么是重写,什么事重载,还是感到十分的迷惑,迷茫.正好,在软考复习时又经历这两个东西,细心一点,探究了一下,有点收获, ...
- Java基础-方法重载和方法重写的区别
什么是java方法重载 (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2) ...
- C++基础——运算符重载友元函数示例
一.前言 其实本人学习C++的目的,只是为了体会OOP设计思想,并为利用System Verilog验证复杂设计做准备.如果想要真正做点软件方面项目级的东西,还需要掌握其他高级语言和库.框架等知识.因 ...
- 附录A培训实习生-面向对象基础方法重载(3)
就上一篇代码而言,你如果写Cat cat = new Cat();会直接报错错误 : 1 “Cat”方法没有采用“0”个参数的重载 E:\大话设计模式学习\BigDesignPattern ...
- Thead基础及两种创建方式
今天本人给大家讲解一下多线程,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 说说多线程本人自己对它理解的定义:因计算机的CPU支持能够在同一时间执行多于一 ...
- [CSS布局基础]居中布局的实现方式总结
[原创]码路工人 Coder-Power 大家好,这里是码路工人有力量,我是码路工人,你们是力量. github-pages 博客园cnblogs 做Web开发少不了做页面布局.码路工人给大家总结一下 ...
- Python基础-字符串格式化_百分号方式_format方式
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- C++学习基础八——重载输入和输出操作符
一.重载输入操作符的要点: 1.返回值为istream &. 2.第一个参数为istream &in. 3.第二个参数为自定义类型的引用对象(例如Sales_Item &ite ...
随机推荐
- Spring MVC exception - Invoking request method resulted in exception : public static native long java.lang.System.currentTimeMillis()
最近在线上系统发现下面的异常信息: 2014-10-11 11:14:09 ERROR [org.springframework.web.servlet.mvc.annotation.Annotati ...
- 第二次作业——C++学习
课程选择: 以往在自学的过程就比较留意一些自学的网站,所以这次"C++自学"感觉找课程还是比较轻松的. 因为之前网页等学习都是在慕课网(视频学习个人感觉有时挺费时间的,特别是有时以 ...
- 基于UDP协议的程序设计
使用UdpClient类进行编程 UdpClient类的使用方法 第一阶段 创建UdpClient实例 UdpClient udpClient = new UdpClient(); IPAddress ...
- POJ - 1511 Invitation Cards(Dijkstra变形题)
题意: 给定一个有向图,求从源点到其他各点的往返最短路径和.且这个图有一个性质:任何一个环都会经过源点. 图中的节点个数范围:0-100w; 分析: 我们先可以利用Dijkstra算法求解从源点到其余 ...
- [COCI2012Final]Pro1
校内OJ上的题. 数据范围非常小,用暴搜就可以,加点剪枝阶乘级别的复杂度竟然可以跑得比$O(N^4)$的算法还要快QAQ. 我用的是Floyd,参考了别人的代码.大概就是先跑个Floyd把点点之间路径 ...
- CF724C: Ray Tracing
传送门 CF的题质量真心不低,这道题的标准解法(应该)是exgcd,打比赛的时候想到了具体的推导公式了,也意识到了需要用exgcd,但是因为寝室要锁门了(其实就是太弱,就放弃了. 首先很显然,这条线所 ...
- 百度云管家 5.3.6 VIP破解不限速版下载分享|百度云管家破解提速
百度云管家PC客户端v5.3.6绿色版本,属于VIP破解不限速版.百度网盘为您提供文件的网络备份.同步和分享服务.空间大.速度快.安全稳固,支持教育网加速,支持手机端.它支持便捷地查看.上传.下载云端 ...
- Navicat 的使用(一)
1.创建连接 主机名 : 可以不写名称随意 主机名/IP地址:localhost或者127.0.0.1 都是本机的意思 端口:默认3306 尽量不要改怕与其余端口重复,如有重名端口系统会报错 用户 ...
- js002-在HTML中使用JavaScript
js002-在HTML中使用JavaScript 2.1 <script>元素 定义了以下6个属性 async: 可选.表示应该立即下载脚本,但不妨碍页面中的 ...
- Win7、Ubuntu双系统正确卸载Ubuntu系统
正确的删除ubuntu方法如下: 第1步,修复MBR 1.进入win7,下载个软件MbrFix,放在C:windowssystem32文件夹中 2.点击开始>所有程序>附件>命令提示 ...