>백엔드 개발 >PHP 튜토리얼 >PHP 추상 클래스 기능 예제에 대한 자세한 설명

PHP 추상 클래스 기능 예제에 대한 자세한 설명

伊谢尔伦
伊谢尔伦원래의
2017-07-03 09:11:401863검색

추상 클래스의 특징

1. abstract로 정의된 클래스는 인스턴스화할 수 없습니다.
2. 적어도 하나의 메소드가 abstract로 선언된 경우 이 클래스는 abstract로 선언되어야 합니다.
3. abstract로 정의된 메서드는 호출 메서드(매개변수)만 선언하며 특정 함수 구현을 정의할 수 없습니다.
4. 추상 클래스를 상속할 때 하위 클래스는 상위 클래스의 모든 추상 메소드를 정의해야 합니다(이러한 메소드의 액세스 제어는 상위 클래스의 것과 동일해야 합니다(또는 더 완화되어야 함).)

demo

abstract class AbstractClass{
 // 强制要求子类定义这些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // 普通方法(非抽象方法)
    public function printOut() {
        print $this->getValue() . "\n";
    }
class ConcreteClass1 extends AbstractClass{   //父类定义了俩个抽象方法,如子类只实现了其中一个,则报如下错误//Fatal error: Class ConcreteClass1 contains 1 abstract //method and must therefore be declared abstract or //implement the remaining methods //(AbstractClass::prefixValue)
    protected function getValue() {
        return "ConcreteClass1";
    } 
   // 且子类的访问权限不能低于父类,如果将如下子类的访问方式改为private则会报如下错误
    //Fatal error: Access level to //ConcreteClass1::prefixValue() must be protected (as in //class AbstractClass) or weaker
    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }

}

//当实例化一个抽象类时,Fatal error: Cannot instantiate //abstract class AbstractClass
//$obj = new AbstractClass();
// 但是我们可以这么使用##########################################################
abstract class Foo{
     static function bar()
     {
         echo "test\n";
     }
 }

Foo::bar();##########################################################
$obj = new ConcreteClass1();
echo $obj->getValue();

5. 하위 클래스가 선택적 매개 변수를 정의할 수 있지만(즉, 기본값이 있어야 함) 상위 클래스의 추상 메서드 선언에 포함되지 않은 경우 둘 사이에 충돌이 없습니다. 선언.

abstract class AbstractClass{
    // 我们的抽象方法仅需要定义需要的参数
    abstract protected function prefixName($name);
}

class ConcreteClass extends AbstractClass
{

    // 我们的子类可以定义父类签名中不存在的可选参数
    // 如果这里的$separator没有默认值,则会报Fatal error: 、、//Declaration of ConcreteClass::prefixName() must be //compatible with that of AbstractClass::prefixName()
    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"), "\n";
echo $class->prefixName("Pacwoman"), "\n";

6. 추상 클래스는 추상 메소드를 가질 수 없습니다. 반대로 추상 메소드가 있는 클래스는 추상 클래스로 선언되어야 합니다.

abstract class A{
     public function show(){
         echo 'A';
     }
 } class B extends A{
     public function hello(){
         echo 'B';         
         parent::show();
     }
 } 
 $obj = new B; 
 $obj->hello(); // BA

7. 추상 메소드는 다음과 같이 정의됩니다. static

methods

// 正确的定义顺序
abstract class horse extends animal {
     public function get_breed() { return "Jersey"; }
 } 
 class cart extends horse {
     public function get_breed() { return "Wood"; }
 }
 // 错误的定义顺序,将会导致horse类找不到
 class cart extends horse {
     public function get_breed() { return "Wood"; }
 } 
 abstract class horse extends animal {
     public function get_breed() { return "Jersey"; }
 }
9. 추상 클래스가 다른 추상 클래스를 상속하는 경우 추상 메서드를 abstract
abstract class FOO
{
     abstract static function dump();
 } 
 class BAR extends FOO{
     static function dump(){var_dump("BAR");}
 }
BAR::dump(); // string(3) "BAR"
로 선언할 필요가 없습니다.

위 내용은 PHP 추상 클래스 기능 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.