0

0

PHP面向对象-详细介绍重载(overloading)的示例代码

黄舟

黄舟

发布时间:2017-03-25 10:07:15

|

1533人浏览过

|

来源于php中文网

原创

重载

  php中的”重载”与其它绝大多数面向对象语言不同,只是他们都是用的相同的名词而已。传统的”重载”是用于提供多个同名的 类方法,但各方法的参数类型和个数不同。 php所提供的”重载”(overloading)是指动态地”创建”类属性和方法。当调用当前环境下未定义不可见的类属性或方法时,重载方法会被调用。是通过魔术方法(magic methods)来实现的。
  一般来说,把类中的成员属性都定义为private的,这更符合现实的逻辑,能够更好的对类中成员起到保护作用。但是,对成员属性的读取和赋值操作是非常频繁的,而如果在类中为每个私有属性都定义可以在对象的外部获取和赋值的公有方法,又是非常非常烦恼的。因此在php5.1.0以后的版本中,预定义了两个方法“get()”和“set()”,用来完成对所用私有属性都能获取和赋值操作,以及用来检查私有属性是否存在的方法“isset()”和用来删除对象中私有属性方法“unset()”。
  通俗一点来说,重载在php中的含义是指,当一个对象或类使用其未定义或不可见的属性和方法时,其中的一些“处理机制”。

属性重载

  对一个对象不存在的属性进行使用时,这个类中预先设定好的应对办法(处理机制)。
  属性,本质就是变量,其只有4个操作:

取值:

  当对一个对象不存在(未定义或不可见)的属性进行“取值”时,就会自动调用方法:GET() 方法不区分大小写。

赋值:

  当对一个对象不存在(未定义或不可见)的属性进行“赋值”时,就会自动调用方法:SET()

判断(isset):

  当对一个对象不存在(未定义或不可见)的属性进行isset()判断时,就会自动调用方法:isset()

立即学习PHP免费学习笔记(深入)”;

销毁(unset):

  当对一个对象不存在的(未定义或不可见)属性进行unset()判断时,就会自动调用方法:unset()

  以上4个方法,被称为魔术方法。

魔术方法

GET($属性名):

  在对一个对象不存在的属性进行“取值”的时候,会自动调用的方法,其中该方法可以带一个形参,表示要对之取值而又不存在的属性名(字符串),可以使用该方法对意外情况进行某种特殊的处理。

  例如:

p1;  //1echo $a1->p2;	//未定义$p2,会报错, Notice: Undefined property: A::$p2?>

  php的重载,使用get()方法对上面的出错作“优雅处理”。

{$prop_name}属性还未定义(不存在)!";
        return "";  //也可以返回0,或false等
        */

        //还可以这样处理
        trigger_error("发生错误:属性不存在!", E_USER_ERROR);        
        die();
    }
}$a1 = new A();echo $a1->p1;  //1echo $a1->p2;	//未定义$p2,但经过"处理"?>

  这里举一个对所用私有属性获取的操作的例子。
 
  例子:

name = $name;        
        $this->sex = $sex;        
        $this->age = $age;   
    }    private function get($propertyName){ //这里要用private修饰,防止类外部调用
        if($propertyName == 'age'){            
        return $this->age;
        }
    }
}$p = new Person('yeoman', '男',23);
$v1 = $p->name;$v2 = $p->sex;$v3 = $p->age;    
//自动调用了get()方法获取私有属性age(函数定义里面返回)
echo "name=$v1, sex=$v2, age=$v3";?>

  运行结果为:

《PHP设计模式指南》中文版
《PHP设计模式指南》中文版

《PHP设计模式》首先介绍了设计模式,讲述了设计模式的使用及重要性,并且详细说明了应用设计模式的场合。接下来,本书通过代码示例介绍了许多设计模式。最后,本书通过全面深入的案例分析说明了如何使用设计模式来计划新的应用程序,如何采用PHP语言编写这些模式,以及如何使用书中介绍的设计模式修正和重构已有的代码块。作者采用专业的、便于使用的格式来介绍相关的概念,自学成才的编程人员与经过更多正规培训的编程人员

下载
name=yeoman, sex=男, age=23

SET($属性名, 值):

  当对一个对象不存在的属性进行“赋值”时,就会自动调用这个内部的魔术方法;其有2个形参,分别代表要对不存在的属性进行赋值的“属性名”和“属性值”。
  这个方法,结合_GET方法,往往可以使我们定义的类,有一种可扩展的特性。即:类或对象的属性,可以更为方便自由。

  例子:

prop_list[$p] = $v;     
    }    function get($p){
        return $this->prop_list[$p];    
    }
}$a1 = new A();$a1->p1 = 1;   
//不存在的属性名赋值,此时会调用_set(),并传过去"p1"和1$a1->p2 = 2;$a1->ac = 'avc';
echo "
输出这些“不存在的属性”的值:"; echo "
a1->p1:" . $a1->p1; //不存在的属性名取值,此时会调用_get(),并传过去"p1"echo "
a1->p2:" . $a1->p2;echo "
a1->ac:" . $a1->ac;?>

  运行结果为:

输出这些“不存在的属性”的值:a1->p1:1a1->p2:2a1->ac:avc

ISSET($属性名):

  当对一个对象不存在的属性进行isset()判断时,就会自动调用内部方法:isset();

  用法:

$v1 = isset($对象->不存在的属性);    //此时会调用这个对象所属类中的魔术方法:isset()

  例子:

