Les exemples de cet article décrivent les principes et l'utilisation de abstract, final et static en PHP. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :
PHP 5 prend en charge les classes abstraites et les méthodes abstraites. Les classes définies comme abstraites ne peuvent pas être instanciées. Toute classe doit être déclarée abstraite si au moins une méthode qu'elle contient est déclarée abstraite. Une méthode définie comme abstraite déclare uniquement sa méthode appelante (paramètres), ne peut pas définir son implémentation de fonction spécifique .
Lors de l'héritage d'une classe abstraite, la sous-classe doit définir toutes les méthodes abstraites dans la classe parent en plus, Le contrôle d'accès pour ces méthodes doit être le même (ou plus assoupli) que dans la classe parent. Par exemple, si une méthode abstraite est déclarée comme protégée, alors la méthode implémentée dans la sous-classe doit être déclarée comme protégée ou publique (rigueur : privé> protégé> public), mais ne peut pas être définie comme privée. De plus, les méthodes d'appel des méthodes doivent correspondre, c'est-à-dire que le type et le nombre de paramètres requis doivent être cohérents . Par exemple, si une sous-classe définit un paramètre facultatif qui n'est pas inclus dans la déclaration d'une méthode abstraite de la classe parent, il n'y a pas de conflit entre les deux déclarations. Cela s'applique également aux constructeurs depuis PHP 5.4. Les déclarations des constructeurs avant PHP 5.4 pouvaient être différentes.
Recommandations d'apprentissage associées :Résumé :
<?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"; ?>
statiqueDéclarer un attribut ou une méthode de classe comme statique vous permet d'y accéder directement sans instancier la classe. Les propriétés statiques ne sont pas accessibles via un objet d'une classe qui a été instanciée (mais les méthodes statiques le peuvent). Pour des raisons de compatibilité avec PHP 4, si aucun contrôle d'accès n'est spécifié, les propriétés et méthodes sont par défaut publiques. Étant donné que les méthodes statiques ne nécessitent pas l'appel d'un objet, les pseudo-variablesCeci est plus facile à comprendre et ne sera pas décrit en détail
ne sont pas disponibles dans les méthodes statiques.
Les propriétés statiques ne sont pas accessibles aux objets via l'opérateur $this
.
L'appel statique d'une méthode non statique entraînera une erreur de niveau ->
.
Comme toutes les autres variables statiques PHP, les propriétés statiques ne peuvent être initialisées qu'avec des littéraux ou des constantes, pas des expressions. Par conséquent, une propriété statique peut être initialisée avec un entier ou un tableau, mais elle ne peut pas être initialisée avec une autre valeur de retour de variable ou de fonction, ni pointer vers un objet. E_STRICT
$this
E_STRICT
<?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 起 ?>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!