PHP所提供的”重载”(overloading)是指动态地”创建”类属性和方法。我们是通过魔术方法(magic methods)来实现的。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。本节后面将使用”不可访问属性”和”不可访问方法”来称呼这些未定义或不可见的类属性或方法。所有的重载方法都必须被声明为 public。

class Parent1 {

public function printFunction ($args) {

echo 'parent1->printfunction ' . $args . '
';

}

public function printFunction1 ($args) {

echo 'parent1->printfunction1 ' . $args . '
';

}

}

class Parent2 {

public function printFunction2 ($args) {

echo 'parent2->printfunction2 ' . $args . '
';

}

}

class Child {

protected $_parents = null;

public function __construct($parents) {

$this->_parents = $parents;

}

public function __call($method, $args) {

foreach ($this->_parents as $p) {

if (is_callable(array($p, $method))) {

return call_user_func_array(array($p, $method), $args);

}

}

}

public function printFunction ($args) {

echo 'child->printfunction ' . $args . '
';

}

}

class A {

protected $_parents = null;

public function __construct($parents) {

$this->_parents = $parents;

}

public function __call($method, $args) {

foreach ($this->_parents as $p) {

if (is_callable(array($p, $method))) {

return call_user_func_array(array($p, $method), $args);

}

}

}

}

class B extends Child{

public function __construct($parent){

parent::__construct($parent);

}

}

$obj = new Child(array(new Parent1(), new Parent2()));

$a = new A(array(new Child(array(new Parent1(), new Parent2()))));

$b = new B(array(new Parent1(), new Parent2()));

$obj->printFunction(123); // child->printfunction 123

$obj->printFunction1(456); // parent1->printfunction1 456

$obj->printFunction2(789); // arent2->printfunction2 789

$a->printFunction(123); // child->printfunction 123

$a->printFunction1(456); // parent1->printfunction1 456

$a->printFunction2(789); // arent2->printfunction2 789

$b->printFunction(123); // child->printfunction 123

$b->printFunction1(456); // parent1->printfunction1 456

$b->printFunction2(789); // arent2->printfunction2 789

当执行$obj->printFunction(123)时,由于在Child类中定义了此方法,所以直接调用Child中的printFunction方法。而执行$obj->printFunction1(456)和$obj->printFunction2(789)时,由于Child类中未定义printFunction1和printFunction2方法,就会自动调用__call方法,该方法的第一个参数是调用的不存在的方法的名称,是字符串类型,第二个参数是要传递的参数,是数组类型。在__call方法中查找引用的类的实例中是否存在该方法。类A和类B分别为实现不同的“继承”方法,他们的结果是一样的。用静态方式中调用一个不可访问方法时,__callStatic() 会被调用。

对于属性的重载也是同样的道理。

在给不可访问属性赋值时,__set() 会被调用。

读取不可访问属性的值时,__get() 会被调用。

当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。

当对不可访问属性调用 unset() 时,__unset() 会被调用。

还请读者参照PHP文档进行具体实现,若要了解详细使用,可参考yii中yii\base\Object的property和yii\base\Component的behavior的具体实现。

