玩转PHP中的抽象类与接口

  在面向对象开发中,特别是使用现代化框架的过程中,我们经常会和接口、抽象类打交道。特别是我们自己尝试去封装一些功能时,接口和抽象类往往会是我们开始的第一步,但你真的了解它们吗?

  抽象类定义

  抽象类的特点:

  顾名思义,它是抽象的,当然也就是不能被实例化的。所以,抽象类一般是作为我们的基类来进行定义的。

  在一个类中,只要有一个方法被定义为抽象的,那么这个类就必须加上abstract关键字成为抽象类。

  被定义为抽象的方法只声明其调用方式,不能定义其具体的功能实现。

  子类必须定义父类中的所有抽象方法,这些方法的访问控制必须和父类一致或者更为宽松。

  方法的调用方式必须匹配,即类型和所需参数数量必须一致。子类实现的抽象方法可以增加参数但必须有默认值。

  abstractclass A {

  publicfunction show(){

  $this->getName();

  echo PHP_EOL;

  }

  protectedabstractfunction getName();

  publicabstractfunction getAge($age);

  }

  class ChildA1 extends A {

  publicfunction getName(){

  echo"I‘m ChildA1";

  }

  publicfunction getAge($age){

  echo"Age is " . $age;

  }

  }

  class ChildA2 extends A {

  protectedfunction getName(){

  echo"I‘m ChildA2";

  }

  publicfunction getAge($age, $year = ‘‘){

  echo"Age is ". $age . ‘, bron ‘ . $year;

  }

  }

  $ca1 = new ChildA1();

  $ca1->show();

  $ca1->getAge(18);

  $ca2 = new ChildA2();

  $ca2->show();

  $ca2->getAge(20, 2000);

  接口定义

  接口的特点:

  可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

  就像定义一个标准的类一样,但其中定义所有的方法都是空的。

  接口中定义的所有方法都必须是公有,这是接口的特性。

  类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。

  类要实现接口,必须使用和接口中所定义的方法完全一致的方式。否则会导致致命错误

  接口也可以继承,通过使用 extends 操作符

  接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖

  interface B1 {

  const B1_NAME = ‘Interface B1‘;

  function getName();

  function getAge($age);

  }

  interface B2 extends B1 {

  function show();

  }

  interface B3 {

  function getSchool();

  }

  class ChildB implements B2, B3{

  function getName(){

  echo"I‘m ChildB";

  }

  function getAge($age, $year = ‘‘){

  echo"Age is " . $age;

  }

  function show(){

  $this->getName();

  echo PHP_EOL;

  $this->getAge(23, 1997);

  echo PHP_EOL;

  echoself::B1_NAME;

  echo PHP_EOL;

  }

  function getSchool(){

  echo"study in Peking University";

  echo PHP_EOL;

  }

  }

  $b = new ChildB();

  $b->show();

  $b->getSchool();

  抽象类和接口的区别

  从上面我们可以总结出一些抽象类和接口的区别:

  抽象类的子类遵循继承原则,只能有一个父类;但一个类可以实现多个接口

  抽象类中可以有非抽象的已经实现的方法;接口中全是抽象的方法,都是方法定义

  抽象类中方法和变量的访问控制自己定义;接口中只能是公共的

  那么问题来了,这两货哪个好?抱歉,这个问题可没有答案,它们的作用不同。抽象类可以作为基类,为子类提供公共方法,并定制公共的抽象让子类来实现。而接口则是更高层次的抽象,它可以让我们依赖于抽象而不是具体的实现,为软件开发带来更多的扩展性。

  面向接口开发

  接口,实际上也可以看做是一种契约。我们经常会拿电脑主机箱后面的插口来说明。比如USB接口,我们定义了它的大小,里面的线路格式,不管你插进来的是什么,我们都可以连通。而具体的实现则是取决于电脑软件对插入的硬件的解释,比如U盘就会去读取它里面的内容,而键盘则会识别为一个外设。

  从这里可以看出,接口能够为我们程序的扩展提供非常强大的支撑。任何面向对象语言中接口都是非常重要的特性。下面我们来用接口模拟刚刚说的USB插口。

  interface USB{

  function run();

  }

  class Keyboard implements USB{

  function run(){

  echo"这是键盘";

  }

  }

  class UDisk implements USB{

  function run(){

  echo"这是U盘";

  }

  }

  这么写有什么好处呢?我们再深入一个概念:依赖注入。如果使用面向接口开发的话:

  function testUSB (USB $u){

  $u->run();

  }北京代孕威信15023219993 广州代孕威信15023219993 深圳代孕威信15023219993 昆明代孕威信15023219993 上海代孕威信15023219993 天津代孕威信15023219993 成都代孕威信15023219993 北京代孕威信15023219993 重庆代孕威信15023219993 重庆代孕威信15023219993

  // 插入U盘

  testUSB(new UDisk);

  // 插入键盘

  testUSB(new Keyboard);

  testUSB方法中的$u并不是某个具体实例,只是USB接口的抽象,在不知道它是什么实例的情况下我们通过接口契约,保证它一定会有一个run()方法。而具体的实现,则是在外部我们调用方法的时候注入进来的。

  总结

  掌握好接口的设计原则,往往就能看懂一大半的框架的设计思想。这也是我们面向对象中最最基础的特性。抽象类作为公共基类来说可以为多态提供比较好的范本,它能够让你的子类有自己的个性又能使用父类的能力。总之,深入场景业务,选择合适的方式实现代码,靠的是能力、经验与智慧的综合,决不是一句谁好谁不好所能定性的。

