PHP 接口类与抽象类不同之处分析

两者之间区别

  • 对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以通过关键字extends继承。
  • 接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。(另JAVA接口中的成员变量都要声明为public static final类型)
  • 接口没有构造函数,抽象类可以有构造函数。
  • 接口中的方法默认都是public类型的,而抽象类中的方法可以使用private,protected,public来修饰。
  • 一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。
  • 接口类方法不能有具体方法内容,抽象类可以定义具体方法内容或者定义抽象方法(无具体方法内容)。
<?php
/**
 * .
 * User: DevKang
 * Date: 2016-12-11
 * email: 41837647@qq.com
 */

/**
 * 定义一个接口类ITestA
 * Interface ITestA
 */
interface ITestA
{
//    public $a; // 接口类不可以定义成员变量
//    public static $a; // 接口类不能有静态变量
    const VAR_B= 'b'; // 可以定义接口常量 ps:接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。
    public function ITestA1();
    public function ITestA2();
//    private function ItestA3(); // 不可以定义为私有
//   protected function ItestA4(); // 不可定义为保护

//    接口类方法不可有具体方法内容
//    public function ITestA5()
//    {
//        echo "ITestA5 \n";
//    }

    public function ITest6($params);

}

/**
 * 接口类继承
 * Interface ITestB
 */
interface ITestB extends ITestA
{
    public function ITestB3();

}

abstract class ATest
{
    public $a; // 可以定义成员变量
    public static $b ; // 可以定义成员静态变量
    const VAR_B = 'b'; // 可以定义类常量
    public function ATest1()
    {
        echo "ATest1() \n";
        $this->ATest2();
    }

    // 可以定义私有,但是只能被此抽象类进行调用。
    private function ATest2()
    {
        echo "ATest2() \n";
    }
    // 可以定义抽象方法,子类必须要实现。
    abstract public function ATest3();
    // 定义需要参数的抽象方法
    abstract public function ATest4($params);
//    定义抽象方法不可有具体方法内容
//    abstract public function ATest5()
//    {
//        echo "Atest5 \n";
//    }
}



/**
 * 继承接口类,必须要实现接口方法
 *
 * Class CTestA
 */

class CTestA implements ITestB
{


    public function ITestA1()
    {
        // TODO: Implement ITestA1() method.
    }

    public function ITestA2()
    {
        // TODO: Implement ITestA2() method.
    }

    public function ITestB3()
    {
        // TODO: Implement ITestB3() method.
    }

    // 我们的子类可以定义父类接口中不存在的可选参数
    public function ITest6($params, $data = [])
    {
        // TODO: Implement ITest6() method.
    }
}

/**
 * 继承抽象类
 *
 * Class CTestB
 */
class CTestB extends ATest
{
    // 必须实现抽象方法testA2()
    public function ATest3()
    {

    }

    /**
     * 我们的子类可以定义父类签名中不存在的可选参数
     *
     * @param $params
     * @param array $data
     */
    public function ATest4($params, $data = [])
    {
        // TODO: Implement ATest4() method.
    }
}


具体使用情况分析

  • 如果要创建一个模型,这个模型将由一些紧密相关的对象采用,就可以使用抽象类。如果要创建将由一些不相关对象采用的功能,就使用接口。
  • 如果必须从多个来源继承行为,就使用接口。
  • 如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。
本文已经被查看366次

发表评论

电子邮件地址不会被公开。 必填项已用*标注