PHP中的重载技术
PHP中的重载技术
通常面向对象语言的重载技术
其基本语法是这样的:
在一个类中,有多个同名的方法,每个方法的参数不同而已。这种现象就称为“重载”。
参数不同可以是:数量个数不同,或类型不同,或顺序不同。
比如:
class A{
int function f1(int x){......}
int function f1(int x, int y){.....}
int function f1(string s int m){....}
}
但,在php中,一个类中,根本就不可以定义多个同名方法——这直接是语法错误。
实际上,php中的重载,是另一个“概念”,其指的是:
属性重载: 如果使用一个不存在的属性,就会去自动调用类中预先定义好的某个方法以处理数据;
方法重载: 如果使用一个不存在的方法,就会去自动调用类中预先定义好的某个方法以处理该行为
属性重载
属性有哪些使用情形?其实跟变量一样,只有4种使用情形:
取值:$v1 = 对象->属性;
赋值:对象->属性 = XX值;
判断是否存在:isset(对象->属性;)
销毁:unset(对象->属性;)
所谓属性重载,就是在面对上述4种情形的属性使用场景中,该对象如果来“应对”的问题。
如果某属性不存在,但在语法中使用如下情形,则会发生:
取值:$v1 = 对象->属性; ===>自动调用类中的__get()方法
赋值:对象->属性 = XX值; ===>自动调用类中的__set()方法
判断是否存在:isset(对象->属性;) ===>自动调用类中的__isset()方法
销毁:unset(对象->属性;) ===>自动调用类中的__unset()方法
前提都是:类中要预先定义好这些方法。
通常,没有的属性,去使用,显然是报错:

先看属性的取值赋值(最常见情形):

对应,写出__iset(),和__unset():

方法重载
当使用一个对象调用一个不存在的普通方法的时候,会自动去调用预先定义好的"__call"方法。
其中,该方法必须带2个参数,见下图:

当使用一个对象(类)调用一个不存在的静态方法的时候,会自动去调用预先定义好的"__callStatic"方法。
其中,该方法必须带2个参数。其实跟前面一样!
上面所学的几个方法都被称为“魔术方法”:
__get(), __set(), __isset(), __unset(), __call(), __callstatic();
接口interface
类:有属性,有方法;有类常量;
抽象类:有属性,有方法;有类常量; 还可以有抽象方法(只有方法头)
“更”抽象类(就是接口) :有接口常量;还可以有抽象方法(只有方法头)
可见,接口中,只有两类最简单特性信息:
接口常量: 其实就是常量。
抽象方法: 只有方法头——下级自然就应该去“实现”它。
接口有什么用?
接口可以看作是抽象类的更高层面的“抽象规范”,不考虑接口常量的话,那么就相当于之规定了“下级类”要做什么——至于怎么就,没有规定。
接口也可以说,在一个抽象类中只有类常量和抽象方法的一种特例情形。
但是!!!
接口可以实现“多继承”(多实现),而类不行。
鸟:有翅膀,能飞;
鸵鸟是鸟吗?
一个类“继承”接口中的特性信息,被称为实现“implements),其实本质跟继承一样,即下级类就可以使用上级类的数据(方法)了。
但因为接口中的方法都是抽象的,则下级类就必须:
1,要么实现该抽象方法(写出其方法体)
2,要么也声明为抽象方法——等待更下一级的类去实现。

一个类只能继承一个父类,但可以实现多个“上级接口”,语法形式:
class 类A extends 类B implements 接口1,接口2,.... { 。。。类定义语句。。。}
一个接口同样可以继承另一个接口(也是单继承):
interface 接口1 extends 接口2 {接口定义}
最终的接口,普通类,抽象类,普通方法,抽象方法,各种常量的总结(图):


