PHP 抽象类实现接口注意事项(含PHP与.Net的区别)
最近在学习Drupal8,看到源码里面一个抽象类BlockBase实现了一个接口BlockPluginInterface,但是并没有实现该接口的所有方法。然后我就不淡定了,因为之前是做.NET的,记忆中 “接口中定义的方法必须在继承类中全部实现”,可是Drupal8的源码的确摆在这里,不可能错啊。于是赶紧翻了下《PHP与MySql程序设计》书中关于接口的部分,看到书中赫然写着:
“当类通过 implements 关键字 实现 了接口后,就完成了一个契约。接口中的所有方法都必须实现,倘若实现类没有实现所有方法,则必须声明为抽象类,否则将出现下面所示的致命错误··· ”
譬如,下面这段代码是不会报错的,结果仍然会输出“hello world!”
<?php
interface ITest{
public function func1();
public function func2();
}
abstract class classtest implements ITest{}
echo "hello world!";
因为类“classtest”是抽象类,所以不会报错。
基础不牢,会怀疑人生的啊,还得多读书啊~
但是虽然没有显式地实现接口,但是接口的两个方法已经被抽象类继承(或者说默认实现了。个人觉得没有做任何操作,就拥有了接口的方法,用继承更贴切一些吧)了,这一点可以通过函数get_class_methods 加以验证:
<?php
interface ITest{
public function func1();
public function func2();
}
abstract class classtest implements ITest{}
print_r( get_class_methods('classtest'));
结果是:
Array ( [0] => func1 [1] => func2 )
-----------------------------------------------------我是低调的分割线,对.NET不感兴趣的童鞋可以止步了~----------------------------------------------------
补充说一下,在.NET中,即使是抽象类,继承接口的话,也必须实现接口,这一点和PHP不同。实现的方法大致有两种:一种是直接实现,需要写出方法体;另一种是抽象实现,即虽然实现了,但是是以抽象函数的方式实现的,抽象函数是没有方法体的,参考代码如下:
interface ITest
{
void func1(); int func2 ();
} abstract class a_class_1 : ITest
{
public void func1()//显示实现,有方法体
{
throw new NotImplementedException();
} public int func2()
{
throw new NotImplementedException();
}
} abstract class a_class_2 : ITest
{
public abstract void func1();//抽象方式实现,抽象函数没有方法体
public abstract int func2();
}
PHP 抽象类实现接口注意事项(含PHP与.Net的区别)的更多相关文章
- lucene.net 使用过程中的 几个注意事项(含termquery 和QueryParser 的区别)
几个注意事项1.建立索引时 插入的顺序(不设置document和字段的boost) 会影响到 查询结果的默认排序,建议:将最新生成的文章 最后建索引 这样 查询结果首先显示的是 最后插入的数据2.Bo ...
- Java抽象类和接口的区别及联系
抽象类 注:先将抽象类中的两种方法解释完,再综合解释抽象类 抽象方法 应用场景:其下所有子类都应该有该方法但是大部分子类具体的执行步骤是有所不同的. 必须重写:也可以说"必须实现" ...
- “全栈2019”Java第一百零六章:匿名内部类与抽象类接口注意事项
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- (1)抽象类 (2)接口 (3)内部类 (4)Object类
1.抽象类(重点)1.1 抽象方法的概念 抽象方法就是指不能具体实现的方法,也就是该方法没有方法体,使用abstract关键字修饰如: public abstract void cry(); 1.2 ...
- luogg_java学习_07_抽象类_接口_多态学习总结
这篇博客总结了半天,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 , 抽象 一种专门用来做父类,被继承的. (模板) 格式: abs ...
- 十、Java基础---------面向对象之抽象类与接口
抽象类(abstract) 当编写一个类时,时常会为该类定义一些方法,这些方法的使用用以描述该类的行为方式,那么这些方法都有具体的方法体.但是在某些情况下,某个父类只是知道子类应该包含怎样的方 ...
- 抽象类和接口 static final finalize
抽象类 任何含有一个或多个抽象方法的类都必须声明成抽象类,用关键字abstract. 抽象类没有对象,即一个抽象类不能用new来直接实例化. 不能定义抽象构造方法或抽象静态方法.(但是可以创建父类引用 ...
- C#中抽象类和接口的区别3
一.普通类和抽象类之间的异同 1.都可以被继承 2.抽象类不能被实例化,只是用来继承的.普通类可以实例化 3.抽象方法只有含方法声明而没有方法体且必须包含在抽象类里面 4.子类继承抽象类必须实现抽象类 ...
- 《Java技术》第三次作业--面向对象——继承、抽象类、接口
1.阅读下面程序,分析是否能编译通过?如果不能,说明原因.应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来? class Grandparen ...
随机推荐
- centos7无法上网问题
在虚拟机VM中安装了centos7,无法上网,在同一个虚拟机里,也安装了Ubuntu是可以上网的,不知道咋回事,所以上网查了资料博客,现总结如下. 一.首先打开虚拟的设置,可以看到虚拟机网络的设置默认 ...
- 【Java并发编程】:加锁和volatile变量
加锁和volatile变量两者之间的区别: 1.volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比syn ...
- 视口(viewport)原理详解之第二部分(移动端浏览器)
一.移动端浏览器的问题 当我们把移动端浏览器和桌面浏览器比较时,最明显的差异就是尺寸.移动端浏览器尺寸要比桌面屏幕小得多,移动浏览器最多差不多也就400px.最重要的问题集中在我们的CSS上,特别是v ...
- git使用时的一下简单命令
一.简介 SVN集中式版本控制系统 分布式版本控制系统 二.使用git 1.git init 将这个命令变成git可管理的仓库 2.git add filename 将这个文件添加到仓库 3.git ...
- Oracle 中分组排序取值的问题
整理一下排序: 建表语句:create table EXAM( name VARCHAR2(32), subject VARCHAR2(32), score INTEGER)数据:IN ...
- javascript字符串拼接
var c='../Project/SelectPerson.aspx?personList='+'"'+personListValue+'"' X('Window2').x_sh ...
- JDK自带工具介绍
JDK工具一览表 工具名称 功能描述 appletviewer.exe 用于运行并浏览applet小程序. apt.exe 注解处理工具(Annotation Processing Tool),主要用 ...
- Base64加密解密工具类
使用Apache commons codec类Base64进行加密解密 maven依赖 <dependency> <groupId>commons-codec</grou ...
- Struts动态表单(DynamicForm)
动态表单的含义是不要手动定义,直接在配置文件中进行定义. 1.手动进行定义 <form-beans > <form-bean name="userForm" ty ...
- php的数组变量
数组就是存储同一类型的多个变量的 一种特殊的类型 php的数组有两种形态 1.普通类型 eg:$cars = array("Volvo","BMW"," ...