답변:
추상 클래스는 하나 이상의 추상 메서드를 포함하는 클래스로, 실제 코드가없는 메서드, 이름과 매개 변수 만 있으며 "추상"으로 표시됩니다.
이것의 목적은 상속 할 템플릿을 제공하고 상속 클래스가 추상 메서드를 구현하도록 강제하는 것입니다.
따라서 추상 클래스는 일반 클래스와 순수 인터페이스 사이에 있습니다. 또한 인터페이스는 모든 메서드가 추상 인 추상 클래스의 특수한 경우입니다.
자세한 내용 은 PHP 매뉴얼 의이 섹션 을 참조하십시오.
추상 클래스는 하나 이상의 추상 메서드를 포함하는 클래스입니다. 추상 메서드는 선언되었지만 구현이없는 메서드입니다. 추상 클래스는 인스턴스화되지 않을 수 있으며 추상 메서드에 대한 구현을 제공하기 위해 하위 클래스가 필요합니다.
1. 추상 클래스를 인스턴스화 할 수 없음 : 추상으로 정의 된 클래스는 인스턴스화 할 수 없으며 적어도 하나의 추상 메소드를 포함하는 클래스도 추상이어야합니다.
아래 예 :
abstract class AbstractClass
{
abstract protected function getValue();
abstract protected function prefixValue($prefix);
public function printOut() {
echo "Hello how are you?";
}
}
$obj=new AbstractClass();
$obj->printOut();
//Fatal error: Cannot instantiate abstract class AbstractClass
2. 적어도 하나의 추상 메서드를 포함하는 모든 클래스는 추상이어야합니다 . 추상 클래스는 추상 및 비추 상 메서드를 가질 수 있지만 적어도 하나의 추상 메서드를 포함해야합니다. 클래스에 하나 이상의 추상 메서드가있는 경우 클래스는 추상으로 선언되어야합니다.
참고 : 특성은 전시 클래스에 요구 사항을 부과하기 위해 추상 메서드 사용을 지원합니다.
아래 예 :
class Non_Abstract_Class
{
abstract protected function getValue();
public function printOut() {
echo "Hello how are you?";
}
}
$obj=new Non_Abstract_Class();
$obj->printOut();
//Fatal error: Class Non_Abstract_Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Non_Abstract_Class::getValue)
3. 추상 메서드는 본문을 포함 할 수 없습니다 . 추상으로 정의 된 메서드는 단순히 메서드의 서명을 선언합니다. 구현을 정의 할 수 없습니다. 그러나 비 추상적 인 방법으로 구현을 정의 할 수 있습니다.
abstract class AbstractClass
{
abstract protected function getValue(){
return "Hello how are you?";
}
public function printOut() {
echo $this->getValue() . "\n";
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
//Fatal error: Abstract function AbstractClass::getValue() cannot contain body
4. 추상 클래스에서 상속 할 때 부모의 클래스 선언에서 abstract로 표시된 모든 메서드는 자식에 의해 정의되어야합니다 . 추상 클래스를 상속하는 경우 모든 추상 메서드에 구현을 제공해야합니다.
abstract class AbstractClass
{
// Force Extending class to define this method
abstract protected function getValue();
// Common method
public function printOut() {
print $this->getValue() . "<br/>";
}
}
class ConcreteClass1 extends AbstractClass
{
public function printOut() {
echo "dhairya";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
//Fatal error: Class ConcreteClass1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue)
5. 동일하거나 덜 제한된 가시성 : 추상 클래스에서 상속 할 때 부모의 클래스 선언에서 추상으로 표시된 모든 메서드는 자식에 의해 정의되어야합니다. 또한 이러한 메서드는 동일하거나 덜 제한된 가시성을 사용하여 정의해야합니다. 예를 들어, 추상 메서드가 protected로 정의 된 경우 함수 구현은 private이 아닌 protected 또는 public으로 정의되어야합니다.
추상 메서드는 비공개가 아니어야합니다.
abstract class AbstractClass
{
abstract public function getValue();
abstract protected function prefixValue($prefix);
public function printOut() {
print $this->getValue();
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."<br/>";
//Fatal error: Access level to ConcreteClass1::getValue() must be public (as in class AbstractClass)
6. 추상 메서드의 서명은 일치해야합니다 : 추상 클래스에서 상속 할 때 부모의 클래스 선언에서 추상으로 표시된 모든 메서드는 자식에 의해 정의되어야합니다. 메서드의 서명은 일치해야합니다 (예 : 유형 힌트 및 필요한 개수). 인수는 동일해야합니다. 예를 들어, 자식 클래스가 추상 메서드의 서명이없는 선택적 인수를 정의하면 서명에 충돌이 없습니다.
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"), "<br/>";
echo $class->prefixName("Pacwoman"), "<br/>";
//output: Mr. Pacman
// Mrs. Pacwoman
7. 추상 클래스는 다중 상속을 지원하지 않습니다 . : 추상 클래스는 다른 추상 클래스를 확장 할 수 있으며, 추상 클래스는 인터페이스 구현을 제공 할 수 있습니다. 그러나 다중 상속을 지원하지 않습니다.
interface MyInterface{
public function foo();
public function bar();
}
abstract class MyAbstract1{
abstract public function baz();
}
abstract class MyAbstract2 extends MyAbstract1 implements MyInterface{
public function foo(){ echo "foo"; }
public function bar(){ echo "bar"; }
public function baz(){ echo "baz"; }
}
class MyClass extends MyAbstract2{
}
$obj=new MyClass;
$obj->foo();
$obj->bar();
$obj->baz();
//output: foobarbaz
참고 : 코드에서 클래스의 순서 나 위치는 인터프리터에 영향을 미치고 치명적인 오류를 일으킬 수 있습니다. 따라서 여러 수준의 추상화를 사용할 때 소스 코드 내에서 클래스의 위치에주의해야합니다.
아래 예제는 치명적인 오류 를 일으킬 것입니다 : Class 'horse'not found
class cart extends horse {
public function get_breed() { return "Wood"; }
}
abstract class horse extends animal {
public function get_breed() { return "Jersey"; }
}
abstract class animal {
public abstract function get_breed();
}
$cart = new cart();
print($cart->get_breed());
추상 클래스는 프로그래머가 부분적으로 만 구현 한 클래스입니다. 하나 이상의 추상 메서드를 포함 할 수 있습니다. 추상 메서드는 프로그래머에게 메서드가 자식 클래스에서 구현되어야 함을 알리는 역할을하는 함수 정의입니다.
추상 클래스
1. 추상 메서드를 포함합니다
. 2. 직접 초기화
할 수 없습니다. 3. 추상 클래스의 객체를 생성 할 수 없습니다
. 4. 상속 목적으로 만 사용됩니다.
추상 방법
1. 본문을 포함 할 수 없습니다
. 2. 전용으로 정의 할 수 없습니다.
3. 자식 클래스는 추상 클래스에서 선언 된 메서드를 정의해야합니다.
예제 코드 :
abstract class A {
public function test1() {
echo 'Hello World';
}
abstract protected function f1();
abstract public function f2();
protected function test2(){
echo 'Hello World test';
}
}
class B extends A {
public $a = 'India';
public function f1() {
echo "F1 Method Call";
}
public function f2() {
echo "F2 Method Call";
}
}
$b = new B();
echo $b->test1() . "<br/>";
echo $b->a . "<br/>";
echo $b->test2() . "<br/>";
echo $b->f1() . "<br/>";
echo $b->f2() . "<br/>";
산출:
Hello World
India
Hello World test
F1 Method Call
F2 Method Call
추상 클래스는 직접 초기화 할 수없는 클래스입니다. 즉, 추상 클래스는 객체를 직접 생성 할 수없는 클래스라고 말할 수 있습니다. PHP에서 추상 클래스는 abstract 키워드로 무시됩니다 .
또한 하나의 클래스 추상이되기 위해서는 클래스의 하나의 메서드가 추상이어야합니다.
추상 클래스에 대한 자세한 내용은 PHP의 추상 클래스에 대한 내 블로그를 참조하십시오 .
추상 클래스는 일반 클래스와 비슷하며 보호 된 변수를 포함하는 함수를 포함하며 생성자를 포함하는 것은 추상 메서드를 포함하는 것과 다릅니다.
추상 메서드는 정의가없는 빈 메서드를 의미하므로 추상 클래스에서 단 하나의 차이점 만 있으면 추상 클래스의 객체를 만들 수 없습니다.
추상은 추상 메서드를 포함해야하며 이러한 메서드는 상속 클래스에서 정의되어야합니다.