php 魔术方法 多继承,PHP通过魔术方法实现多继承与重载相关推荐

  1. mysql 魔术设置_详解php魔术方法(Magic methods)的使用方法

    PHP中把以两个下划线__开头的方法称为魔术方法,这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct(),类的析构函数 __cal ...

  2. python魔术方法是什么_Python常用魔术方法

    什么是魔术方法? 在Python中,所有以双下划线__包起来的方法,统称为Magic Method(魔术方法),它是一种的特殊方法,普通方法需要调用,而魔术方法不需要调用就可以自动执行. 魔术方法在类 ...

  3. 对称与魔术初步(四)——经典魔术《total conincidence》的魔术赏析等

    早点关注我,精彩不迷路! 在上一篇文章里,我们已经介绍了<Total Conincidence>这个经典魔术的数学原理,相信数学爱好者们定是爱不释手,往期内容请戳: 对称与魔术初步(三)- ...

  4. 字母预言卡里的魔术与数学(一)——魔术表演的艺术

    爱学习,勤思考:学数学,玩魔术.欢迎点击头部蓝字关注MatheMagician,这里有你要的奇迹! 自大学以来,就没少在魔术店里买一些道具.随着工作以后自己的时间越来越少,对魔术的广泛兴趣也逐渐收敛到 ...

  5. 循环、递归与魔术(二)——循环的魔术逻辑浅析与欣赏

    在上一篇中,我们讲了循环和递归的数学和计算机概念,并举例说明其是一种在生活中的无处不在的结构.相关回顾: 循环.递归与魔术(一)--递归与循环的数理逻辑 上期在谈到递归与循环的程序逻辑时,循环遍历树的 ...

  6. 魔术的逻辑(二)——魔术怎样利用了常识来骗你?

    早点关注我,精彩不迷路! 上篇我们聊到了魔术逻辑中关于魔术是怎么发生的内容,本质的逻辑是利用惯性思维导致的认知偏差,相关内容请戳: 魔术的逻辑(一)--魔术是怎么发生的? 上面这篇文章最后我提到,我们 ...

  7. 编码通信与魔术初步(五)——编码通信魔术入门《3 * 7的感应》

    早点关注我,精彩不错过! 在前面的内容里,我着重介绍了通信模型,信息论,以及把这些理论用在魔术上的基本思路.最后尤其说清楚了编码通信魔术的应用边界,是以辨识力效果作为主要表现形式的这类魔术的主要数学原 ...

  8. Java面向对象之继承,方法重写,super关键字,员工类系列继承题

    在程序中,如果想声明一个类继承另一个类,需要使用extends关键字. 格式: class 子类 extends 父类 {} 继承的好处 1.继承的出现提高了代码的复用性,提高软件开发效率. 2.继承 ...

  9. 【Kotlin】Kotlin 类的继承 三 ( super 关键字使用 | super@ 外部调用父类方法 | 子类选择性调用 父类 / 接口 方法 super )

    文章目录 I . 子类调用父类总结 II . 子类调用父类方法 ( super ) III . 子类内部类调用父类方法 ( super@ ) IV . 子类选择调用不同的 父类 / 接口方法 ( su ...

最新文章

  1. java if 没有_java – 如何做一个决定没有if语句
  2. vue点击图片后复制图片url_简单漂亮的(图床工具)开源图片上传工具——PicGo...
  3. 5最后一条记录_在一堆数据中,如何获取最后一次记录?
  4. mingw64 下 java_在 Windows 10 64 位下安装 Mingw-w64
  5. 【Java学习笔记四】Java中的包
  6. python中的map()函数详解
  7. 前端框架你究竟选什么
  8. 如何开启QtCreator的代码自动补全功能
  9. vue+express+mongodb+websocket 仿QQ即时聊天项目
  10. 优秀的WBS的分解标准
  11. linux 上u盘打不开了,U盘打不开怎么办-八种方法汇总
  12. 网站易用性测试的软件,如何进行“网站易用性测试”
  13. 什么是反向代理服务器
  14. 搭建可通过外网访问的内网服务器
  15. 垃圾箱清空的文件怎么恢复,怎么恢复回收站清空的文件
  16. 研发4面真题解析(Java岗):和阿里大佬的技术面谈,隔壁都馋哭了
  17. 2021小微企业补贴条件
  18. css 实现右边div高度随着左边div内容的增加,右边div的高度也增加(左边div与右边div高度保持一致)
  19. xp 没有应用程序服务器,XP双击exe文件没反应不能安装程序
  20. per.ccz与png图片占用内存对比

热门文章

  1. [翻译]PHP中define()和const定义常量的区别
  2. JVM 的三色标记算法详解
  3. 分类算法----逻辑回归预测
  4. 代理模式、动态代理及其应用
  5. 干货!总结19个提升iOS开发技术的必看教程!
  6. Linux网络服务-Web Service之【apache的功能、安装、配置文件介绍以及实验实例】(三)...
  7. memcache 缓存命中率   状态查询
  8. 【java】在jsp的js和css里面使用EL表达式取值|style里面用$取值
  9. Struts知识问答
  10. Linux系统下软件包管理六