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

不言
풀어 주다: 2023-03-23 08:12:01
원래의
1911명이 탐색했습니다.

php

태그: 추상 클래스 인터페이스 추상 클래스와 인터페이스 php


소개: 이것은 인터뷰에서 자주 묻는 질문이자 고전적인 질문이기도 합니다. 우리는 이 기사에 언급된 내용의 정확성을 입증하기 위해 공식적으로 권위 있는 지침을 인용하거나 실험을 수행하기 위해 최선을 다합니다.

추상 클래스

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

  • 추상으로 정의된 클래스는 인스턴스화할 수 없습니다. 적어도 하나의 메소드가 추상으로 선언된 경우 모든 클래스는 추상으로 선언되어야 합니다. (추상 클래스에는 추상 메소드가 없을 수 있지만 추상 클래스는 여전히 인스턴스화될 수 없습니다.) 추상으로 정의된 메소드는 호출 메소드(매개변수)만 선언하고 특정 함수 구현을 정의할 수 없습니다. 예를 들어,

    abstract class  AbstractClass
     {
        // 强制要求子类定义这些方法,且不能定义具体功能 注意没有大括号{}
         abstract protected function  getValue ();
        abstract protected function  prefixValue ( $prefix );
    
         // 普通方法(非抽象方法)
         public function  printOut () {
            print  $this -> getValue () .  "\n" ;
        }
    }
    로그인 후 복사
    이 추상 클래스를 상속하는 경우 비추상 하위 클래스는 상위 클래스의 모든 추상 메서드를 정의해야 하며, 이러한 메서드의 액세스 제어는 상위 클래스와 동일해야 합니다. 또는 좀 더 편안하게). 예를 들어 추상 메서드가 protected로 선언된 경우 하위 클래스에 구현된 메서드는 protected 또는 public으로 선언되어야 하며 private으로 정의할 수 없습니다.
  • 또한 메소드를 호출하는 메소드가 일치해야 합니다. 즉, 필수 매개변수의 유형과 개수가 일치해야 합니다. 예를 들어, 서브클래스는 선택적 매개변수(
  • 함수 eat(

    b=1, 여기서 $b는 선택적 매개변수

    와 유사))를 정의하지만 상위 클래스의 추상 메소드 두 명령문 사이에는 충돌이 없습니다. 이는 PHP 5.4 이후의 생성자에도 적용됩니다. PHP 5.4 이전의 생성자 선언은 다를 수 있습니다.

  • 추가됨:

    1. 추상 클래스는 멤버 속성을 가질 수 있습니다.
    2. 추상 메소드를 비공개로 정의할 수 있습니까? 대답은 '아니오'입니다. 왜냐하면 추상 인터페이스의 목적은 상속을 위해 클래스 모델을 추상화하는 것이기 때문입니다. 비공개로 정의하면 외부에서 액세스할 수 없습니다. 디자인 목적부터요. 오류는 다음과 같이 보고됩니다
    3. abstract class Sutdent extends Human{
          abstract private function study();}
      로그인 후 복사
치명적인 오류: 추상 함수 Sutdent::study()는 10행의 D:11index.php에서 비공개로 선언할 수 없습니다

    추상 클래스는 추상 클래스를 상속할 수 있습니다.
  1. 할 수 없습니다

    추상 상위 클래스의 추상 메서드를 재정의합니다. 이러한 사용법은 추상 클래스의 확장으로 이해될 수 있습니다. 예를 들어

    abstract class  Human{
        abstract function eat();}abstract class Sutdent extends Human{
        abstract function study();
        //abstract function eat(); 若重写抽象父类的抽象方法eat()会报错}
    로그인 후 복사
  2. 추상 부모 클래스의 추상 메서드를 재정의하면 다음 오류가 보고됩니다.

치명적인 오류: 추상 함수 Human::eat()를 상속할 수 없습니다(이전에 Sutdent에서 추상을 선언함). ) D:11index.php 11

Interface

1. 인터페이스의 정의

    인터페이스(인터페이스)를 사용하면 클래스가 어떤 메소드를 구현해야 하는지 지정할 수 있지만, 특정 메소드를 정의할 필요는 없습니다. 이러한 방법의 내용.
  • 인터페이스는 표준 클래스 정의와 마찬가지로 인터페이스 키워드를 통해 정의되지만, 그 안에 정의된 모든 메소드는 비어 있습니다.
  • 인터페이스에 정의된 모든 메소드는 공개되어야 합니다. 이는 인터페이스의 특성이며 비공개는 오류를 보고합니다(
  • 치명적인 오류: 인터페이스 메소드에 대한 액세스 유형

    ).

  • 상수: 상수는 인터페이스에서도 정의할 수 있습니다. 인터페이스 상수는 클래스 상수와 정확히 동일하게 사용되지만 하위 클래스나 하위 인터페이스로 재정의될 수 없습니다. (이렇게 사용하는 것은 권장하지 않습니다. 정말 의미가 생각나지 않고, 추상 클래스와 쉽게 혼동을 일으킬 수 있습니다.)
  • interface Play  {  
        const LEVEL=10;  
        public function PlayLOL();  
        public function PlayFootball();  }
    로그인 후 복사
  • ### 인터페이스 구현

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

추가됨:

추상 클래스를 상속하고 인터페이스를 구현할 수 있습니다.
추상 클래스는 인터페이스를 구현하므로 메서드를 다시 작성할 필요가 없습니다.

    여러 인터페이스를 구현할 때 인터페이스의 메서드는 동일한 이름을 가질 수 없습니다.
  • extends 연산자를 사용하여 인터페이스를 상속할 수도 있습니다.
  • 인터페이스를 구현하려면 클래스는 인터페이스에 정의된 메서드를 정확히 동일한 방식으로 사용해야 합니다. 그렇지 않으면 치명적인 오류가 발생합니다.
  • 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();}
    로그인 후 복사
인터페이스 상속

인터페이스는 다른 인터페이스 또는 여러 인터페이스를 상속할 수 있고, 확장 키워드를 사용할 수 있으며, 여러 인터페이스를 ','로 구분할 수 있지만 다른 인터페이스를 구현할 수는 없으며 물론 추상 클래스( 상속 추상 클래스 오류:

치명적인 오류: PlayGame은 Human을 구현할 수 없습니다. 10행의 D:11index.php에 있는 인터페이스가 아닙니다)

interface Play  {   
    public function PlayFootball();  }interface Play1  {   
    public function PlayFootball();  }interface PlayGame extends play,Play1{  
    public function PlayLOL();  }
로그인 후 복사
Summary

저는 보통 여기에 유사점과 차이점을 적습니다. 저는 제가 선호합니다. 안 쓸게요, 헤헤, 위에 충분히 자세하게 나와있으니까요.

간단히 요약하자면, 추상 클래스는 일반적으로 엔터티 유형을 정의하는 데 사용됩니다무엇입니까 여기에는 속성, 추상 메서드 및 비추상 메서드가 포함됩니다. 인터페이스는 엔터티 유형이 수행할 수 있는 작업을 정의하는 데 사용됩니다. 일반적으로 인터페이스에는 추상 메서드만 있고 상수는 거의 사용되지 않는 것으로 알려져 있습니다. 관련 추천:

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

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

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!