Computer >> 컴퓨터 >  >> 프로그램 작성 >> PHP

PHP에서 추상 클래스를 설명합니다.

<시간/>

PHP5는 객체 지향 모델과 함께 제공됩니다. 객체 지향 모델의 개념 중 일부는 클래스, 객체, 캡슐화, 다형성, 추상 및 최종 클래스, 메서드, 인터페이스 및 상속 등입니다. 이 기사에서는

우리는 추상 클래스와 PHP의 객체 지향 기술과 관련된 기능에 대해 논의할 것입니다. 또한 몇 가지 예와 함께 추상 클래스의 구현을 배울 것입니다.

하지만 너무 깊이 들어가기 전에 추상 클래스를 정의하는 방법을 알아봅시다.

클래스 이름에 abstract 키워드를 붙임으로써 클래스를 abstract로 선언할 수 있습니다. 정의는 매우 명확합니다. 추상 메서드를 포함하는 클래스를 추상 클래스라고 합니다. 추상 클래스에서 정의하는 추상 메서드는 이름과 인수만 있고 다른 코드는 없습니다.

추상 클래스의 객체는 만들 수 없습니다. 오히려 함수의 정의를 계산하는 자식 클래스를 자식 클래스의 추상 메서드 본문으로 확장하고 이러한 자식 클래스를 사용하여 개체를 만들어야 합니다.

PHP의 추상 클래스에 대한 몇 가지 중요한 사실에 대해 논의해 보겠습니다.

1.추상 클래스는 추상이 아닌 메소드와 함께 추상을 가질 수 있습니다.

예:

<?php
   abstract class base {
      abstract function printdata();
      public function getdata() {
         echo "Tutorials Point";
      }
   }
   class child extends base{
      public function printdata(){
         echo "Good morning";
      }
   }
   $obj = new child();
   $obj->getdata();
?>

출력:

Tutorials Point

2.직접 인스턴스화할 수 없습니다.

예:

<?php
   abstract class AbstractClass{
      abstract protected function calculate();
      public function adddata() {
         echo "Addition done";
      }
   }
   $obj=new AbstractClass();
   $obj->adddata();
?>

출력:

Fatal error: Uncaught Error: Cannot instantiate abstract class AbstractClass

3. 동일한(또는 덜 제한된) 가시성:

모든 자식 클래스는 부모 클래스에서 추상으로 표시된 모든 메서드를 정의해야 하며 이러한 모든 메서드는 동일한 서명 또는 덜 제한된 서명으로 정의해야 합니다. 보호된 가시성을 가진 추상 메서드를 부모 클래스에서 정의하면 자식 클래스 실행에서 private가 아닌 protected orpublic으로 정의해야 한다고 가정합니다.

예:

<?php
   abstract class AbstractBaseClass1{
      abstract public function addValue();
      abstract protected function getValue();
   }
   class ConcreteClass extends AbstractBaseClass1{
      protected function addValue() {
         return "ConcreteClass";
      }
      public function getValue() {
         return " Child Class";
      }
   }
   $classobj = new ConcreteClass;
   $classobj->addValue();
?>

출력:

Fatal errorAccess level to ConcreteClass::addValue() must be public (as in class AbstractBaseClass1)

4.추상 메소드는 본문을 포함할 수 없습니다:

추상으로 선언된 메소드는 단순히 메소드의 서명을 선언합니다. 내부에 누구도 정의할 수 없습니다. 비록 몸이 비추상 메서드 안에 존재할 수 있지만.

예:

<?php
   abstract class ParentClass{
      abstract protected function printValue(){
         return "Good morning";
      }
   }
   class ClassA extends ParentClass{
      protected function printValue() {
         return "ConcreteClass1";
      }
   }
   $classobj = new ClassA;
   $classobj->printValue();
?>

출력:

PHP Fatal error: Abstract function ParentClass::printValue() cannot contain body

5. 최소한 하나의 추상 메소드를 포함하는 모든 클래스는 추상 클래스로 선언되어야 합니다.

추상 클래스는 추상 및 비추상 메서드를 가질 수 있지만 최소한 하나의 추상 메서드를 포함해야 합니다. 추상 메서드가 포함되어 있으면 추상으로 선언해야 합니다.

예:

<?php
   class AbstractClass {
      abstract protected function getValue();
      public function printData() {
         echo " Welcome to Tutorials Point";
      }
   }
   $obj=new AbstractClass();
   $obj->printData();
?>

출력:

PHP Fatal error: Class AbstractClass contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue)

6.Abstract 클래스는 다중 상속을 지원하지 않습니다.

다중 상속을 지원하지 않습니다.

예:

<?php
   Abstract class SuperClass{
      public abstract function test();
      protected function welcome(){
         echo "Good morning";
      }
   }
   class ClassA extends SuperClass{
      public function test(){
         echo "Hello";
      }
      protected function welcome(){
         echo "Good afternoon";
      }
   }
   class ClassB extends SuperClass{
      public function test(){
         echo "Hello";
      }
      protected function welcome(){
         echo "Good evening";
      }
   }
   class ClassC extends ClassA, ClassB{
      public function test1(){
         $c = new self();
         $c->welcome();
      }
   }
?>

출력:

Error

설명:

여기에서 우리는 SuperClass를 test() 및 welcome() 메서드가 있는 추상 클래스로 선언했으며 ClassA 및 ClassB 및 구체적인 클래스는 추상 클래스에서 확장됩니다. 그런 다음 ClassA 및 ClassB에서 확장된 ClassC를 만들려고 했습니다. 코드에서 알 수 있듯이 객체 ClassC를 사용하여 welcome() 메서드를 호출할 때 컴파일러가 ClassA의 welcome() 또는 ClassB의 welcome() 메서드를 호출할지 여부를 선택하는 것은 불가능합니다. 따라서 이러한 복잡성을 피하기 위해 PHP는 다중 상속을 지원하지 않습니다.

참고:

추상 클래스는 다른 추상 클래스를 확장할 수 있으며 추상 클래스는 인터페이스의 구현을 제공할 수 있습니다.