PHP5中虛函數(shù)的實(shí)現(xiàn)方法分享
更新時(shí)間:2011年04月20日 23:30:49 作者:
學(xué)過(guò)C++的人都應(yīng)該知道C++中有個(gè)虛函數(shù)的概念。而在php5中如何實(shí)現(xiàn)這個(gè)虛函數(shù)呢?
請(qǐng)看下面的代碼:
<?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()調(diào)用了A::x(),而B(niǎo)::x()覆蓋了A::x(),那么當(dāng)調(diào)用B::y()時(shí),B::y()應(yīng)該調(diào)用A::x()還是 B::x()呢?在C++中,如果A::x()未被定義為虛函數(shù),那么B::y()(也就是A::y())將調(diào)用A::x(),而如果A::x()使用 virtual關(guān)鍵字定義成虛函數(shù),那么B::y()將調(diào)用B::x()。然而,在PHP5中,虛函數(shù)的功能是由 self 和 $this 關(guān)鍵字實(shí)現(xiàn)的。如果父類中A::y()中使用 self::x() 的方式調(diào)用了 A::x(),那么在子類中不論A::x()是否被覆蓋,A::y()調(diào)用的都是A::x();而如果父類中A::y()使用 $this->x() 的方式調(diào)用了 A::x(),那么如果在子類中A::x()被B::x()覆蓋,A::y()將會(huì)調(diào)用B::x()。
上例的運(yùn)行結(jié)果如下:
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' );
復(fù)制代碼 代碼如下:
<?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()調(diào)用了A::x(),而B(niǎo)::x()覆蓋了A::x(),那么當(dāng)調(diào)用B::y()時(shí),B::y()應(yīng)該調(diào)用A::x()還是 B::x()呢?在C++中,如果A::x()未被定義為虛函數(shù),那么B::y()(也就是A::y())將調(diào)用A::x(),而如果A::x()使用 virtual關(guān)鍵字定義成虛函數(shù),那么B::y()將調(diào)用B::x()。然而,在PHP5中,虛函數(shù)的功能是由 self 和 $this 關(guān)鍵字實(shí)現(xiàn)的。如果父類中A::y()中使用 self::x() 的方式調(diào)用了 A::x(),那么在子類中不論A::x()是否被覆蓋,A::y()調(diào)用的都是A::x();而如果父類中A::y()使用 $this->x() 的方式調(diào)用了 A::x(),那么如果在子類中A::x()被B::x()覆蓋,A::y()將會(huì)調(diào)用B::x()。
上例的運(yùn)行結(jié)果如下:
A::x() was called. A::y() was called. --
B::x() was called. A::z() was called.
virtual-function.php
復(fù)制代碼 代碼如下:
<?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' );
相關(guān)文章
PHP獲取http請(qǐng)求的頭信息實(shí)現(xiàn)步驟
PHP如何獲取http請(qǐng)求頭信息,是一個(gè)急切解決而不知道如何抉擇的問(wèn)題,本人搜集整理下,可供參考下2012-12-12php簡(jiǎn)單實(shí)現(xiàn)sql防注入的方法
這篇文章主要介紹了php簡(jiǎn)單實(shí)現(xiàn)sql防注入的方法,涉及addslashes函數(shù)的使用及正則過(guò)濾的相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2016-04-04PHP中字符安全過(guò)濾函數(shù)使用小結(jié)
這篇文章主要簡(jiǎn)單介紹了PHP中字符安全過(guò)濾函數(shù),對(duì)于防止sql注入攻擊XSS攻擊能非常有用,這里推薦給大家。2015-02-02Yii2——使用數(shù)據(jù)庫(kù)操作匯總(增刪查改、事務(wù))
本篇文章主要介紹了Yii2——使用數(shù)據(jù)庫(kù)操作匯總,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12Ubuntu server 11.04安裝memcache及php使用memcache來(lái)存儲(chǔ)session的方法
這篇文章主要介紹了Ubuntu server 11.04安裝memcache及php使用memcache來(lái)存儲(chǔ)session的方法,涉及memcache服務(wù)器的安裝及php操作memcache存儲(chǔ)session的相關(guān)技巧,需要的朋友可以參考下2016-05-05