PHP面向对象之重写与重载
2015-12-16 13:06
676 查看
<?php
/***
====笔记部分====
重写/覆盖 override
指:子类重写了父类的同名方法
重载: overload
重载是指:存在多个同名方法,但参数类型/个数不同.
传不同的参数,调用不同的方法
但是在PHP中,不允许存在多个同名方法.
因此,不能够完成java,c++中的这种重载
但是,PHP的灵活,能达到类似的效果
***/
/****
代码部分
****/
class human{
public function say($name){
echo $name,' 吃了吗?<br />';
}
}
class stu extends human{
public function say(){
echo '切克闹,卡猫百比<br />';
}
/*
public function say($a,$b,$c){
echo '哥仨好';
}
报错:
Fatal error: Cannot redeclare stu::say() in D:\wamp\www\php\61.php on line 28
在PHP中,不允许存在多个同名方法,没有重载概念这一说。
*/
}
$li=new stu();
$li->say();
$li->say('binghui');// 上面这个过程叫重写override!
/*
结果:
切克闹,卡猫百比
切克闹,卡猫百比
*/
//在PHP中模拟重载的方法
class Calc {
public function area() {
// 判断一个调用area时,得到的参数个数
$args = func_get_args();
if(count($args) == 1) {
return 3.14 * $args[0] * $args[0];
} else if(count($args) == 2) {
return $args[0] * $args[1];
} else {
return '未知图形';
}
}
}
$calc = new Calc();
// 计算圆的页面
echo $calc->area(10),'<br />';
// 计算矩形的面积
echo $calc->area(5,8);
?>
PHP函数重载
对于弱类型语言来说,PHP函数重载,并不像一般的OOP那样。
因为函数重载必须满足两个条件:
1、函数参数的个数不一样。
2、参数的类型不一样。
这两点,PHP都没有办法满足,您可以对函数多添加参数,只是相当于多传了个临时变量。而弱类型本来就不区分,所以无法通过这些来实现。
但是,可以通过下面的方法来实现简单的伪重载吧。
1、默认参数
从这个上面就可以看到,如果一个函数里面,我对不是必须参数填写添加相应的默认值,就可以完成相应的功能。
[php] view
plaincopy
function overloadFun($param1, $param2 = '1',$param3 = true)
{
// do something
}
2、利用函数func_get_args()和call_user_func_array(),详细的帮助参照PHP手册。
利用一个有规则的函数进行调用,以方便统一管理。
[php] view
plaincopy
function overloadFun()
{
// overloadFun可以随便定义,但为了命名规范,建议宝贝为与此函数名一样,
// 后面的尾随数值为参数个数,以方便管理
$name="overloadFun".func_num_args();
return call_user_func_array(array($this,$name), func_get_args());
}
function overloadFun0()
{
// do something
}
function overloadFun1()
{
// do something
}
function overloadFun2()
{
// do something
}
3、利用__call($name, $arg)魔术方法 函数进行处理。
[php] view
plaincopy
function __call($name, $args)
{
if($name=='overloadFun')
{
switch(count($args))
{
case 0: $this->overloadFun0();break;
case 1: $this->overloadFun1($args[0]); break;
case 2: $this->overloadFun2($args[0], $args[1]); break;
default: //do something
break;
}
}
}
function overloadFun0()
{
// do something
}
function overloadFun1()
{
// do something
}
function overloadFun2()
{
// do something
}
/***
====笔记部分====
重写/覆盖 override
指:子类重写了父类的同名方法
重载: overload
重载是指:存在多个同名方法,但参数类型/个数不同.
传不同的参数,调用不同的方法
但是在PHP中,不允许存在多个同名方法.
因此,不能够完成java,c++中的这种重载
但是,PHP的灵活,能达到类似的效果
***/
/****
代码部分
****/
class human{
public function say($name){
echo $name,' 吃了吗?<br />';
}
}
class stu extends human{
public function say(){
echo '切克闹,卡猫百比<br />';
}
/*
public function say($a,$b,$c){
echo '哥仨好';
}
报错:
Fatal error: Cannot redeclare stu::say() in D:\wamp\www\php\61.php on line 28
在PHP中,不允许存在多个同名方法,没有重载概念这一说。
*/
}
$li=new stu();
$li->say();
$li->say('binghui');// 上面这个过程叫重写override!
/*
结果:
切克闹,卡猫百比
切克闹,卡猫百比
*/
//在PHP中模拟重载的方法
class Calc {
public function area() {
// 判断一个调用area时,得到的参数个数
$args = func_get_args();
if(count($args) == 1) {
return 3.14 * $args[0] * $args[0];
} else if(count($args) == 2) {
return $args[0] * $args[1];
} else {
return '未知图形';
}
}
}
$calc = new Calc();
// 计算圆的页面
echo $calc->area(10),'<br />';
// 计算矩形的面积
echo $calc->area(5,8);
?>
PHP函数重载
对于弱类型语言来说,PHP函数重载,并不像一般的OOP那样。
因为函数重载必须满足两个条件:
1、函数参数的个数不一样。
2、参数的类型不一样。
这两点,PHP都没有办法满足,您可以对函数多添加参数,只是相当于多传了个临时变量。而弱类型本来就不区分,所以无法通过这些来实现。
但是,可以通过下面的方法来实现简单的伪重载吧。
1、默认参数
从这个上面就可以看到,如果一个函数里面,我对不是必须参数填写添加相应的默认值,就可以完成相应的功能。
[php] view
plaincopy
function overloadFun($param1, $param2 = '1',$param3 = true)
{
// do something
}
2、利用函数func_get_args()和call_user_func_array(),详细的帮助参照PHP手册。
利用一个有规则的函数进行调用,以方便统一管理。
[php] view
plaincopy
function overloadFun()
{
// overloadFun可以随便定义,但为了命名规范,建议宝贝为与此函数名一样,
// 后面的尾随数值为参数个数,以方便管理
$name="overloadFun".func_num_args();
return call_user_func_array(array($this,$name), func_get_args());
}
function overloadFun0()
{
// do something
}
function overloadFun1()
{
// do something
}
function overloadFun2()
{
// do something
}
3、利用__call($name, $arg)魔术方法 函数进行处理。
[php] view
plaincopy
function __call($name, $args)
{
if($name=='overloadFun')
{
switch(count($args))
{
case 0: $this->overloadFun0();break;
case 1: $this->overloadFun1($args[0]); break;
case 2: $this->overloadFun2($args[0], $args[1]); break;
default: //do something
break;
}
}
}
function overloadFun0()
{
// do something
}
function overloadFun1()
{
// do something
}
function overloadFun2()
{
// do something
}
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- getPixels
- 借助PHP的mysql_query()函数来创建MySQL数据库的教程
- 这里既是结束,也是开始
- Magento在php7下速度测试
- PHP中将数据库中的数据显示在网页
- php函数初步
- NavicatPremium4MAC
- thinkphp中的验证码的实现
- 数据模型
- php中return die exit用法梳理
- yii框架 widgets 内部传递参数使用方案
- php 实物回滚
- 通过PHP简单实例介绍文件上传
- 安装php过程中的错误和解决方式
- 前进道路上的收获历程
- 终将骑马上南山
- PHP上传文件参考配置大文件上传
- PHP获取一个月有多少天
- laravel1