Heim  >  Artikel  >  Backend-Entwicklung  >  php – abstrakte Klasse

php – abstrakte Klasse

伊谢尔伦
伊谢尔伦Original
2016-11-23 14:10:341075Durchsuche

PHP 5 unterstützt abstrakte Klassen und abstrakte Methoden. Als abstrakt definierte Klassen können nicht instanziiert werden. Jede Klasse muss als abstrakt deklariert werden, wenn mindestens eine Methode darin als abstrakt deklariert ist. Eine als abstrakt definierte Methode deklariert nur ihre aufrufende Methode (Parameter) und kann nicht ihre spezifische Funktionsimplementierung definieren.

Beim Erben einer abstrakten Klasse muss die Unterklasse alle abstrakten Methoden in der übergeordneten Klasse definieren. Außerdem muss die Zugriffskontrolle dieser Methoden dieselbe (oder entspannter) sein wie in der übergeordneten Klasse. Wenn beispielsweise eine abstrakte Methode als geschützt deklariert ist, sollte die in der Unterklasse implementierte Methode als geschützt oder öffentlich deklariert werden und kann nicht als privat definiert werden. Darüber hinaus müssen die aufrufenden Methoden übereinstimmen, d. h. Art und Anzahl der erforderlichen Parameter müssen konsistent sein. Wenn beispielsweise eine Unterklasse einen optionalen Parameter definiert, der nicht in der Deklaration einer abstrakten Methode der übergeordneten Klasse enthalten ist, besteht kein Konflikt zwischen den beiden Deklarationen. Dies gilt auch für Konstruktoren seit PHP 5.4. Konstruktordeklarationen vor PHP 5.4 könnten unterschiedlich sein.

Beispiel #1 Beispiel für eine abstrakte Klasse

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>";

Ausgabeergebnis:

ConcteteClass1

Foo_ConcreteClass1

ConcreteClass2

Bar_ConcreteClass2

Beispiel #2 Abstraktes Klassenbeispiel

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;;

Ausgabeergebnis:

Mr. Pacman

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn