>백엔드 개발 >PHP 문제 >PHP에서 인터페이스와 추상 클래스의 차이점은 무엇입니까

PHP에서 인터페이스와 추상 클래스의 차이점은 무엇입니까

青灯夜游
青灯夜游원래의
2021-03-15 17:29:575236검색

차이점은 다음과 같습니다. 1. 인터페이스는 인터페이스 키워드를 통해 정의되고 추상 클래스는 추상 키워드를 통해 정의됩니다. 2. 인터페이스에는 데이터 멤버가 없지만 추상 클래스에는 데이터 멤버가 있으며 추상 클래스는 다음을 수행할 수 있습니다. 3. 인터페이스에는 생성자가 없지만 추상 클래스에는 생성자가 있을 수 있습니다.

PHP에서 인터페이스와 추상 클래스의 차이점은 무엇입니까

이 튜토리얼의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터

1 추상 클래스와 인터페이스의 차이점

PHP 객체 지향을 배울 때 항상 집중하게 됩니다. 추상 클래스와 인터페이스에 대해 혼란스럽습니다. 기능이 거의 동일할 때 하나를 빼면 왜 그렇게 쉽게 혼동됩니까? 그러나 사실 둘 사이의 차이는 여전히 매우 큽니다. PHP의 두 가지 방법을 잘 활용할 수 있다면 객체 지향 프로그래밍이 더 합리적이고 명확하며 효율적일 것입니다.

a. 인터페이스는 인터페이스 키워드를 통해 정의되고, 추상 클래스는 추상 키워드를 통해 정의됩니다.
b. 인터페이스의 사용은 키워드 구현을 통해 이루어지며, 추상 클래스의 작업은 클래스 상속의 키워드 확장을 사용하여 구현됩니다.
c. 인터페이스에는 데이터 멤버가 없지만 추상 클래스에는 데이터 멤버가 있고 추상 클래스는 데이터를 캡슐화할 수 있습니다.
d. 인터페이스에는 생성자가 없지만 추상 클래스에는 생성자가 있을 수 있습니다.
e. 인터페이스의 메소드는 모두 공개 유형인 반면 추상 클래스의 메소드는 비공개, 보호 또는 공개로 수정될 수 있습니다.
f. 클래스는 동시에 여러 인터페이스를 구현할 수 있지만 추상 클래스는 하나만 구현할 수 있습니다.

동일한 점: 추상 메서드와 인터페이스의 함수 본문에는 두 개의 중괄호조차 쓸 수 없습니다. ! ! 예를 들면 다음과 같습니다. function getName();

2. 인터페이스

인터페이스(인터페이스)를 사용하면 특정 클래스가 구현해야 하는 메서드를 지정할 수 있지만 이러한 메서드의 특정 내용을 정의할 필요는 없습니다. 행동 양식.

인터페이스는 표준 클래스 정의와 마찬가지로 인터페이스 키워드를 통해 정의되지만, 여기에 정의된 모든 메서드는 비어 있습니다.

인터페이스에 정의된 모든 메소드는 공개되어야 합니다. 이는 인터페이스의 특징입니다.

Implementations

인터페이스를 구현하려면 Implements 연산자를 사용하세요. 클래스는 인터페이스에 정의된 모든 메서드를 구현해야 합니다. 그렇지 않으면 치명적인 오류가 보고됩니다. 클래스는 여러 인터페이스를 구현할 수 있습니다. 쉼표를 사용하여 여러 인터페이스의 이름을 구분하세요.

참고:
여러 인터페이스를 구현할 때 인터페이스의 메서드는 동일한 이름을 가질 수 없습니다.

참고:
extends 연산자를 사용하여 인터페이스를 상속할 수도 있습니다.

참고:
인터페이스를 구현하려면 클래스는 인터페이스에 정의된 메서드와 정확히 동일한 메서드를 사용해야 합니다. 그렇지 않으면 치명적인 오류가 발생합니다.

상수

상수는 인터페이스에서도 정의할 수 있습니다. 인터페이스 상수는 클래스 상수와 정확히 동일하게 사용되지만 하위 클래스나 하위 인터페이스로 재정의될 수 없습니다.

 <?php

