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는 다중 상속을 지원하지 않습니다.
참고:
추상 클래스는 다른 추상 클래스를 확장할 수 있으며 추상 클래스는 인터페이스의 구현을 제공할 수 있습니다.