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 ...
随机推荐
- git小白使用教程(一)
本文所涉及命令基本可以涵盖日常开发场景, 对于开发者平时很少使用的命令不再列举,这样不至于让刚刚使用git的小伙伴们看的脑袋大...如有特殊使用可以联系我单独回复. 首先通过一张图了解git的工作流程 ...
- P1484 种树
P1484 种树 题意: 在n个数中选出至多k个数,且两两不相邻,并使所选数的和最大. n<=500000 思路 先建一个堆,把所有点扔进去,当取出队首元素时累加到答案时,把它和它左右两个点一 ...
- POJ 1063
#include <iostream> using namespace std; int main() { //freopen("acm.acm","r&qu ...
- Java Sort中Comparator的语义分析
Comparator中compare的语义:
- 【DB2】How to resolve SQL20249N the statement was not processed with error
相关链接 https://vinaysdb2blog.blogspot.com/2017/11/how-to-resolve-sql20249n-statement-was-not-processed ...
- MyEclipse:详细使用教程
http://www.56.com/u18/v_MTQwNzY1MTU5.html?fromvsogou=1
- 【Java并发编程】:深入Java内存模型—内存操作规则总结
主内存与工作内存 java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.此处的变量主要是指共享变量,存在竞争问题的变量.Java内存模 ...
- spring boot和mybatis集成分页插件
MyBatis提供了拦截器接口,我们可以实现自己的拦截器,将其作为一个plugin装入到SqlSessionFactory中. 首先要说的是,Spring在依赖注入bean的时候,会把所有实现MyBa ...
- 分区助手里如何从临近盘(如D盘)抽取一定的空间给已经快满了的盘(如E盘)(博主推荐)(图文详解)
不多说,直接上干货! 分区助手是什么?(博主推荐)(图文详解) 分区助手各版本比较(图文详解) 分区助手官网使用教程(专业版.绿色版和WinPE版)(图文详解) 安装分区助手时出现“分区助手已安装到你 ...
- LDAP落地实战(三):GitLab集成OpenLDAP认证
上一篇文章介绍了svn集成OpenLDAP认证,版本控制除了svn外,git目前也被越来越多的开发者所喜爱,本文将介绍GitLab如何集成openldap实现账号认证 GitLab集成OpenLDAP ...