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

Comment implémenter des fonctions virtuelles en php

怪我咯
怪我咯original
2017-07-14 10:50:424204parcourir

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( &#39;Hello&#39; ); 
$b=new AnotherChildClass(); 
$b->say( &#39;Hello&#39; );

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!

Déclaration:
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