Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erläuterung der Prinzipien und Verwendung von Abstract, Final und Static in PHP

Detaillierte Erläuterung der Prinzipien und Verwendung von Abstract, Final und Static in PHP

coldplay.xixi
coldplay.xixinach vorne
2020-07-14 17:30:343780Durchsuche

Detaillierte Erläuterung der Prinzipien und Verwendung von Abstract, Final und Static in PHP

Die Beispiele in diesem Artikel beschreiben die Prinzipien und die Verwendung von Abstract, Final und Static in PHP. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

abstrakt (abstrakt)

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), kann ihre spezifische Funktionsimplementierung nicht definieren .

Beim Erben einer abstrakten Klasse muss die Unterklasse alle abstrakten Methoden in der übergeordneten Klasse definieren ; >Zugriffskontrolle für diese Methoden muss die gleiche (oder lockerer) 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 (Striktheit: privat>geschützt>öffentlich), kann jedoch nicht als privat definiert werden. Darüber hinaus müssen die aufrufenden Methoden der -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.

Verwandte Lernempfehlungen:
PHP-Programmierung vom Anfänger bis zum Experten

Zusammenfassung:

    Abstrakte Klassen können nicht instanziiert werden.
  • Wenn die Klasse abstrakte Methoden enthält, muss diese Klasse auch abstrakt sein Kann nur die aufrufende Methode und die Parameter deklarieren, aber keine spezifische Funktionsimplementierung definieren.
  • Unterklassen, die eine abstrakte Klasse erben, müssen alle abstrakten Methoden der abstrakten Klasse implementieren
  • Die Zugriffskontrolle der in der Unterklasse implementierten abstrakten Methoden muss strenger sein als die Zugriffskontrolle der übergeordneten Klasse.

  • Die aufrufende Methode und die Anzahl der Parameter der Methode Die in der Unterklasse implementierte Methode muss mit der implementierten Methode übereinstimmen.

  • Beispiel:

    <?php
    abstract class AbstractClass
    {
      // 强制要求子类定义这些方法,不定义功能实现
      abstract protected function getValue();
      abstract protected function prefixValue($prefix);
    
      // 普通方法(非抽象方法),子类可以不重写
      public function printOut() {
        print $this->getValue() . "\n";
      }
    }
    
    class ConcreteClass1 extends AbstractClass
    {
      protected function getValue() {
        return "ConcreteClass1";
      }
    
      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;) ."\n";
    
    $class2 = new ConcreteClass2;
    $class2->printOut();
    echo $class2->prefixValue(&#39;FOO_&#39;) ."\n";
    ?>
    <?php
    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"), "\n";
    echo $class->prefixName("Pacwoman"), "\n";
    ?>
  • final
  • Wenn eine Methode in der übergeordneten Klasse als final deklariert ist, kann die Unterklasse die Methode nicht überschreiben. Wenn eine Klasse als final deklariert ist, kann sie nicht vererbt werden.

Dies ist leichter zu verstehen und wird nicht im Detail beschrieben

statisch

Wenn Sie ein Klassenattribut oder eine Methode als statisch deklarieren, können Sie direkt darauf zugreifen, ohne es zu instanziieren die Klasse. Auf statische Eigenschaften kann nicht über ein Objekt einer instanziierten Klasse zugegriffen werden (auf statische Methoden ist dies jedoch möglich).

Aus Gründen der Kompatibilität mit PHP 4 sind Eigenschaften und Methoden standardmäßig öffentlich, wenn keine Zugriffskontrolle angegeben ist.

Da statische Methoden keinen Aufruf eines Objekts erfordern, sind Pseudovariablen

in statischen Methoden nicht verfügbar.

Auf statische Eigenschaften können Objekte nicht über den Operator

zugreifen.

Der statische Aufruf einer nicht statischen Methode führt zu einem Fehler der Ebene

.

$thisWie alle anderen statischen PHP-Variablen können statische Eigenschaften nur als Literale oder Konstanten initialisiert werden, nicht als Ausdrücke. Eine statische Eigenschaft kann also mit einer Ganzzahl oder einem Array initialisiert werden, sie kann jedoch nicht mit einem anderen Variablen- oder Funktionsrückgabewert initialisiert werden und kann auch nicht auf ein Objekt verweisen.

Seit PHP 5.3.0 können Sie eine Variable verwenden, um eine Klasse dynamisch aufzurufen. Der Wert dieser Variablen darf jedoch nicht die Schlüsselwörter self, parent oder static sein. ->

Zusammenfassung:

E_STRICT

Statische Methoden müssen nicht instanziiert werden und können direkt aufgerufen werden

Objekte, die von a instanziiert werden; Die Klasse kann in statischen Methoden nicht auf die statischen Eigenschaften zugreifen.

  • Pseudovariablen

    sind in statischen Methoden nicht verfügbar 🎜>
  • Auf statische Eigenschaften kann nicht über den Operator -> zugegriffen werden. Der statische Aufruf einer nicht statischen Methode führt zu einem Fehler auf der Ebene
  • ;

  • Statische Eigenschaften können nur als Literale oder Konstanten initialisiert werden, Ausdrücke können nicht verwendet werden (Funktionsrückgabewert/ vielmehr eine Variable/ein Objekt); 🎜> kann mithilfe einer Variablenart dynamisch aufgerufen werden. Der Wert dieser Variablen darf jedoch nicht die Schlüsselwörter self, parent oder static sein.

    $this

    <?php
    class Foo
    {
      public static $my_static = &#39;foo&#39;;
    
      public function staticValue() {
        return self::$my_static;
      }
    }
    
    class Bar extends Foo
    {
      public function fooStatic() {
        return parent::$my_static;
      }
    }
    
    print Foo::$my_static . "\n";
    
    $foo = new Foo();
    print $foo->staticValue() . "\n";
    print $foo->my_static . "\n";   // Undefined "Property" my_static 
    
    print $foo::$my_static . "\n";
    $classname = &#39;Foo&#39;;
    print $classname::$my_static . "\n"; // As of PHP 5.3.0
    
    print Bar::$my_static . "\n";
    $bar = new Bar();
    print $bar->fooStatic() . "\n";
    ?>
      </programlisting>
     </example>
    
     <example>
      <title>静态方法示例</title>
      <programlisting role="php">
    <![CDATA[
    <?php
    class Foo {
      public static function aStaticMethod() {
        // ...
      }
    }
    
    Foo::aStaticMethod();
    $classname = &#39;Foo&#39;;
    $classname::aStaticMethod(); // 自 PHP 5.3.0 起
    ?>

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Prinzipien und Verwendung von Abstract, Final und Static in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen