【web开发】PHP面向对象多态之父类引用指向子类对象

举报
迷彩 发表于 2023/07/26 15:17:59 2023/07/26
【摘要】 前言上一篇文章《【web 开发】PHP多态性详解及其应用》中我们详细了解了PHP中多态的相关概念和特点,在文章中我们介绍了多态存在的三个必要条件:继承、重写、父类引用指向子类对象。而且我们上一文章中也使用了详细的例子来说明多态的具体声明方式和使用方法。但是在具体实例代码中我们并没有体现出现父类引用指向子类对象的这个使用方式。我们仅仅是利用接口的实现来实现重写这个特点,所以本文接着详细介绍有关...

前言

上一篇文章《【web 开发】PHP多态性详解及其应用》中我们详细了解了PHP中多态的相关概念和特点,在文章中我们介绍了多态存在的三个必要条件:继承、重写、父类引用指向子类对象。而且我们上一文章中也使用了详细的例子来说明多态的具体声明方式和使用方法。但是在具体实例代码中我们并没有体现出现父类引用指向子类对象的这个使用方式。我们仅仅是利用接口的实现来实现重写这个特点,所以本文接着详细介绍有关于体现继承和父类引用子类对象这两个必要条件的内容。具体的概念本文不再赘述,直接进入正文。

多态中的重写

面向对象的多态中我们实现重写的方式有上一篇文章中介绍到的接口,除此之外我们还可以使用抽象类或者抽象类和抽象方法的方式来实现重写,总结,PHP多态中能够实现重写的方式常用的有两种:

1、接口

PHP中的接口类似于生活中的接口,就是一些方法特征的集合,默认所有方法都是抽象方法,没有具体实现。在我们生活中的接口最具代表性的就是插座,例如一个三接头的插头都能插在三孔插座中使用,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,因为国外有自己定义的接口类型。

2、抽象类和抽象方法

抽象类我们之前的文章也介绍过,如果说接口是为了定义一个标准的话,那抽象类就是为继承的类定制一个模板。抽象类中可存在具体方法同时也可以存在抽象方法,在 PHP 中抽象类表示的是一种继承关系,和Java一样,一个类只能继承一个抽象类,而一个类却可以实现多个接口。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。最值得注意的是:抽象类不能被直接实例化,只有抽象类的非抽象子类可以创建对象。

php多态中的父类引用指向子类对象

父类引用指向子类对象,这也是我们实现面向对象多态常用的方式:

比如java中的:​ParentClass p = new ChildClas();​这种是向上转型的方式,主要由于PHP是弱类型语言,所以PHP中无法直接这么写,不过这里可以使用参数传递的方式来实现父类引用指向子类对象,当然,作为弱类型语言,PHP是不需要这么麻烦的使用声明方式.本文只是为了拓宽下大家的视野,通过PHP去了解其他面向对象语言中多态的使用方法.

下面我们通过具体的例子来介绍相关的内容.比如现在有一个画图类DrawPicture,里面有一个draw的方法,我们只是预留这样一个方法,没有具体实现,留个继承它的子类来灵活实现,比如我要矩形,三角形,圆形等等,这样我们就像具体的矩形类,三角形类,圆形类中去实现draw()这个动作.我们通过一张图来具体了解实现方法:

接下来我们按照上图通过具体的代码来实现它。

声明一个DrawPicture类:

<?php
class DrawPicture{
	function draw(){}
}

其实这里使用抽象类更为合适,但是这里作为说明就不纠结这个,只需要记住能够这样使用就可以

声明三个类Rectangle(矩形类),Triangle(三角形类),Circle(圆形类)分别继承DrawPicture类,然后使用多态中父类引用指向子类对象的方式调用它们,代码如下:

<?php
class Rectangle extends DrawPicture{
	
	function draw(){
		echo "使用Rectangle类中的draw()方法画一个矩形<br>";
	}
}

class Triangle extends DrawPicture{
	
	function draw(){
		echo "使用Triangle类中的draw()方法画一个三角形<br>";
	}
}

class Circle extends DrawPicture{
	 
	function draw(){
		echo "使用Circle类中的draw()方法画一个圆形<br>";
	}
}

//参数可以指定对象类型
function show(DrawPicture $dp){ 
   $dp->draw(); 
  /*
	// 类型判断
	if ($dp instanceof Rectangle)  {  //矩形
		$c = new Rectangle;
		$c = $dp;
		$c->draw();
	}else if($dp instanceof Triangle) { // 三角形
		$c = new Triangle;
		$c = $dp;
		$c->draw();
	}else if($dp instanceof Circle) { // 圆形 
		$c = new Circle;
		$c = $dp;
		$c->draw();
	}  */
}
show(new Rectangle()); 
show(new Triangle());  
show(new Circle());

执行结果如下:

题外话:实现多态还有一种方法就是使用虚函数,这个是C++中概念,感兴趣的同学可以去了解一下,或者哪天我们通过一篇文章详细介绍一下相关内容.

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。