PHP的方法重载实现
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();//
aa.a(,)//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在未来面象对象的实现能够更全面一些。
PHP的方法重载实现的更多相关文章
- java方法重载(overload)、重写(override);this、super关键简介
一.方法重载: 条件:必须在一个类中,方法名称相同,参数列表不同(包括:数据类型.顺序.个数),典型案例构 造方重载. 注意:与返回值无关 二.方法重写: 条件: (1)继承某个类或实现某接口 (2 ...
- Java之方法重载篇(我重载了,你要如何来调用我。。)
一.课前引言 请看一下代码,你发现什么特殊之处了吗? public class MethodOverload { public static void main(String[] args) { ...
- 【java开发】方法重写和方法重载概述
类的继承 父类-子类 关键字 extends 新建一个父类 public class Person { private String name; private int ...
- 方法构造和方法重载之奥特曼与大boss之战
知识点的总结: 1.类中的方法分为两类:1.普通方法: 2.构造方法. 2.构造方法的格式: public 类名(数据类型 参数名,...){ } 3.构造方法的用途: 1.实例化对象. 2. ...
- JavaScript中的方法重载
对js有些了解的人都知道,在js中根本就不存在像C#中的那种方法重载,而有的只是方法的覆盖,当你在js中敲入两个或多个同名的方法的时候,不管方法(函数)的参数个数怎么个不同,这个方法名只能属于最后定义 ...
- PHP面向对象编程——深入理解方法重载与方法覆盖(多态)
什么是多态? 多态(Polymorphism)按字面的意思就是“多种状态”.在面向对象语言中,接口的多种不同的实现方式即为多态.引用Charlie Calverts对多态的描述——多态性是允许你将父对 ...
- c#方法重载,可选参数,命名参数。
其实这里没什么可说哦,c++的语法大同小异.先看一段代码. class Program { public static void Test(int a) { Console.WriteLine(&qu ...
- WCF实现方法重载
一.服务契约(包括回调契约)通过指定不同的OperationContract.Name来实现重载方法,当然代码部份还是必需符合C#的重载要求,即相同方法名称,不同的参数个数或参数类型 namespac ...
- java中的方法重载与重写以及方法修饰符
1. 方法重载Overloading , 是在一个类中,有多个方法,这些方法的名字相同,但是具有不同的参数列表,和返回值 重载的时候,方法名要一样,但是参数类型和参数个数不一样,返回值类型可以相同,也 ...
- 方法重写和方法重载;this关键字和super关键字
1:方法重写和方法重载的区别?方法重载能改变返回值类型吗? 方法重写: 在子类中,出现和父类中一模一样的方法声明的现象. 方法重载: 同一个类中,出现的方法名相同,参数列表不同的现象. 方法重载能改变 ...
随机推荐
- jQuery通过Ajax向PHP服务端发送请求并返回JSON数据
SON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成.JSON在前后台交互的过程中发挥着相当出色的作用.请接着往下看教 ...
- Leetcode 之Anagrams(35)
回文构词法,将字母顺序打乱.可将字母重新排序,若它们相等,则属于同一组anagrams. 可通过hashmap来做,将排序后的字母作为key.注意后面取hashmap值时的做法. vector< ...
- 【hdoj_2189】来生一起走(母函数)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2189 本题的数学模型如下: 分解的问题,常用母函数求解,这里要求每个"硬币"的价值必须 ...
- Bootstrap Div 居中的方法
有两个DIV,DIV2被包含在DIV1中.格式如下: <div id="div1"> <div id="div2"> & ...
- vue利用watch侦听对象具体的属性 ~ 巧用计算属性computed做中间层
有时候需要侦听某个对象具体的属性,可以按下面案例进行: <template> <div> <input type="text" v-model=&qu ...
- 在centos 6.9安装wordpress,浏览器不能访问问题
在centos 6.9安装wordpress浏览器访问先出现403错误,然后提示access denied nginx错误打印FastCGI sent in stderr: "Unable ...
- 初步探究ES6之箭头函数
今天要介绍的是ES6中的箭头函数. 语法 我们先来看看箭头函数的语法: ([param] [, param]) => { statements } param => expression ...
- 选择排序(SelectionSort)
http://blog.csdn.net/magicharvey/article/details/10274765 算法描述 选择排序是一种不稳定排序.选择排序每次交换一对元素,它们当中至少有一个将被 ...
- YII2 源码阅读 综述
如何阅读源码呢? 我的方法是,打开xdebug的auto_trace [XDebug] ;xdebug.profiler_append = 0 ;xdebug.profiler_enable = 1 ...
- 用Fiddler进行弱网测试
1.作为一个好的程序猿,不但要写一手高质量的代码,而且要学会用高质量的测试工具测试自己的代码效果,接下来给大家推荐一下:用Fiddler进行弱网环境下的测试,请不要忽略这一点,因为用户在网速慢的情况下 ...