PHP中重载与重写区别 如何实现重载,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手册]

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

*/

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 ...

随机推荐

PowerShell自动部署IIS站点(Windows Server 2008 R2)

1.功能描述 1. 连接软件源服务器下载.NET Framework 4.0..NET Framework 4.5. 2. 检测并判断当前.NET Framework版本是否小于v4.0,如果小于则进 ...

BZOJ 3672 [Noi2014]购票 (熟练剖分+凸壳维护)

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3672 题意:给出一棵有根树(1为根),边有长度.每个点u有三个属性(len[u], ...

iOS开发 iOS10推送必看

iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说.希望看完我的这篇文章,对大家有所帮助. 一.简单入门篇---看完就可以简单适配完了 相对简单的推送证书以及环境的问题,我就不在这 ...

jquery获取表单的值

你可能感兴趣的:(PHP中重载与重写区别,如何实现重载)