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中的重载技术的更多相关文章

  1. Android中直播视频技术探究之---基础知识大纲介绍

    一.前言 最近各种视频直播app到处都是,各种霸屏,当然我们也是需要体验的,关于视频直播的软件这里就不介绍了,在不是技术的人来看,直播是一种潮流,是一种娱乐方式,但是作为一个高技术的,我们除了看看,更 ...

  2. 【M21】利用重载技术避免隐式类型转换

    1.考虑UPint 的加法+,UPint a, b, result; 为了使result = a+10; result= 10+a; 都能通过编译,操作符重载如下: const UPint opera ...

  3. Java中的多线程技术全面详解

    本文主要从整体上介绍Java中的多线程技术,对于一些重要的基础概念会进行相对详细的介绍,若有叙述不清晰或是不正确的地方,希望大家指出,谢谢大家:) 为什么使用多线程 并发与并行 我们知道,在单核机器上 ...

  4. tp中使用分页技术

    1 public function showList() { $m_ld = D ( 'guangxi_ld' ); $page = I ( 'get.p', 1 ); // 在配置中获取分页值 $p ...

  5. Web 开发中应用 HTML5 技术的10个实例教程

    HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...

  6. 【python游戏编程之旅】第七篇---pygame中的冲突检测技术

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中的Sprite模块和如何加载动画:http://www.cnblogs ...

  7. C++中的重载隐藏覆盖&&JAVA中的重载覆盖&&多态

    class 类继承默认是private, struct 默认继承是public C++中的隐藏: 只要派生类中出现和基类一样的函数名,基类中的函数就会被派生类中的函数给隐藏(如果派生类和基类中的函数名 ...

  8. .net中对象序列化技术浅谈

    .net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...

  9. SpreadJS 中应用 KnockoutJS 技术

    SpreadJS 支持 Knockout (KO)技术, KnockoutJS 是一个使用 MVVM 模式的 JavaScript 库,允许双向数据绑定,使数据和UI界面进行实时的交互更新.关于KO的 ...

随机推荐

  1. BZOJ 1073: [SCOI2007]kshort

    二次联通门 : BZOJ 1073: [SCOI2007]kshort /* BZOJ 1073: [SCOI2007]kshort A* k短路 但是会爆一个点, 是卡A*的 */ #include ...

  2. SpringData :下划线的那些破事

    今天写一个查询语句的时候,报错如下 org.springframework.beans.factory.BeanCreationException: Error creating bean with ...

  3. java sqlite docker,sqlite出错

    1问题1 使用docker镜像部署springboot程序,sqlite出错,在windows和linux环境都没有问题,使用docker部署就报错 Caused by: java.lang.Unsa ...

  4. 绕流振动UDF【转载】

    宏DEFINE_GRID_MOTION用来移动任意边界和流体区域内的网格节点.它提供了对节点和网格最大限度的操作,可以将刚体运动.变形和相对运动等结合起来.但是使用此UDF时,每一个时间步都必须执行. ...

  5. springMvc---WebMvcConfigurationSupport

    该类提供了主要的 MVC 配置方法,通过直接继承 WebMvcConfiguration ,并在继承类上 加上 @EnableWebMvc 和 @Configuration 注解之后.便可以在子类中实 ...

  6. ubuntu之路——day2

    一:sougou输入法安装 详情参考:https://blog.csdn.net/xin17863935225/article/details/82285177 注意切换成fcitx架构 因为linu ...

  7. QT文本转语音模块(TTS)QTextToSpeech

    QTextToSpeech是QT5.8以上的文本转语音模块. 使用方法: 在.pro工程文件中添加“QT += texttospeech”. 添加头文件 #include <QTextToSpe ...

  8. JVM 初始化阶段例子 final常量

    1.创建FinalTest类,里面有一个final常量x class FinalTest{ public static final int x = 3; static { System.out.pri ...

  9. graph embedding 使用方法

    无论是network embedding 还是graph embedding都是通过节点(node)和边的图,学出每个节点的embedding向量. 比较流行的算法有: Model Paper Not ...

  10. JS数组常见方法的深浅拷贝分类

    一.涉及浅拷贝类方法,会改变原数组 1,pop():   删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值.如果数组已经为空,则 pop() 不 改变数组,并返 ...