Explication détaillée des principes et de l'utilisation de abstract, final et static en PHP

coldplay.xixi
Libérer: 2023-04-09 08:08:01
avant
3732 Les gens l'ont consulté

Explication détaillée des principes et de l'utilisation de abstract, final et static en PHP

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 :

résumé (résumé)

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 :

Programmation PHP du débutant au compétent

Résumé :

  • Les classes abstraites ne peuvent pas être instanciées ;

  • S'il y a des méthodes abstraites dans la classe, cette classe doit également être abstraite

  • Classes abstraites ; only Peut déclarer la méthode appelante et les paramètres, mais ne peut pas définir une implémentation de fonction spécifique

  • Les sous-classes qui héritent d'une classe abstraite doivent implémenter toutes les méthodes abstraites de la classe abstraite ;

    Le contrôle d'accès des méthodes abstraites implémentées dans la sous-classe doit être plus strict que le contrôle d'accès de la classe parent
  • La méthode appelante et le nombre de paramètres de la méthode ; implémentées dans la sous-classe doivent être les mêmes, car la méthode implémentée est cohérente.
  • Exemple :
  • <?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";
    ?>
    Copier après la connexion
    <?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";
    ?>
    Copier après la connexion
final

Si une méthode de la classe parent est déclarée finale, la sous-classe ne peut pas remplacer la méthode. Si une classe est déclarée finale, elle ne peut pas être héritée.

Ceci est plus facile à comprendre et ne sera pas décrit en détail

statique

Dé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-variables

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

Depuis PHP 5.3.0, vous pouvez utiliser une variable pour appeler dynamiquement une classe. Mais la valeur de cette variable ne peut pas être les mots-clés self, parent ou static.

Résumé :

Les méthodes statiques n'ont pas besoin d'être instanciées et sont accessibles directement
  • Objets instanciés par un la classe ne peut pas accéder aux propriétés statiques de la classe dans les méthodes statiques, mais est accessible dans les méthodes statiques
  • les pseudo-variables
  • ne sont pas disponibles dans les méthodes statiques ; 🎜>
  • les propriétés statiques ne sont pas accessibles par l'objet via l'opérateur ->

    $this

  • L'appel statique d'une méthode non statique entraînera une erreur de niveau
  • ; ;

  • Les propriétés statiques ne peuvent être initialisées qu'à des littéraux ou des constantes, les expressions ne peuvent pas être utilisées (la fonction renvoie une valeur/ plutôt une variable/un objet

    E_STRICT

    <) ; 🎜> peut être appelé dynamiquement en utilisant un type variable. Mais la valeur de cette variable ne peut pas être les mots-clés self, parent ou static.
  • <?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 起
    ?>
    Copier après la connexion

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!

Étiquettes associées:
source:jb51.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!