Detaillierte Erläuterung der Funktionsbeispiele für abstrakte PHP-Klassen

伊谢尔伦
Freigeben: 2023-03-12 12:14:01
Original
1835 Leute haben es durchsucht

Eigenschaften der abstrakten Klasse

1. Als abstrakt definierte Klassen können nicht instanziiert werden.
2. Wenn mindestens eine Methode darin als abstrakt deklariert ist, muss diese Klasse als abstrakt deklariert werden.
3. Eine als abstrakt definierte Methode deklariert nur ihre aufrufende Methode (Parameter) und kann nicht ihre spezifische Funktionsimplementierung definieren.
4. Beim Erben einer abstrakten Klasse muss die Unterklasse alle abstrakten Methoden in der übergeordneten Klasse definieren (die Zugriffskontrolle dieser Methoden muss mit der in der übergeordneten Klasse identisch sein (oder entspannter) .)

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();
Nach dem Login kopieren

5. Die Unterklasse kann einen optionalen Parameter definieren (d. h. sie muss einen Standardwert haben), der nicht in enthalten ist Wenn Sie die abstrakte Methode der übergeordneten Klasse deklarieren, besteht kein Konflikt zwischen den beiden Anweisungen.

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";
Nach dem Login kopieren

6. Abstrakte Klassen benötigen keine abstrakten Methoden. Umgekehrt müssen Klassen mit abstrakten Methoden als abstrakte Klassen deklariert werden.

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
Nach dem Login kopieren

7

// 正确的定义顺序
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"; }
 }
Nach dem Login kopieren

8. Abstrakte Methoden können statischeMethoden sein

abstract class FOO
{
     abstract static function dump();
 } 
 class BAR extends FOO{
     static function dump(){var_dump("BAR");}
 }
BAR::dump(); // string(3) "BAR"
Nach dem Login kopieren

9. Wenn eine abstrakte Klasse eine andere abstrakte Klasse erbt, muss dies nicht der Fall sein als abstrakt deklariert werden

//Fatal error: Can't inherit abstract function //class1::someFunc() (previously declared abstract in //class2)abstract class class1 { 
   abstract public function someFunc(); 
 } 
 abstract class class2 extends class1 { 
   abstract public function someFunc(); 
 } 

//下面的是正确的
abstract class class1 { 
   abstract public function someFunc(); 
 } 
 abstract class class2 extends class1 { 
 }
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Funktionsbeispiele für abstrakte PHP-Klassen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage