PHP中虚函数的理解:
相比其他语言,如C++,PHP语言有很多不同之处。
看个例子:
<?php
// 定义父类
class P {
public function name(){
echo "P::name() is called. \n";
}
public function getName1(){
self::name();
echo "P::getName1 is called. \n";
}
public function getName2(){
$this->name();
echo "P::getName2() is called. \n";
}
}
// 定义子类,继承父类P
class S extends P{
public function name(){
echo "S::name() is called. \n";
}
}
测试方法如下:
$s = new S;
$s->getName1();
echo '<br/>';
echo '<br/>';
echo '<br/>';
$s->getName2();
>>>那么,这将会输出什么呢?
在C++中,有virtual关键字定义类中的函数为虚函数。如果父类定义了 name () 函数为虚函数,并且在子类中被覆盖,那么将会调用子类的 name() 方法;否则调用父类的方法。
PHP中没有virtual关键字,靠的是 self 和 $this 关键字实现虚函数的功能。self 关键字调用的是父类的方法,$this 调用的是子类的方法。
那么这里将输出:
P::name() is called.
P::getName1 is called.
S::name() is called.
P::getName2() is called.
>>>如果 一个G类继承S类,那么会怎么样呢?
class G extends S(){
public function name(){
echo "G::name() is called.\n";
}
}
$g = new G;
$g->getName1();
echo '<br/>';
echo '<br/>';
$g->getName2();
那么这里将输出:这里不会调用S中间类的 name() 方法。
P::name() is called.
P::getName1 is called.
G::name() is called.
P::getName2() is called.
>>> 如果子类G想使用S类的 name() 方法,可以在S类中重写P类的 getName 方法。
// 定义子类,继承父类P
class S extends P{
public function name(){
echo "S::name() is called. \n";
}
public function getName1(){
slef::name();
echo "S::getName1() is called. \n";
}
}