programing

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

goodsources 2022. 11. 10. 20:55
반응형

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

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

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

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

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

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

자세한 내용은 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 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. 동일한(또는 제한적인) 가시성:추상 클래스에서 상속하는 경우 부모 클래스 선언에서 추상이라고 표시된 모든 메서드는 하위 항목에 의해 정의되어야 합니다. 또한 이러한 메서드는 동일한(또는 제한되지 않은) 가시성으로 정의되어야 합니다.예를 들어 추상 메서드가 보호됨으로 정의되어 있는 경우 함수 구현은 보호됨 또는 공용으로 정의되어야 하지만 비공개로 정의되어서는 안 됩니다.

추상적 방법은 비공개로 하면 안 됩니다.

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

주의: 코드의 클래스 순서나 위치는 인터프리터에 영향을 미쳐 치명적인 오류를 일으킬 수 있습니다.따라서 여러 수준의 추상화를 사용할 때는 소스 코드 내의 클래스 위치에 주의하십시오.

다음 예제는 치명적인 오류를 발생시킵니다. 클래스 'horse'를 찾을 수 없습니다.

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. 상속 목적으로만 사용

Method
할 수 . 본문을 포함할 수 없습니다.
할 수 . 비공개로 정의할 수 없습니다.
자녀 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
  • Abstract Class에는 메서드의 서명 선언만 포함되어 있으며 구현을 정의할 수 없습니다.
  • 추상화 클래스는 키워드 abstract를 사용하여 정의합니다.
  • Abstract 클래스는 다중 상속을 구현할 수 없습니다.
  • 최신 버전의 PHP 5에는 추상적인 클래스와 메서드가 도입되어 있습니다.
  • abstract로 정의된 클래스는 개체를 만들 수 없습니다(인스턴스화되지 않을 수 있습니다).

추상 클래스는 일반 클래스와 같으며 변수가 들어 있으며 보호 변수 함수가 들어 있습니다. 생성자가 들어 있습니다. 단, 추상 메서드가 들어 있습니다.

추상 메서드는 정의되지 않은 빈 메서드를 의미하므로 추상 클래스의 한 가지 차이만 있으면 추상 클래스의 개체를 만들 수 없습니다.

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

언급URL : https://stackoverflow.com/questions/2558559/what-is-an-abstract-class-in-php

반응형