PHP中的重载技术的更多相关文章
- Android中直播视频技术探究之---基础知识大纲介绍
一.前言 最近各种视频直播app到处都是,各种霸屏,当然我们也是需要体验的,关于视频直播的软件这里就不介绍了,在不是技术的人来看,直播是一种潮流,是一种娱乐方式,但是作为一个高技术的,我们除了看看,更 ...
- 【M21】利用重载技术避免隐式类型转换
1.考虑UPint 的加法+,UPint a, b, result; 为了使result = a+10; result= 10+a; 都能通过编译,操作符重载如下: const UPint opera ...
- Java中的多线程技术全面详解
本文主要从整体上介绍Java中的多线程技术,对于一些重要的基础概念会进行相对详细的介绍,若有叙述不清晰或是不正确的地方,希望大家指出,谢谢大家:) 为什么使用多线程 并发与并行 我们知道,在单核机器上 ...
- tp中使用分页技术
1 public function showList() { $m_ld = D ( 'guangxi_ld' ); $page = I ( 'get.p', 1 ); // 在配置中获取分页值 $p ...
- Web 开发中应用 HTML5 技术的10个实例教程
HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...
- 【python游戏编程之旅】第七篇---pygame中的冲突检测技术
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中的Sprite模块和如何加载动画:http://www.cnblogs ...
- C++中的重载隐藏覆盖&&JAVA中的重载覆盖&&多态
class 类继承默认是private, struct 默认继承是public C++中的隐藏: 只要派生类中出现和基类一样的函数名,基类中的函数就会被派生类中的函数给隐藏(如果派生类和基类中的函数名 ...
- .net中对象序列化技术浅谈
.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...
- SpreadJS 中应用 KnockoutJS 技术
SpreadJS 支持 Knockout (KO)技术, KnockoutJS 是一个使用 MVVM 模式的 JavaScript 库,允许双向数据绑定,使数据和UI界面进行实时的交互更新.关于KO的 ...
随机推荐
- BZOJ 1073: [SCOI2007]kshort
二次联通门 : BZOJ 1073: [SCOI2007]kshort /* BZOJ 1073: [SCOI2007]kshort A* k短路 但是会爆一个点, 是卡A*的 */ #include ...
- 像素迷踪,当Unity的Frame Debugger力不从心时
http://www.manew.com/thread-92382-1-1.html 从版本5开始,Unity包含了一个全新的可视化帧调试工具,Frame Debugger.该工具能帮你解决很多图形方 ...
- 【golang】使用rpcx不指定tags报错 undefined: serverplugin.ConsulRegisterPlugin
为了避免引入不必要的库, rpcx采用了 Go 条件编译 的特性, 你可以只引入必要的特性. 比如你只使用 etcd 作为注册中心的时候, 你不希望引入 consul.zookeeper相关的库,你需 ...
- P2502 [HAOI2006]旅行——暴力和并查集的完美结合
P2502 [HAOI2006]旅行 一定要看清题目数据范围再决定用什么算法,我只看着是一个蓝题就想到了记录最短路径+最小生成树,但是我被绕进去了: 看到只有5000的边,我们完全可以枚举最小边和最大 ...
- 【洛谷】P3188 [HNOI2007]梦幻岛宝珠
题目描述 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值. 数据范围:N<=100;W<=2^30,并且保证每 ...
- zabbix与agent端通信加密
Zabbix版本从3.0之后,开始支持Zabbix server, Zabbix proxy, Zabbix agent, zabbix_sender and zabbix_get之间的通信加密,加密 ...
- sql server for centos7
sql server for centos7 笔者在CENTOS7上面安装SQL SERVER,感觉非常方便. 但有一点要注意,字段是字符串类型的,要使用nvarchar(),不能使用varchar( ...
- [String]两个右补空格使字符串达到固定长度的函数 来自网上 请君自取
代码: package fixsizestring; public class TestClass { public static void main(String[] args) { for(int ...
- ln bug
/home/hdp/testcpy sudo ln -s . /usr/lib/cpy390sourcecode cpy390sourcecode -> . sudo ln -s pwd /us ...
- 【转】Django继承AbstractUser新建User Model时出现auth.User.groups: (fields.E304)错误
错误详情如下: (venv) D:\workspace\music>python manage.py makemigrations SystemCheckError: System check ...