PHP에서 추상 클래스는 무엇입니까?


121

PHP에서 추상 클래스는 무엇입니까?

어떻게 사용할 수 있습니까?




6
@Gordon는 : 때때로 공식 문서는 :( 일부 사람들이 명확하지 않다
Sarfraz


3
RTFM 방식이 아닌 @Sarfraz. 공식 문서에 대한 링크가 있으면 유용한 자산이라고 생각합니다. 그리고 당신은 얼마나 많은 사람들이 공식 문서를 읽지 않거나 그들이 존재한다는 것을 알지 못할 것입니다.
Gordon

답변:


131

추상 클래스는 하나 이상의 추상 메서드를 포함하는 클래스로, 실제 코드가없는 메서드, 이름과 매개 변수 만 있으며 "추상"으로 표시됩니다.

이것의 목적은 상속 할 템플릿을 제공하고 상속 클래스가 추상 메서드를 구현하도록 강제하는 것입니다.

따라서 추상 클래스는 일반 클래스와 순수 인터페이스 사이에 있습니다. 또한 인터페이스는 모든 메서드가 추상 인 추상 클래스의 특수한 경우입니다.

자세한 내용 은 PHP 매뉴얼 의이 섹션 을 참조하십시오.


6
에서 이 스레드 , 추상은 추상 메소드를 포함하지 않습니다.
r0ng

6
@ r0ng 추상 클래스 추상 메서드를 포함 할 수 있으며 추상 메서드는 항상 추상 클래스 내부에 있어야 한다고 말하는 것이 더 정확할 것입니다 . 내 생각에 정의 된 실용적인 기능은 추상 클래스는 인스턴스화 할 수 없지만 메서드를 상속하고 덮어 쓸 수 있으며 추상 클래스의 정적 메서드를 정상적으로 사용할 수 있다는 것입니다.
okdewit

117

추상 클래스는 하나 이상의 추상 메서드를 포함하는 클래스입니다. 추상 메서드는 선언되었지만 구현이없는 메서드입니다. 추상 클래스는 인스턴스화되지 않을 수 있으며 추상 메서드에 대한 구현을 제공하기 위해 하위 클래스가 필요합니다.

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
잘 정교합니다.
Talk2Nit

18

추상 클래스는 프로그래머가 부분적으로 만 구현 한 클래스입니다. 하나 이상의 추상 메서드를 포함 할 수 있습니다. 추상 메서드는 프로그래머에게 메서드가 자식 클래스에서 구현되어야 함을 알리는 역할을하는 함수 정의입니다.

여기 에 그것에 대한 좋은 설명이 있습니다 .


안녕하세요, 설명해 주셔서 감사합니다. 사실은 PHP의 추상 및 인터페이스에 대한 인터넷에 이와 같은 좋은 설명이 없다는 것입니다.
Lenin Zapata

12

추상 클래스
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

자식 클래스 object에 의해 부모 보호 메서드를 호출 할 수 없으며이 개체에 의해 자식 클래스 메서드에서 호출 할 수 있습니다. echo $ b-> test2 (). "<br/>";
Al-Amin

7
  • 추상 클래스는 메서드의 서명 만 선언하고 구현을 정의 할 수 없습니다.
  • 추상화 클래스는 abstract 키워드를 사용하여 정의됩니다 .
  • 추상 클래스는 다중 상속 을 구현할 수 없습니다 .
  • 최신 버전의 PHP 5에는 추상 클래스와 메서드가 도입되었습니다.
  • abstract로 정의 된 클래스, 우리는 객체를 생성 할 수 없습니다 (인스턴스화되지 않을 수 있습니다)

0

추상 클래스는 직접 초기화 할 수없는 클래스입니다. 즉, 추상 클래스는 객체를 직접 생성 할 수없는 클래스라고 말할 수 있습니다. PHP에서 추상 클래스는 abstract 키워드로 무시됩니다 .

또한 하나의 클래스 추상이되기 위해서는 클래스의 하나의 메서드가 추상이어야합니다.

추상 클래스에 대한 자세한 내용은 PHP의 추상 클래스에 대한 내 블로그를 참조하십시오 .


0

추상 클래스는 일반 클래스와 비슷하며 보호 된 변수를 포함하는 함수를 포함하며 생성자를 포함하는 것은 추상 메서드를 포함하는 것과 다릅니다.

추상 메서드는 정의가없는 빈 메서드를 의미하므로 추상 클래스에서 단 하나의 차이점 만 있으면 추상 클래스의 객체를 만들 수 없습니다.

추상은 추상 메서드를 포함해야하며 이러한 메서드는 상속 클래스에서 정의되어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.