PHP提出面向对象以来,就有着各种各样的问题,其中,不直接支持对象方法重载就是一个让人纠心的问题,在其他语言里面,大可以有以下写法(以下是C++写法):

class Abc(){public function a( int x){cout<<x<<endl;}public function a( int x , int y){cout<<x<<endl;cout<<y<<endl;}
}Abc aa = new Abc();
aa.a(1);//1
aa.a(1,2)//1   2

这些方法,在某些时候是非常有用的。可是,在PHP里面如果 你直接在一个类里面定义两个函数名一样的函数(即使他们的参数个数不一样),是会报错的。

所以对于PHP我们要实现方法重载就只能另辟他径了,下面我给出两种方式:

一、利用__call函数

在 PHP 中的方法调用是这样工作的。首先,PHP 解释器在类上查找方法。如果方法存在,PHP 就调用它。如果没有,那么就调用类上的魔术函数 __call(如果这个方法存在的话)。如果 __call 失败,就调用父类方法,依此类推。看下面的例子:

class OverloadTest{public function __call($name,$para){if($name=='construct'){switch (count($para)){case 0:$this->cons1();break;case 1:$this->cons2($para[0]);break;default:print "wrong para";}}else{print 'Undefined method '.$name;}}function cons1(){echo "cons1() called";}function cons2($var){echo "cons2() called.";}
}
$foo = new OverloadTest();
$foo->construct();
$foo->construct('test');

二、使用func_get_args()和func_num_args()函数获取参数个数

这两个函数分别是获取函数的参数列表及参数长度。根据参数长度,我们可以有跟上面一样的做法,但是这个方法看起来更和谐点。看下面的例子:

class OverloadTest{public function __construct{$args = func_get_args();switch (func_num_args()){case 0:$this->_cons1();break;case 1:$this->_cons2($args[0]);break;default:print "wrong para";}}private function _cons1(){echo "cons1() called";}private  function _cons2($var){echo "cons2() called.";}
}
$foo = new OverloadTest();
$foo->construct();
$foo->construct('test');

两种方式都算是比较容易的实现了函数重载,但是这种模拟的做法也只是临时之计,希望PHP在未来面象对象的实现能够更全面一些。

转载于:https://www.cnblogs.com/zernmal/p/3733960.html

PHP的方法重载实现相关推荐

  1. 没有与参数列表匹配的 重载函数 getline 实例_面试题:方法重载的底层原理?...

    前语:微信改版后,大量读者还没养成点赞的习惯,如写得好,望大家阅读后在右下边"好看"处点个赞,以示鼓励!长期坚持原创真的很不容易,多次想放弃,坚持是一种信仰,专注是一种态度. 关于 ...

  2. java 返回值判断_在Java中判断方法重载的条件除了参数外,还可以通过返回值类型判断。_学小易找答案...

    [单选题]若int x;且有下面的程序片断,则输出结果是() . for (x=3; x<6; x++) { printf((x%2) ? "##%d" : "** ...

  3. java基础-方法重载

    **方法重载:**同一个类方法名相同,参数列表个数或参数不同即可 口诀: "两同一不同":同一个类,相同方法名 参数列表不同:参数个数不同,参数类型不同,参数顺序不同 **注意:* ...

  4. Java 方法重载 方法重写

    方法重载规则 参数个数不同 参数个数相同,但参数列表中对应的某个参数的类型不一样 方法的返回类型和参数名称不参与重载 "编译期绑定",,因为未产生对象,只看参数.引用类型绑定方法 ...

  5. 在java中方法重载的要求,Java方法的重载

    Java方法的重载 方法重载:在类中方法名称相同,但是形式参数不同 public class Demo15 { public static void main(String[] args) { int ...

  6. java方法重载编程_学java教程之普通方法重载

    学编程吧学java教程之普通方法重载发布了,欢迎通过xuebiancheng8.com来访问 先来看什么是普通方法重载呢,先来看一个例子 public class Person{ String use ...

  7. java:方法覆盖与方法重载

    方法签名 方法签名是指方法的参数类型,顺序和个数.不包含方法名称. 重载 重载必须满足以下条件 方法名 相同 方法的参数类型,个数和顺序至少一项不同 方法的返回类型可以不同 方法的访问权限修饰符可以不 ...

  8. java构造方法可以重载吗_Java基础教程之构造器与方法重载

    在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization).初始化时,对象的数据成员被赋予初始值.我们可以显式初始化.如果我们没有给数据成员赋予初始值,数据成员 ...

  9. Java中方法重载和方法重写的区别

    文章目录 1 Java中方法重载和方法重写的区别 1 Java中方法重载和方法重写的区别 主要区别如下: 方法重载: 在同一个类中 方法名相同 参数个数.顺序.类型不同 返回值类型.访问修饰符任意 方 ...

最新文章

  1. 使用ionic cordova build android --release --prod命令打包报错解决方法
  2. 提高生产力:文件和IO操作(ApacheCommonsIO-汉化分享)
  3. 计算机科学导论第二章,计算机科学导论第二章.doc
  4. 如何设计大型游戏服务器架构?
  5. Linux内核系统调用处理过程
  6. java new collection_使用Java 8新增的Predicate操作Collection集合
  7. 解决git关联的的文件颜色、小图标
  8. java让文件隐藏文件_使用java8API遍历过滤文件目录及子目录及隐藏文件
  9. 时针与分针的夹角的易错点
  10. codereviw得到的一些经验
  11. 教你用好手中的McAfee 杀毒软件和McAfee 企业集中管理工具EPO
  12. (一)appium-desktop定位元素原理
  13. HTML静态网页作业-餐饮美食网页(HTML+CSS+JavaScript)
  14. java:123321是一个非常特殊的数,它从左边读和从右边读是一样的。   输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
  15. Opencv求取连通区域重心
  16. vscode缓存清理
  17. 计算机设备固定资产拆旧年限,固定资产折旧年限最新规定(全)
  18. mysql删除的表格怎么还原_mysql删除的表格怎么恢复数据
  19. Python 自己简单地造一个轮子.whl文件
  20. javascript实现无缝滚动

热门文章

  1. [常见错误]-bash: pg_config: command not found
  2. web服务枚举组件不可用
  3. 马歇尔计划软件测试自学,绝密本科目考试启用前及综合应用.doc
  4. SRIO学习(七)——Direct I/O 操作(二)
  5. FPGA 中 IO 口时序分析(Input Delay /output Delay)
  6. C++中getline()函数
  7. python输出特别的矩阵
  8. 解决:未找到setenv命令
  9. 遗传算法就是创造力的本质
  10. Oracle XTTS跨平台数据库迁移(从Unix迁移数据库到Linux)_Oracle数据库迁移项