《PHP實戰:PHP面向對象學習之parent::關鍵字》要點:
本文介紹了PHP實戰:PHP面向對象學習之parent::關鍵字,希望對您有用。如果有疑問,可以聯系我們。
PHP實戰前言
PHP實戰最近在做THINKPHP開發項目中,用到了 parent:: 關鍵字,實際上 parent::關鍵字 是PHP中常要用到的一個功能,這不僅僅是在 THINKPHP 項目開發中,即使是一個小型的企業站點,也會有許多相同的function功能,我們可以封裝成一個父類 class,然后多個子類直接繼承公共部分父類.
PHP實戰PHP5中使用parent::來引用父類的方法.
PHP實戰parent:: 可用于調用父類中定義的成員方法.
PHP實戰parent::的追溯不僅于直接父類.
PHP實戰通過parent::調用父類方法
PHP實戰
<!-- 聲明一個員工類,經理類繼承自員工類 -->
<?
class employee{
protected $sal=3000;
public function getSal(){
$this->sal = $this->sal + 1200;
return $this->sal ;
}
}
class Manager extends employee {
//如果想讓經理在員工工資的基礎上多發1500元.
//必須先調用父類的getSal()方法.
public function getSal(){
parent::getSal();// 這里調用了父類的方法.
$this->sal = $this->sal + 1500;
return $this->sal ;
}
}
$emp = new employee();
echo "普通員工的工資是 " . $emp->getSal();
echo "<br>";
//xiariboke.com
$manager = new Manager();
echo "經理的工資是: " . $manager->getSal();
?>
PHP實戰程序運行結果:
PHP實戰普通員工的工資是 4200
PHP實戰經理的工資是: 5700
PHP實戰父類的private屬性
PHP實戰這個東西解釋起來十分的不爽.
PHP實戰Private屬性是不能被繼承的,如果父類有私有的屬性.那么父類的方法只為父類的私有屬性服務.
PHP實戰下面的例子看起來很奇怪,在子類中重新定義了一個屬性$sal,系統卻返回了父類的屬性.
PHP實戰
<?php
class employee{
private $sal=3000;
//protected $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
protected $sal=5000;
public function getParentSal(){
//這里返回的是父類的private屬性.
return parent::getSal();
}
}
$manager = new Manager();
echo "PHP ".phpversion()."<br>";
echo $manager->getSal();
echo "<br>";
echo "parent's \$sal ".$manager->getParentSal();
//xiariboke.com
?>
PHP實戰程序運行結果:
PHP實戰PHP 5.2.9
PHP實戰3000
PHP實戰parent's $sal 3000
PHP實戰如果父類中的屬性被子類重寫了.結果是這樣的.注意 第5行的屬性定義變成了protected.
PHP實戰
<?php
class employee{
//private $sal=3000;
protected $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
protected $sal=5000;
//xiariboke.com
public function getParentSal(){
//這里返回的是父類的private屬性.
return parent::getSal();
}
}
$manager = new Manager();
echo "PHP ".phpversion()."<br>";
echo $manager->getSal();
echo "<br>";
echo "parent's \$sal ".$manager->getParentSal();
?>
PHP實戰程序運行結果:
PHP實戰PHP 5.2.9
PHP實戰5000
PHP實戰parent's $sal 5000
PHP實戰子類中重寫的方法對當前private有效.
PHP實戰
<?php
class employee{
private $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
private $sal=5000;
//重寫過的方法
public function getSal(){
return $this->sal;
}
public function getParentSal(){
//這里返回的是父類的private屬性.
return parent::getSal();
}
}
$manager = new Manager();
echo "PHP ".phpversion()."<br>";
echo $manager->getSal();
echo "<br>";
echo "parent's \$sal ".$manager->getParentSal();
?>
PHP實戰程序運行結果:
PHP實戰PHP 5.2.9
PHP實戰5000
PHP實戰parent's $sal 3000
PHP實戰打開zend調試狀態看看,內存中的情況.注意最下面,有兩個$sal .分別是 3000 和 5000 .
PHP實戰
<?php
class employee{
private $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
protected $sal=5000;
public function getParentSal(){
return $this->sal;
}
}
$manager = new Manager();
echo "PHP ".phpversion()."<br>";
echo $manager->getSal();
?>
PHP實戰程序運行結果:
PHP實戰PHP 5.2.9
PHP實戰3000
PHP實戰將父類的屬性$sal 改成 protected ,子類重寫了父類的屬性.在內存中只有一個 $sal .
PHP實戰
<?php
class employee{
protected $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
protected $sal=5000;
public function getParentSal(){
return $this->sal;
}
}
$manager = new Manager();
echo "PHP ".phpversion()."<br>";
echo $manager->getSal();
?>
PHP實戰程序運行結果:
PHP實戰PHP 5.2.9
PHP實戰5000
PHP實戰如果你學過java,你會覺得這一切都是很難理解的.
PHP實戰在Java中當子類被創建時,父類的屬性和方法在內存中都被創建,甚至構造函數也要被調用.
PHP實戰PHP5不是這樣,PHP5調用父類用的是parent:: 而不是 parent-> ,這足以說明PHP5不想在內存中讓父類也被創建.PHP5想讓繼承變的比Java更簡單.
PHP實戰適應下就好.
PHP實戰這樣調用會讓PHP5.1.1溢出.新版不知道有沒有問題.
PHP實戰
<?php
class employee{
private $sal=3000;
public function getSal(){
return parent::$this->sal;
}
}
class Manager extends employee {
protected $sal=5000;
public function getSal(){
return parent::$this->getSal();
}
}
$manager = new Manager();
echo "PHP ".phpversion()."<br>";
echo $manager->getSal();
?>
PHP實戰第12行改成這樣就好了.注意比較.
PHP實戰return parent:: getSal();
PHP實戰這樣的代碼引起了遞歸操作,子類調用父類的方法,父類又調用子類方法.
PHP實戰return parent::$this->getSal();
PHP實戰總結
PHP實戰以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流.
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/1937.html