『壹』 php繼承的問題,調用父類的方法this指向問題。
我來說一說:
【一】…………public(僅有)屬性和方法的繼承…………
classa{
public$var='vara<br/>';
publicfunctionm(){
echo'funa<br/>';
}
publicfunctionrun(){
echo$this->var;
$this->m();
}
}
classbextendsa{
public$var='varb<br/>';
publicfunctionm(){
echo'funb<br/>';
}
}
$li=newb();
$li->run();
echo'<hr>';
var_mp($li);
輸出:
varb
funb
————————————————————————————
object(b)[1]
public'var'=>string'varb<br/>'(length=11)
在這段代碼中所表示的,是我們常見的一種繼承方式,同為公有屬性的$var 和公有方法m()
在這里,$var和m()都被繼承並覆寫,實例化過後,內存中只有一個$var實例,通過var_mp($li);我們可以看到它。
【二】…………private(私有)屬性和方法的繼承…………
classa{
private$var='vara<br/>';
privatefunctionm(){
echo'funa<br/>';
}
publicfunctionrun(){
echo$this->var;
$this->m();
var_mp($this);
echo'<br/><br/>';
}
}
classbextendsa{
private$var='varb<br/>';
privatefunctionm(){
echo'funb<br/>';
}
publicfunctionrun(){
echo$this->var;
$this->m();
var_mp($this);
echo'<br/><br/>';
parent::run();
}
}
$li=newb();
$li->run();
echo'<hr>';
var_mp($li);
輸出:
varb
funb
object(b)[1]
private'var'=>string'varb<br/>'(length=11)
private'var'(a)=>string'vara<br/>'(length=11)
.
.
vara
funa
object(b)[1]
private'var'=>string'varb<br/>'(length=11)
private'var'(a)=>string'vara<br/>'(length=11)
.
————————————————————————————————
object(b)[1]
private'var'=>string'varb<br/>'(length=11)
private'var'(a)=>string'vara<br/>'(length=11)
這個時候,我們可以看到,在調用run方法時,首先它會調用到b類的私有屬性$var 和私有方法m(),隨後,又使用parent::run()調用父類的run()方法,我們可以看到,父類的run()方法調用後,它所調用的屬性和方法,都是a類的兩個私有屬性和方法,這種形式,和你的問題一致;
而它與$this指向無關,我們可以在這里看到,兩個$this都是指向b類。
而最有意思的是,在$li句柄中,我們卻看到了兩個屬性!一個是b類的屬性,一個是a類的屬性,這兩個屬性同時存在著,那麼,私有方法也自然是同時存在著。
【三】…………私有屬性和方法能不能被繼承…………
classa{
private$var='vara<br/>';
privatefunctionm(){
echo'funa<br/>';
}
}
classbextendsa{
publicfunctionrun(){
echo$this->var;
$this->m();
}
}
$li=newb();
$li->run();
輸出:
Notice:Undefinedproperty:b::$varinE:...onLine9
Fatalerror:Calltoprivatemethoda::m()fromcontext'b'inE:...onLine10
這可以證明,私有屬性和方法,無法被繼承,所以,你的代碼示例中所說,將a類的m()方法更改為private後,會顯示aa的屬性,也就可以理解明白了。
『貳』 php子類可以繼承和訪問父類的私有屬性和方法嗎
你這樣理解也可以,當父類有私有的方法和屬性,子類是繼承不到的,所以子類不能訪問父類的私有方法和屬性。java
特性,private:類中只要限定為private的成員,只能被這個類本身訪問
『叄』 PHP子類怎麼調用父類的屬性
父類的Pname
是
private
類型,也就是私有的只能父類自己的
函數調用
,子類以及外部是無法調用的。
如果這個變數只允許本類方法調用
應該用
private
方式調用,如果允許本類以及子類調用應該用
protected
保護)修飾,如果希望外部調用則應該用
public
公開修飾。這三個關鍵詞對函數同樣有效。
我把php.net關於這個的說明放在下面參考資料裡面了,你可以仔細看下。
『肆』 php繼承一個父類,如何自動執行父類方法
你在父類寫一個成員函數 然後子類繼承 創建子類對象的時候 可以點出來父類的成員函數
比如
Student zs = new Student();
zs.SayHello() //點出來的是從父類的繼承來的成員函數
輸出結果為父類的->我是人類
publicclassPerson
{
publicvoidSayHello()//這只是父類的SayHello
{
echo"我是人類";
}
}
publicclassStudent:Person//已經繼承了Person父類
{
//我什麼都沒寫
}
『伍』 PHP 靜態方法怎麼調用父類非靜態方法
子類的靜態方法裡面實例化父類,然後調用父類的非靜態方法。
因為子類的靜態方法調用父類的方法需要使用parent::函數名()或有可能是self::函數名(),子類的靜態方法使用parent::函數名()或有可能是self::函數名()時這個函數名()必須是父類裡面的一個靜態方法,如果不是靜態方法,會報錯Strict Standards: Non-static method parentClass::b() should not be called statically,但是還是會有正確結果喲