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:
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 .
Verwandte Lernempfehlungen: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.
PHP-Programmierung vom Anfänger bis zum ExpertenZusammenfassung:
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('FOO_') ."\n"; $class2 = new ConcreteClass2; $class2->printOut(); echo $class2->prefixValue('FOO_') ."\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"; ?>
Dies ist leichter zu verstehen und wird nicht im Detail beschrieben
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 Operatorzugreifen.
Der statische Aufruf einer nicht statischen Methode führt zu einem Fehler der Ebene
.$this
Wie 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. ->
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 🎜>$this
<?php class Foo { public static $my_static = 'foo'; 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 = 'Foo'; 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 = 'Foo'; $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!