原文地址:https://www.cnblogs.com/ipengrui2/p/12303020.html

时间: 2024-11-05 18:51:47

玩转PHP中的抽象类与接口的相关文章

Java语言中的----抽象类、接口

day12  Java语言中的抽象类与接口 一.抽象类和接口概述; 在昨天我们学习了Java的继承功能,这个是一个核心知识点,今天我们再继承的基础之上学习一下抽象类和接口这两个知识.什么是抽象类?如何定义一个抽象类?如何使用一个抽象类?这些都是我们需要掌握的. 同时我们还要知道如何来定义一个接口,在开发中定义接口来实现相关的功能是一个很重要的功能.如何来实现接口中的抽象方法,这些在这一节都会说到. 二.抽象类和接口 1.抽象类: 什么是抽象类?包含抽象方法的类就叫做抽象类 .使用abstract

C++--C++对象模型分析、c++中的抽象类和接口

一.C++对象模型分析 A.class是一种特殊的struct1.在内存中class依旧可以看作变量的合集2.在class域struct遵循相同的内存对齐规则3.class中的成员函数与成员变量是分开存放的--每个对象有独立的成员变量,所有对象共享类中的成员函数Q:class与struct的内存占用情况? #include <iostream> #include <string> using namespace std; class A { int i; int j; char c

JAVA中的抽象类和接口

一 抽象类 抽象类就是不能被实例化的类,即不可以用new运算符创建本类的对象.在实际应用中,抽象类应该具有子类,且其子类一般不为抽象类. java中使用抽象类的原因有如下四点: 1.抽象类是较高层次的概括,其他的类可以继承它的抽象化特征: 2.抽象类包括它的所有子类共享的公共行为和公共属性,即抽象类中定义一些属性和方法,其他类继承该抽象类并实现这些属性和方法: 3.抽象类使编写程序更贴近人类的思维方式和客观世界: 4.在用户生成实例时强迫用户生成更具体的实例,保证代码的安全性. 二 接口 在接口

PHP中的抽象类和接口

PHP抽象类和抽象方法的应用 抽象类 接口 多态 抽象类是以特殊的类,接口是一种特殊的抽象类声明抽象类和接口,以及一些需要的技术抽象类:    什么是抽象方法?        定义:如果一个类中的方法,没有方法体的方法就是抽象方法(就是一个方法没有使用{}而直接使用分号结束)            function test();  //抽象方法            function test(){    //有方法体,但方法体为空                }            如果

第52课 C++中的抽象类和接口

1. 什么是抽象类 (1)面向对象中的抽象概念 思考:抽象图形中,图形的面积如何计算? (2)现实中:需要知道具体的图形类型,才能求面积. (3)Shape只是一个概念上的类型,没有具体对象 2. 面向对象中的抽象类 (1)可用于表示现实世界中的抽象概念 (2)是一种只能定义类型,而不能产生对象的类 (3)只能被继承并重写相关函数 (4)直接特征是相关函数没有完整的实现 3. 抽象类与纯虚函数 (1)C++语言中没有抽象类的概念,它是通过纯虚函数实现抽象类,当一个C++类中存在纯虚函数就成了抽象

第五十二课、c++中的抽象类和接口

一.c++中的抽象类与纯虚函数 1.面向对象中抽象的概念 (1).现实中需要知道具体图形的类型才能求面积 (2).图形类只是概念上的类型,没有具体对象 2.面向对象中的抽象类 (1).可用于表示现实世界中的抽象概念 (2).是一种只能定义类型,而不能产生对象的类 (3).只能被继承并重写相关的函数 (4).直接特征是相关函数没有完整实现 3.c++中没有抽象类的概念 (1).c++通过纯虚函数实现抽象类 (2).纯虚函数是只定义原型的成员函数 (3).一个c++类中存在纯虚函数就成了抽象类 4.

关于JAVA中的抽象类和接口中常量和变量定义的原因

转载自https://my.oschina.net/cdzsc/blog/86107 在抽象类中,可以包含一个或多个抽象方法:但在接口(interface)中,所有的方法必须都是抽象的,不能有方法体,它比抽象类更加"抽象". 1. 为什么接口中只能定义static final:     1.1 static(这时暂且认为是变量)解释:因为一个类可以实现多个接口,如果一个类同时实现了多个接口而每个接口中都定义了同一个变量的话就会产生在类中不知道是哪个接口中的变量了,所以必须定义成stat

.net中的抽象类与接口

学习设计模式的时候很多用到抽象类和接口,用来用去感觉他们两个有点相似,也有点迷糊,到底接口和抽象类有什么区别哪?今天我试着给他俩解开神秘的面纱! 一.抽象类:抽象类说白了就是对类的抽象,它通常代表一个抽象的概念,并提供一个集成的出发点,当设计新的抽象类时,一定是用来继承的,所以,在一个继承关系形成的等级结构里面,树叶节点应当是具体类,树枝节点应该是抽象类. 抽象类的特点 (1)抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法.     (2) 抽象类不能被实例化.     (3) 抽

java中的抽象类和接口详解

1.抽象类 /** 1. 抽象方法一定存在于抽象类中,抽象方法和抽象类需要abstract修饰! 2. 抽象类不能实例化. 3. 如果抽象类中多个抽象方法,而其子类只继承了一个抽象方法,则该子类为抽象类,故也无法实力化. 4. 抽象类只能被子类覆盖其全部的抽象方法,才能建立子类对象! 5. 抽象类中可以有非抽象方法 */ //该子类未覆盖父类func1的抽象方法,故子类为抽象类,不能实例化.编译失败 abstract class Person{     abstract void func();