// 声明一个&#39;iTemplate&#39;接口
interface iTemplate
{
    public function setVariable($name, $var);
    public function getHtml($template);
}


// 实现接口
// 下面的写法是正确的
class Template implements iTemplate
{
    private $vars = array();

    public function setVariable($name, $var)
    {
        $this->vars[$name] = $var;
    }

    public function getHtml($template)
    {
        foreach($this->vars as $name => $value) {
            $template = str_replace('{' . $name . '}', $value, $template);
        }

        return $template;
    }
}

// 下面的写法是错误的,会报错,因为没有实现 getHtml():
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
    private $vars = array();

    public function setVariable($name, $var)
    {
        $this->vars[$name] = $var;
    }
}
?>
Example #2 可扩充的接口

<?php
interface a
{
    public function foo();
}

interface b extends a
{
    public function baz(Baz $baz);
}

// 正确写法
class c implements b
{
    public function foo()
    {
    }

    public function baz(Baz $baz)
    {
    }
}

// 错误写法会导致一个致命错误
class d implements b
{
    public function foo()
    {
    }

    public function baz(Foo $foo)
    {
    }
}
?>
Example #3 继承多个接口

<?php
interface a
{
    public function foo();
}

interface b
{
    public function bar();
}

interface c extends a, b
{
    public function baz();
}

class d implements c
{
    public function foo()
    {
    }

    public function bar()
    {
    }

    public function baz()
    {
    }
}
?>
Example #4 使用接口常量

<?php
interface a
{
    const b = &#39;Interface constant&#39;;
}

// 输出接口常量
echo a::b;

// 错误写法,因为常量不能被覆盖。接口常量的概念和类常量是一样的。
class b implements a
{
    const b = &#39;Class constant&#39;;
}
?>

http://php.net/manual/zh/언어.oop5.interfaces.php

3. 추상 클래스

PHP 5는 추상 클래스와 추상 메서드를 지원합니다. abstract로 정의된 클래스는 인스턴스화할 수 없습니다. 적어도 하나의 메소드가 추상으로 선언된 경우 모든 클래스는 추상으로 선언되어야 합니다. abstract로 정의된 메서드는 호출 메서드(매개변수)만 선언하고 특정 함수 구현을 정의할 수는 없습니다.

추상 클래스를 상속할 때 하위 클래스는 상위 클래스의 모든 추상 메서드를 정의해야 하며, 이러한 메서드의 액세스 제어는 상위 클래스와 동일하거나 더 완화되어야 합니다. 예를 들어 추상 메서드가 protected로 선언된 경우 하위 클래스에 구현된 메서드는 protected 또는 public으로 선언되어야 하며 private으로 정의할 수 없습니다. 또한 메서드를 호출하는 메서드가 일치해야 합니다. 즉, 필수 매개변수의 유형과 개수가 일관되어야 합니다. 예를 들어, 하위 클래스가 상위 클래스의 추상 메서드 선언에 포함되지 않은 선택적 매개 변수를 정의하는 경우 두 선언 간에 충돌이 없습니다. 이는 PHP 5.4 이후의 생성자에도 적용됩니다. PHP 5.4 이전의 생성자 선언은 다를 수 있습니다.

<?php
abstract class AbstractClass
{
 // 强制要求子类定义这些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // 普通方法(非抽象方法)
    public function printOut() {
        print $this->getValue() . "\n";
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";
?>
以上例程会输出:

ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
Example #2 抽象类示例

<?php
abstract class AbstractClass
{
    // 我们的抽象方法仅需要定义需要的参数
    abstract protected function prefixName($name);

}

class ConcreteClass extends AbstractClass
{

    // 我们的子类可以定义父类签名中不存在的可选参数
    public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {
            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
            $prefix = "Mrs";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}

$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>
以上例程会输出:

Mr. Pacman
Mrs. Pacwoman
老代码中如果没有自定义类或函数被命名为“abstract”,则应该能不加修改地正常运行。

http://php.net/manual/zh/언어.oop5.abstract.php

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 PHP에서 인터페이스와 추상 클래스의 차이점은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.