PHP中有多态么
PHP中有多态么
一、总结
一句话总结:封装是类的构建过程,php具有;php也具有继承的特性。唯独这个多态,php体现的十分模糊。原因是php是弱类型语言。
php不具有像java那种清晰的多态,不是代表php不具有多态性。
1、多态是什么?
多态其实就是根据参数不同而执行不同的方法。
2、php多态实例?
1 abstract class animal{
2 abstract function fun();
3 }
4 class cat extends animal{
5 function fun(){
6 echo "cat say miaomiao...";
7 }
8 }
9 class dog extends animal{
10 function fun(){
11 echo "dog say wangwang...";
12 }
13 }
14 function work($obj){
15 if($obj instanceof animal){
16 $obj -> fun();
17 }else{
18 echo "no function";
19 }
20 }
21 work(new dog());
22 work(new cat());
上面通过一个关键字instanceof来判断,变量指向的对象是否是animal类的一个实例,下面new cat(),new dog()都是animal子类的对象,而输出了“dog say wangwang...”和“cat say miaomiao...”,说明子类对象是父类的一个实例,从而达到了java多态的功能。
3、java的多态分哪两类?
父类引用指向子类对象;接口引用指向实现接口的类对象。
二、PHP中的多态
多态的概念一般是强类型语言来谈的,因为强类型语言它必须要声明参数类型,比如一个手电筒对象的打开方法其参数申明了只能是蓝光,就不能传其他光。但可以用父类渲染的方式使其多态,比如声明一个光的父类,让其它颜色的光都继承自这个光的父类,申明其参数为父类光,然后传光的任何子类都可以;这就是强类型的多态;
但php是弱类型的动态语言,不检测参数类型,传什么都可以;但在php5.3版本可以声明参数为某对象;当声明参数为某类实例化后的对象时,就得用父类渲染的方式令其多态;
<?php
class Glass {
public function display() {
}
}
class RedGlass extends Glass{
public function display() {
echo '红光照耀<br />';
}
}
class BlueGlass extends Glass {
public function display() {
echo '蓝光照耀<br />';
}
}
class GreenGlass extends Glass {
public function display() {
echo '绿光照耀<br />';
}
}
class Pig {
public function display() {
echo '八戒下凡,哼哼坠地!<br />';
}
}
class Light {
public function ons(Glass $g) {
//这里的$g对象必须是由Glass或Glass的子类实例化而来;本用法只能在php5.3里面使用;
//如果在遵循了PSR规范的框架里面,这里的Glass类同样可以写成这样的模式 Home\Controller\Glass $g
//用玻璃渲染颜色
$g->display();
}
}
// 造手电筒
$light = new Light();
// 造红玻璃
$red = new RedGlass();
// 造蓝玻璃
$blue = new BlueGlass();
// 红灯亮
$light->ons($red); //把对象传进方法内;
// 蓝灯亮
$light->ons($blue);
// 猪八戒降生
$pig = new Pig(); //$pig不是由Glass或Glass的子类实例化,所以会报错了;
$light->ons($pig);
?>
https://www.cnblogs.com/nixi8/p/4933890.html
三、php多态的理解
php是面向对象的脚本语言,而我们都知道,面向对象的语言具有三大特性:封装,继承,多态。php理应具有这三大特性。
封装是类的构建过程,php具有;php也具有继承的特性。唯独这个多态,php体现的十分模糊。原因是php是弱类型语言。
java的多态体现的十分清晰,大体分两类:父类引用指向子类对象;接口引用指向实现接口的类对象。java声明变量时都要给变量设定类型,所以存在什么父类引用和接口引用。而php则没有这点体现,php声明变量不需要给变量设定类型,一个变量可以指向不同的数据类型。所以,php不具有像java一样的多态。
php不具有像java那种清晰的多态,不是代表php不具有多态性。看下面一个例子:
abstract class animal{
abstract function fun();
}
class cat extends animal{
function fun(){
echo "cat say miaomiao...";
}
}
class dog extends animal{
function fun(){
echo "dog say wangwang...";
}
}
function work($obj){
if($obj instanceof animal){
$obj -> fun();
}else{
echo "no function";
}
}
work(new dog());
work(new cat());
上面通过一个关键字instanceof来判断,变量指向的对象是否是animal类的一个实例,下面new cat(),new dog()都是animal子类的对象,而输出了“dog say wangwang...”和“cat say miaomiao...”,说明子类对象是父类的一个实例,从而达到了java多态的功能。
上边的类是抽象类,也表明了接口与实现接口的类对象同样可以适用。
至此,得出php虽然多态体现模糊,但还是具有多态特性的。
https://www.cnblogs.com/age0420/p/3469850.html
PHP中有多态么的更多相关文章
- Protocol Buffer多态
java中有多态的概念,protobuf本身没有多态的概念,但是它有一个扩展的概念. 以聊天消息为例,先看下面这个类图,基类是ChatMessage,子类TextMessage和ImageMessag ...
- Android图片缓存之初识Glide
前言: 前面总结学习了图片的使用以及Lru算法,今天来学习一下比较优秀的图片缓存开源框架.技术本身就要不断的更迭,从最初的自己使用SoftReference实现自己的图片缓存,到后来做电商项目自己的实 ...
- Glide的常用方法注释
Glide简单使用1.)添加引用 build.gradle 中添加配置 compile 'com.github.bumptech.glide:glide:3.7.0' 2.)设置绑定生命周期 我 ...
- 【Docker】 Swarm简单介绍
[Swarm] Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源.Swarm ...
- 安卓高级 Android图片缓存之初识Glide
前言: 前面总结学习了图片的使用以及Lru算法,今天来学习一下比较优秀的图片缓存开源框架.技术本身就要不断的更迭,从最初的自己使用SoftReference实现自己的图片缓存,到后来做电商项目自己的实 ...
- Swift的基础之关于“!”和“?”的使用介绍
swift编程,不外乎是定义属性或者函数(方法),访问属性或者调用函数,类型转换,?和!在这几个过程中,都有一展身手的时候,而且,每次要考虑使用的时候,它们俩都会一起出现在我们的大脑中,用还是不用,如 ...
- android glide图片加载框架
项目地址: https://github.com/bumptech/glide Glide作为安卓开发常用的图片加载库,有许多实用而且强大的功能,那么,今天就来总结一番,这次把比较常见的都写出来,但并 ...
- Android图片缓存之初识Glide(三)
前言: 前面总结学习了图片的使用以及Lru算法,今天来学习一下比较优秀的图片缓存开源框架.技术本身就要不断的更迭,从最初的自己使用SoftReference实现自己的图片缓存,到后来做电商项目自己的实 ...
- Android 图片框架
1.图片框架:Picasso.Glide.Fresco 2.介绍: picasso:和Square的网络库能发挥最大作用,因为Picasso可以选择将网络请求的缓存部分交给了okhttp实现 Glid ...
随机推荐
- 微服务网关哪家强?一文看懂Zuul, Nginx, Spring Cloud, Linkerd性能差异
导语:API Gateway是实现微服务重要的组件之一.面对诸多的开源API Gateway,如何进行选择也是架构师需要关注的焦点.本文作者对几个较大的开源API Gateway进行了压力测试,对 ...
- Android Handler警告,SimpleDateFormat警告
1:Handler// This Handler class should be static or leaks might occur: IncomingHandler @SuppressLi ...
- python reduce & map 习题
基于廖雪峰教程作业 http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317 ...
- Java并发专题 带返回结果的批量任务执行
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/27250059 一般情况下,我们使用Runnable作为基本的任务表示形式,但是R ...
- 同样的代码在java和c++中结果不同
#include <iostream> using namespace std; /* run this program using the console pauser or add y ...
- Unity框架入门
介绍Unity框架之前,先要说几个概念DIP依赖倒置原则.IOC控制反转.DI依赖注入 DIP是设计原则之一,定义:上层不应该依赖于底层,两者都依赖于抽象: 抽象不依赖于细节,细节应该依赖于抽象. 像 ...
- 博弈SG函数
转自:Sprague-Grundy Function-SG函数--博弈论(3) 公平游戏的Sprague-Grundy定理 公平游戏是一种双人游戏,在游戏中双方都有完整的信息,没有牵涉,任何状态的合法 ...
- Discrete Function(简单数学题)
Discrete Function There is a discrete function. It is specified for integer arguments from 1 to N (2 ...
- 今天在网上查看了一个socket程序,运行的时候一直报错,经过队友解决?
1.首先是问题代码ip_port = ('192.168.12.2',8001)2.上边的代码本身没有问题,但是必须经过修改自己本机的局域网IP地址才能顺利链接请参考上一篇blog的地址,查看本机的i ...
- Java NIO Buffer(netty源码死磕1.2)
[基础篇]netty源码死磕1.2: NIO Buffer 1. Java NIO Buffer Buffer是一个抽象类,位于java.nio包中,主要用作缓冲区.Buffer缓冲区本质上是一块可 ...