>  기사  >  백엔드 개발  >  PHP 추상 클래스와 인터페이스의 차이점은 무엇입니까?

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

青灯夜游
青灯夜游앞으로
2020-07-16 16:36:552588검색

이 글에서는 PHP 추상 클래스와 인터페이스의 차이점을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

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

추상 클래스

공식 설명은 문서를 확인하세요. 다음은 공식 설명을 단순화한 것입니다.

  • 추상으로 정의된 클래스는 인스턴스화할 수 없습니다. 적어도 하나의 메소드가 추상으로 선언된 경우 모든 클래스는 추상으로 선언되어야 합니다. A 추상으로 정의된 메소드는 호출 메소드(매개변수)만 선언하며,
  • 특정 함수 구현을 정의할 수 없습니다
. +                                                                                 추상 클래스를 상속할 때 비추상 하위 클래스는 상위 클래스의 모든 추상 메서드를 정의해야 합니다. 이러한 메서드의 액세스 제어는 상위 클래스의 액세스 제어와 동일해야 합니다(또는 더 완화됨). 예를 들어 추상 메서드가 protected로 선언된 경우 하위 클래스에 구현된 메서드는 protected 또는 public으로 선언되어야 하며 private으로 정의할 수 없습니다.

또한 메소드를 호출하는 메소드가 일치해야 합니다. 즉, 필수 매개변수의 유형과 개수가 일치해야 합니다. 예를 들어 하위 클래스가 선택적 매개 변수(

함수 eat($a,$b=1)와 유사, $b는 선택적 매개 변수

)를 정의하지만 상위 클래스의 추상 메서드 선언에는 포함되지 않습니다. 클래스를 선언한 다음 둘 다 선언하면 충돌이 없습니다. 이는 PHP 5.4 이후의 생성자에도 적용됩니다. PHP 5.4 이전의 생성자 선언은 다를 수 있습니다.

  • 추가됨:

  • 1 추상 클래스는 멤버 속성을 가질 수 있습니다.

2. 누군가 질문했습니다. 추상 메서드를 비공개로 정의할 수 있습니까? 대답은 '아니요'입니다. 왜냐하면 추상 인터페이스의 목적은 상속을 위해 클래스 모델을 추상화하는 것이기 때문입니다. 비공개로 정의하면 외부에서 액세스할 수 없습니다. 설계 목적상 오류가 보고됩니다. 3. 추상 클래스는 인터페이스를 구현할 수 있으며 인터페이스에 메서드를 구현할 필요가 없습니다

abstract class  AbstractClass
 {
     // 强制要求子类定义这些方法,且不能定义具体功能 注意没有大括号{}
     abstract protected function  getValue ();
     abstract protected function  prefixValue ( $prefix );

     // 普通方法(非抽象方法)
     public function  printOut () {
        print  $this -> getValue () .  "\n" ;
    }
}
4. 추상 클래스는 추상 클래스를 상속할 수 있으며

추상 상위 클래스의 추상 메서드를 덮어쓸 수 없습니다. 이러한 사용법은 추상 클래스의 확장으로 이해될 수 있습니다.

abstract class Sutdent extends Human
{
    abstract private function study();
}
Fatal error: Abstract function Sutdent::study() cannot be declared private in ...

Interface

1. 인터페이스의 정의

인터페이스(인터페이스)를 사용하면 특정 클래스가 어떤 메소드를 구현해야 하는지 지정할 수 있지만, 특정 클래스를 정의할 필요는 없습니다. 이러한 방법의 내용.

인터페이스는 표준 클래스 정의와 마찬가지로 인터페이스 키워드를 통해 정의되지만, 그 안에 정의된 모든 메소드는 비어 있습니다. 인터페이스에 정의된 모든 메소드는 공개되어야 합니다. 이는 인터페이스의 특성이며 비공개는 오류를 보고합니다(치명적인 오류: 인터페이스 메소드에 대한 액세스 유형).

    상수: 상수는 인터페이스에서도 정의할 수 있습니다. 인터페이스 상수는 클래스 상수와 정확히 동일하게 사용되지만 하위 클래스나 하위 인터페이스로 재정의될 수 없습니다. (이런 식으로 사용하는 것은 권장하지 않습니다. 정말 의미가 생각나지 않고, 추상 클래스와 혼동을 일으키기 쉽습니다.)
abstract class  Human
{
    abstract function eat();
}

abstract class Sutdent extends Human
{
    abstract function study();
    //abstract function eat(); 若重写抽象父类的抽象方法eat()会报错 Fatal error: Can't inherit abstract function Human::eat() (previously declared abstract in Sutdent) in ...
}
  • 2. 인터페이스 구현
  • 구현하려면 인터페이스를 사용하려면 implements

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

    추상 클래스 상속과 인터페이스 구현을 동시에 할 수 있으며 확장은 앞에 작성해야 합니다. 추상 클래스는 인터페이스를 구현하므로 해당 클래스의 메서드를 다시 만들 필요가 없습니다.

    여러 인터페이스를 구현할 때 인터페이스의 메서드는 동일한 이름을 가질 수 없습니다. extends 연산자를 사용하여 인터페이스를 상속할 수도 있습니다.

      인터페이스를 구현하려면 클래스는 인터페이스에 정의된 메서드와 정확히 동일한 메서드를 사용해야 합니다. 그렇지 않으면 치명적인 오류가 발생합니다.
    interface Play  
    {  
        const LEVEL=10;  
        public function PlayLOL();  
        public function PlayFootball();  
    }
  • 3. 인터페이스 상속
  • 인터페이스는 다른 인터페이스 또는 여러 인터페이스를 상속할 수 있고, 확장 키워드를 사용할 수 있으며, 여러 인터페이스를 ','로 구분할 수 있지만 다른 인터페이스를 구현할 수는 없으며 당연히 그럴 수도 없습니다. 상속합니다. 추상 클래스(추상 클래스 상속 시 오류:
  • 치명적인 오류: PlayGame은 Human을 구현할 수 없습니다. 10

    행의 D:11index.php에 있는 인터페이스가 아닙니다.)

    interface Play  
    {  
        const LEVEL=10;  
        public function PlayLOL();  
        public function PlayFootball();  
    } 
    
    interface Read  
    {  
        public function ReadNovel();  
    } 
        
    abstract class  Human
    {
        abstract function eat();
    }
    //抽象类可以实现接口后不实现其方法,可以继承一个抽象类的同时实现多个接口注意必须要把extends语句写在implements前面,否则会报错
    abstract class Sutdent extends Human implements Play,Read
    {
        abstract function study();
    }

    차이:

    1 . 인터페이스 상속을 위해 구현을 사용하고 추상 클래스를 확장합니다.

    2. 인터페이스에서는 변수를 선언할 수 없지만 추상 클래스에서는 다양한 변수를 선언할 수 있습니다.

    3. 인터페이스에는 생성자가 없습니다. 클래스는 다음을 가질 수 있습니다. 4. 인터페이스의 메서드는 기본적으로 공개되며 추상 클래스의 메서드는 공개, 보호 및 비공개로 수정될 수 있습니다

    5. 클래스는 여러 인터페이스를 상속할 수 있지만 추상 클래스는 하나만 상속할 수 있습니다

    관련 권장 사항: PHP 튜토리얼

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

    성명:
    이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제