Maison > développement back-end > tutoriel php > Comment implémenter des fonctions virtuelles en php

Comment implémenter des fonctions virtuelles en php

怪我咯
Libérer: 2023-03-13 21:48:02
original
4207 Les gens l'ont consulté

VirtuelleFonctionAfin de répondre aux besoins de surcharge et de polymorphisme, elle est définie dans la classe de base Même si la définition est vide, elle peut être remplacée ou non dans. la sous-classe. Écrivez des fonctions dans les classes de base !

Les fonctions virtuelles pures ne sont pas définies dans la classe de base et doivent être implémentées dans la sous-classe, un peu comme la fonction d'interface en Java !

Fonction virtuelle

Raison de l'introduction : Afin de faciliter l'utilisation de fonctionnalités polymorphes, nous avons souvent besoin de définir des fonctions virtuelles dans les classes de base.

Comment implémenter cette fonction virtuelle en php5 ? Veuillez regarder le code suivant :

<?php 
class A { 
public function x() { 
echo "A::x() was called.\n"; 
} 
public function y() { 
self::x(); 
echo "A::y() was called.\n"; 
} 
public function z() { 
$this->x(); 
echo "A::z() was called.\n"; 
} 
} 
class B extends A { 
public function x() { 
echo "B::x() was called.\n"; 
} 
} 
$b = new B(); 
$b->y(); 
echo "--\n"; 
$b->z(); 
?>
Copier après la connexion

Dans cet exemple, A::y() appelle A::x() et B::x() remplace A : :x(), alors lors de l'appel de B::y(), B::y() devrait-il appeler A::x() ou B::x() ? En C++, si A::x() n'est pas défini comme une fonction virtuelle, alors B::y() (c'est-à-dire A::y()) appellera A::x(), et si A:: x () est défini comme une fonction virtuelle à l'aide du mot-clé virtual, alors B::y() appellera B::x(). Cependant, en PHP5, la fonctionnalité des fonctions virtuelles est implémentée par les mots-clés self et $this. Si A::y() dans la classe parent appelle A::x() en utilisant self::x(), alors dans la sous-classe, que A::x() soit remplacé ou non, A::y() appelle A::x(); et si A::y() dans la classe parent appelle A::x() en utilisant $this->x(), alors si A::y() dans la sous-classe :: x() est remplacé par B::x(), A::y() appellera B::x().
Les résultats d'exécution de l'exemple ci-dessus sont les suivants :

A::x() was called. A::y() was called. --
B::x() was called. A::z() was called.
Copier après la connexion

virtual-function.php

<?php 
class ParentClass { 
static public function say( $str ) { 
static::do_print( $str ); 
} 
static public function do_print( $str ) { 
echo "<p>Parent says $str</p>"; 
} 
} 
class ChildClass extends ParentClass { 
static public function do_print( $str ) { 
echo "<p>Child says $str</p>"; 
} 
} 
class AnotherChildClass extends ParentClass { 
static public function do_print( $str ) { 
echo "<p>AnotherChild says $str</p>"; 
} 
} 
echo phpversion(); 
$a=new ChildClass(); 
$a->say( &#39;Hello&#39; ); 
$b=new AnotherChildClass(); 
$b->say( &#39;Hello&#39; );
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:php.cn
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