PHP核心技术——继承与多态
继承:
class person{
public $name='Tom';
public $gender;
static $money=10000;
public function __construct()
{
echo '这里是父类',PHP_EOL;
}
public function say()
{
echo $this->name,"\tis",$this->gender,"\r\n";
}
}
class family extends person
{
public $name;
public $gender;
public $age;
static $money=100000;
public function __construct()
{
parent::__construct(); //调用父类构造方法
echo '这里是子类',PHP_EOL;
}
public function say()
{
parent::say();
echo $this->name,"\tis\t",$this->gender,",and is\t",$this->age,PHP_EOL;
}
public function cry()
{
echo parent::$money,PHP_EOL;
echo '%>_<%',PHP_EOL;
echo self::$money,PHP_EOL; //调用自身构造方法
echo '(*^__^)';
}
}
$poor=new family();
$poor->name='Lee';
$poor->gender='female';
$poor->age=25;
$poor->say();
$poor->cry();
- 在继承中,用parent指代父类,用self指代自身。使用“::”运算符(范围解析操作符)调用父类的方法。“::”操作符还用来作为类常量和静态方法的调用,不要把这两种应用混淆。
- 如果声明类成员或方法为static,就可以不实例化类而直接访问,同时也就不能通过一个对象访问其中的静态成员(静态方法除外),也不能用“::”访问一个非静态方法。比如,把上例中的poor->cry();换成poor::cry()。
- 继承存在什么问题:1)继承破坏封装性 2)继承是紧耦合的 3)继承扩展复杂 4)不恰当地使用继承可能违反现实世界中的逻辑。
- 继承拥有比组合更少的代码量
class car{
public function addoil(){
echo "Add oil\t\n";
}
}
class bmw extends car{
}
class benz{
public $car;
public function __construct(){
$this->car=new car;
}
public function addoil(){
$this->car->addoil();
}
}
$bmw=new bmw;
$bmw->addoil();
$benz=new benz();
$benz->addoil();
- 精心设计专门用于被继承的类,继承树的抽象层应该比较稳定,一般不要多于三层。
- 对于不是专门用于被继承的类,禁止其被继承,也就是使用final修饰符。使用final修饰符既可防止重要方法被非法覆写,又能给编辑器寻找优化的机会。
- 优先考虑用组合关系提高代码的可重用性。
- 子类是一种特殊的类型,而不只是父类的一个角色。
- 子类扩展,而不是覆盖或者使父类的功能失效。
- 底层代码多用组合,顶层/业务层代码多用继承。底层用组合可以提高效率,避免对象臃肿。顶层代码用继承可以提高灵活性,让业务使用更方便。
多态:
- 多态确切的含义是:同一类的对象收到相同消息时,会得到不同的结果。而这个消息是不可预测的。多态,顾名思义,就是多种状态,也就是多种结果。
- 多态性是一种通过多种状态或阶段描述相同对象的编程方式。它的真正意义在于:实际开发中,只要关心一个接口或基类的编程,而不必关心一个对象所属于的具体类。
- 很多地方会看到“PHP没有多态”这种说法。事实上,不是它没有,而是它本来就是多态的
class employee{
protected function working(){
echo '本方法需要重载才能运行';
}
}
class teacher extends employee{
public function working(){
echo '教书';
}
}
class coder extends employee{
public function working(){
echo '敲代码';
}
}
function doprint($obj){
if (get_class($obj)=='employee') {
echo 'Error';
}else{
$obj->working();
}
}
doprint(new teacher());
doprint(new coder());
doprint(new employee());
// 通过接口实现多态
interface employee{
public function working();
}
class teacher implements employee{
public function working(){
echo '教书';
}
}
class coder implements employee{
public function working(){
echo '敲代码';
}
}
function doprint(employee $i)
{
$i->working();
}
$a=new teacher;
$b=new coder;
doprint($a);
doprint($b);
- 弱类型的PHP里多态和传统强类型语言里的多态在实现和概念上是有一些区别的,而且弱类型语言实现起多态来会更简单,更灵活。
- 至于多态是怎么实现的,各种语言的策略是不一样的。但是,最终的实现无非就是查表和判断。
- 类型转换不是多态。
- PHP中父类和子类看做“继父”和“继子”关系,它们存在继承关系,但不存在血缘关系。因此子类无法向上转型为父类,从而失去多态最典型的特征。
- 多态的本质就是if……else,只不过实现的层级不同。
参考资料
- [PHP核心技术与最佳实践]
PHP核心技术——继承与多态的更多相关文章
- [java核心技术01]__继承与多态、重载与重写、抽象类与接口
前言 前面简单学习了面向对象的知识,知道了其两个重要的特性,继承与多态,今天就围绕着面向对象的这两个特性,将继承与多态及相关的几个几个定义重载与重写,抽象类与接口的相关知识具体学习一下. 类的继承 关 ...
- Java继承和多态实例
我们知道面向对象的三大特性是封装.继承和多态.然而我们有时候总是搞不清楚这些概念.下面对这些概念进行整理, 为以后面向抽象的编程打下坚实的基础. 封装的概念还是很容易理解的.如果你会定义类,那么相信你 ...
- Objective-C中的继承和多态
面向对象编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的OOP语言之间都有其特点.OC中和Java类似,不支持多重继承,但OOP语言C++就支持多 ...
- java中抽象、分装、继承和多态的理解
1.抽象.封装装.继承和多态是java面向对象编程的几大特点. 抽象:所谓抽象就是对某件事务,我们忽略我们不关心不需要的部分,提取我们想要的属性和行为,并且以代码的形式提现出来:例如我们需要对一个学生 ...
- [转] JS中简单的继承与多态
这里讲了一个最最最简单的JS中基于原型链的继承和多态. 先看一下以下这段代码的实现(A是“父类”,B是“子类”): var A = function(){ this.value = 'a'; this ...
- 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目
小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...
- OC的封装、继承与多态
面向对象有三大特征:封装.继承和多态. 一.封装 封装是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问.简而言之,信息隐藏,隐 ...
- 2、C#面向对象:封装、继承、多态、String、集合、文件(上)
面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...
- Java学习笔记 07 接口、继承与多态
一.类的继承 继承的好处 >>使整个程序架构具有一定的弹性,在程序中复用一些已经定义完善的类不仅可以减少软件开发周期,也可以提高软件的可维护性和可扩展性 继承的基本思想 >>基 ...
随机推荐
- 基于easyui开发Web版Activiti流程定制器详解(六)——Draw2d详解(二)
回顾: 上一篇我们介绍了Draw2d整体结构,展示了组件类关系图,其中比较重要的类有Node.Canvas.Command.Port.Connection等,这篇将进一步介绍Draw2d如何使用以及如 ...
- BZOJ 1305 dance跳舞 二分+最大流
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1305 题目大意: 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成 ...
- 给 Virtualbox 中 Ubuntu 系统设置静态 IP
虚拟机网络选择 桥接网卡 模式. 主要涉及两个步骤: 1. 修改 /etc/network/interfaces 文件: 2. 修改 dns : 第一步,修改 interfaces 文件: sudo ...
- PHP开发者应了解的24个库
@PHP开发者应了解的24个库 本文由 伯乐在线 - 贾朝藤 翻译.未经许可,禁止转载!英文出处:tutorialzine.欢迎加入翻译组. 作为一个PHP开发者,现在是一个令人激动的时刻.每天有许许 ...
- css自问自答(二)
css自问自答(二) 7.掌握定位的一些属性 position 和 display 属性,以及如何浮动(float)和清除(clear)元素,z-index属性 三个属性控制: position 属性 ...
- 关于EasyPoi导出Excel
如果你觉得Easypoi不好用,喜欢用传统的poi,可以参考我的这篇博客:Springmvc导出Excel(maven) 当然了,万变不离其宗.Easypoi的底层原理还是poi.正如MyBatis ...
- 为什么 token可以防止 csrf?
Token被用户端放在Cookie中(不设置HttpOnly),同源页面每次发请求都在请求头或者参数中加入Cookie中读取的Token来完成验证.CSRF只能通过浏览器自己带上Cookie,不能操作 ...
- windows同时安装python2和python3
系统之前安装了python2.7,现在准备装个python3.6 1:首先下载一个python3.6适合windows32位的包python-3.6.5.exe 然后直接默认双击安装,安装的时候勾选a ...
- 在文章详情页调用seo标题标签
在新闻的详情页,调用当前栏目的seo标题,原标签是:{dede:field.seotitle /} {dede:type} [field:seotitle/] {/dede:type} 修改 \inc ...
- DB2创建表、操作表等常用命令
转载:http://hi.baidu.com/ufobject/item/7fd03aeebf7be1266dabb881 一.创建库表 1.创建库 1).创建数据语句 CREATE DATABASE ...