时间:2021-07-01 10:21:17 帮助过:60人阅读
纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数!
虚函数
引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。
而在php5中如何实现这个虚函数呢?请看下面的代码:
- <?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();
- ?>
该例中,A::y()调用了A::x(),而B::x()覆盖了A::x(),那么当调用B::y()时,B::y()应该调用A::x()还是 B::x()呢?在C++中,如果A::x()未被定义为虚函数,那么B::y()(也就是A::y())将调用A::x(),而如果A::x()使用 virtual关键字定义成虚函数,那么B::y()将调用B::x()。然而,在PHP5中,虚函数的功能是由 self 和 $this 关键字实现的。如果父类中A::y()中使用 self::x() 的方式调用了 A::x(),那么在子类中不论A::x()是否被覆盖,A::y()调用的都是A::x();而如果父类中A::y()使用 $this->x() 的方式调用了 A::x(),那么如果在子类中A::x()被B::x()覆盖,A::y()将会调用B::x()。
上例的运行结果如下:
- 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' );
以上就是php 中虚函数的实现方法的详细内容,更多请关注Gxl网其它相关文章!