直接上**吧
<?php
class a
}class b extends a
}$obj = new b;
$obj->showname();
大家猜猜看,程式輸出的是a還是b?如果你堅定地回答 a , 那麼下面的內容就不用看了;如果你回答的是b,或者不確定,則有必要繼續看下去。
首先給出正確答案:a。
原因分析:在b的建構函式中,由於$name是a的私有成員,所以不可訪問。然而,php作出的決策是:既然不能訪問它,那麼就建立乙個新成員變數。於是$this->name="b"的結果就是為b類建立了乙個puhlic 的名為 name的成員變數,相當於: public $name = "b"。我們把b的例項結構列印出來就明白了:
object(b)#1 (2)
可見此時,$obj物件有兩個名為name的成員變數,乙個是繼承來的,另乙個則是後來增加的。由於showname()是a的成員函式,所以其內部操縱的是屬於a的那個name變數。如果把showname()函式定義在b內,那麼因為從a 繼承來的name不可訪問,則會訪問後來增加的b的name成員,如下:
<?php
class a
}class b extends a
public function showname()
}$obj = new b;
$obj->showname();
這時輸出結果為b。
可見php採取的是盡可能成功訪問寬容解釋方式。一不小心,可能會落入這個陷阱,尤其是物件成員可以動態增刪的情況下。為了避免歧義,盡量避免在子類中使用同名成員變數來掩蓋掉從父類繼承的私有成員變數。
while的乙個小陷阱
先看一段 示例 pragma warning disable 4996 include copy.h char mystrcpy char desc,const char src 為了讓 看起來更加的簡潔美觀,我一直喜歡這樣寫while,而且也沒出過什麼問題。但是這樣寫是否存在問題,看一下下面這個示...
乙個編譯器的小陷阱
有時候在乙個平台執行正確的程式,在另乙個平台就會出問題。在平台移植中,最常見的問題可能就是位元組序和對齊這類問題了。本文記錄的是我以前碰到過的乙個小陷阱。看看這段 的輸出應該是什麼?include stdio.h char do something int p void test1 void int...
0xde c語言合法常量 C語言的乙個小陷阱
其實說的就是定義問題,圖中看不清楚的,可以看下面 部分 define limit 20 const int lim 50 static int data1 limit 合法 static int data2 lim 無效 const int lim2 2 limit 合法 const int lim...