prop_list[$p] = $v;     
    }    function get($p){
        if($this->prop_list[$p]){            return $this->prop_list[$p];
        }else{            return "该属性不存在!";
        }
    }    function isset($prop){   //isset()是自定义的方法, isset()是系统函数
        $re = isset($this->prop_list[$prop]);        return $re;
    }
}
$a1 = new A();
$a1->p1 = 1;//不存在的属性名赋值,此时会调用_set(),并传过去"p1"和1
$a1->p2 = 2;
$a1->ac = 'avc';
echo "
输出这些“不存在的属性”的值"; echo "
a1->p1:" . $a1->p1;//不存在的属性名取值,此时会调用_get(),并传过去"p1" echo "
a1->p2:" . $a1->p2; echo "
a1->ac:" . $a1->ac; //下面演示isset判断不存在的属性 $v1 = isset($a1->p1); //存在 $v2 = isset($a1->ppp1); //不存在 var_dump($v1);echo "
"; var_dump($v2);?>

  运行结果:

输出这些“不存在的属性”的值
a1->p1:1a1->p2:2a1->ac:avc

boolean trueboolean false

UNSET($属性名)

当对一个对象不存在的属性进行unset()销毁时,就会自动调用内部方法:unset();

prop_list[$p] = $v;     
    }    function get($p){
        if($this->prop_list[$p]){            
        return $this->prop_list[$p];
        }else{            
        return "该属性不存在!";
        }
    }    function unset($prop){
        unset($this->prop_list[$prop]); 
    }
}$a1 = new A();
$a1->p1 = 1;//不存在的属性名赋值,此时会调用_set(),并传过去"p1"和1
echo "
a1->p1:" . $a1->p1;//不存在的属性名取值,此时会调用_get(),并传过去"p1"//下面演示unset销毁一个不存在的属性 unset($a1->p1); echo "
a1->p1:" . $a1->p1;?>

  运行结果为:

a1->p1:1a1->p1:该属性不存在!

下面的例子中,声明一个Person类,并将所有的成员属性设置成private的。在类中添加自定义的“isset()”和“unset()”两个方法。在类外部使用“isset()”和“unset()”函数时,会自动调用这两个方法。代码如下:

name = $name;
        $this->sex = $sex;
        $this->age = $age;  
    }

    private function __isset($propertyName){   //需要一个参数,是测定的私有属性的名称
        if($propertyName == 'name'){
            return false;   //返回假,不允许在类外部测定name属性   
        }
        return isset($this->$propertyName);   //这里propertyName要加$符,因为这是参数,不是属性
    }                       

    private function __unset($propertyName){
        if($propertyName == 'name')
            return; //退出方法,不允许删除对象中的name属性
        unset($this->$propertyName);  //这里propertyName要加$符
    }

    public function say(){
        echo "名字:" . $this->name . ",性别:" . $this->sex . ",年龄:" . $this->age . "
"; } } $person = new Person("yeoman", "男", 23); var_dump(isset($person->name)); //输出bool(false),不允许测定name属性 var_dump(isset($person->sex)); //输出bool(true),存在sex私有属性 var_dump(isset($person->age)); //输出bool(true),存在age私有属性 var_dump(isset($person->id)); //输出bool(false),测定对象中不存在id属性 unset($person->name); //删除私有属性name,但在 __unset()中不允许删除 unset($person->sex); //删除对象中的私有属性sex,删除成功 unset($person->age); $person->say(); //对象中的sex和age属性被删除,输出:名字:yeoman,性别:,年龄: ?>

运行结果:

boolean falseboolean trueboolean trueboolean false名字:yeoman,性别:,年龄:

方法重载

  当对一个对象不存在的实例方法进行“调用”时,会自动调用类中的call()这个魔术方法;
  当对一个类不存在的静态方法进行“调用”时,会自动调用类中的callstatic()这个魔术方法。

例子:直接调用不存在的方法

f1();  //不存在的方法?>

  会报错,报错内容为:

Fatal error: Uncaught Error: Call to undefined method A::f1()

  对上面报错作“优雅处理”:

f1();  //不存在的方法,但经过处理?>

  运行结果为:

f1()方法不存在!

  当对一个类不存在的静态方法进行“调用”时,会自动调用类中的callstatic()这个魔术方法。和上面的处理类似。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

40

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

50

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

12

2026.01.31

漫画防走失登陆入口大全
漫画防走失登陆入口大全

2026最新漫画防走失登录入口合集,汇总多个稳定可用网址,助你畅享高清无广告漫画阅读体验。阅读专题下面的文章了解更多详细内容。

13

2026.01.31

php多线程怎么实现
php多线程怎么实现

PHP本身不支持原生多线程,但可通过扩展如pthreads、Swoole或结合多进程、协程等方式实现并发处理。阅读专题下面的文章了解更多详细内容。

1

2026.01.31

php如何运行环境
php如何运行环境

本合集详细介绍PHP运行环境的搭建与配置方法,涵盖Windows、Linux及Mac系统下的安装步骤、常见问题及解决方案。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php环境变量如何设置
php环境变量如何设置

本合集详细讲解PHP环境变量的设置方法,涵盖Windows、Linux及常见服务器环境配置技巧,助你快速掌握环境变量的正确配置。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php图片如何上传
php图片如何上传

本合集涵盖PHP图片上传的核心方法、安全处理及常见问题解决方案,适合初学者与进阶开发者。阅读专题下面的文章了解更多详细内容。

2

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 10.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号