Maison > Article > développement back-end > Comment implémenter des fonctions virtuelles en php
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(); ?>
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.
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( 'Hello' ); $b=new AnotherChildClass(); $b->say( 'Hello' );
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!