>  기사  >  백엔드 개발  >  php--추상 클래스

php--추상 클래스

伊谢尔伦
伊谢尔伦원래의
2016-11-23 14:10:341046검색

PHP 5는 추상 클래스와 추상 메소드를 지원합니다. abstract로 정의된 클래스는 인스턴스화할 수 없습니다. 적어도 하나의 메소드가 추상으로 선언된 경우 모든 클래스는 추상으로 선언되어야 합니다. abstract로 정의된 메서드는 호출 메서드(매개변수)만 선언하고 특정 함수 구현을 정의할 수는 없습니다.

추상 클래스를 상속할 때 하위 클래스는 상위 클래스의 모든 추상 메서드를 정의해야 하며, 이러한 메서드의 액세스 제어는 상위 클래스와 동일하거나 더 완화되어야 합니다. 예를 들어 추상 메서드가 protected로 선언된 경우 하위 클래스에 구현된 메서드는 protected 또는 public으로 선언되어야 하며 private으로 정의할 수 없습니다. 또한 메서드를 호출하는 메서드가 일치해야 합니다. 즉, 필수 매개변수의 유형과 개수가 일관되어야 합니다. 예를 들어, 하위 클래스가 상위 클래스의 추상 메서드 선언에 포함되지 않은 선택적 매개 변수를 정의하는 경우 두 선언 간에 충돌이 없습니다. 이는 PHP 5.4 이후의 생성자에도 적용됩니다. PHP 5.4 이전의 생성자 선언은 다를 수 있습니다.

예제 #1 추상 클래스 예

abstract class AbstractClass
{
    //强制要求子类定义这些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);
    //普通方法(非抽象方法)
    public function printOut()
    {
        print $this->getValue().&#39;<br>&#39;;
    }
}
class ConcreteClass1 extends AbstractClass
{
    protected function getValue()
    {
        return "ConcteteClass1";
    }
    public function prefixValue($prefix){
        return "{$prefix}ConcreteClass1";
    }
}
class ConcreteClass2 extends AbstractClass
{
    public function getValue(){
        return "ConcreteClass2";
    }
    public function prefixValue($prefix){
        return "{$prefix}ConcreteClass2";
    }
}
$class1 = new ConcreteClass1;
$class1 -> printOut();
echo $class1->prefixValue(&#39;Foo_&#39;)."<br>";
$class2 = new ConcreteClass2;
$class2 -> printOut();
echo $class2->prefixValue(&#39;Bar_&#39;)."<br>";

출력 결과:

ConcteteClass1

Foo_ConcreteClass1

ConcreteClass2

Bar_ConcreteClass2

예제 #2 추상 클래스 예

abstract class AbstractClass
{
    //我们的抽象方法仅需要定义需要的参数 
    abstract protected function prefixName($name);
}
class ConcreteClass extends AbstractClass
{
    //我们的子类可以定义父类签名中不存在的可选参数
    public function prefixName($name,$separator=&#39;.&#39;){
        if($name == &#39;Pacman&#39;){
            $prefix = "Mr";
        }elseif($name == &#39;Pacwoman&#39;){
            $prefix = &#39;Mrs&#39;;
        }else{
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}
$class = new ConcreteClass;
echo $class->prefixName(&#39;Pacman&#39;).&#39;<br>&#39;;
echo $class->prefixName(&#39;Pacwoman&#39;).&#39;<br>&#39;;

출력 결과:

Mr. Pacwoman

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