類的繼承和三種訪問限定控制符
總結(jié):
1.類的繼承 關(guān)鍵字 extends
一個(gè)類可以在聲明中用 extends,關(guān)鍵字繼承另一個(gè)類的方法和屬性。PHP不支持多重繼承,一個(gè)類只能繼承一個(gè)基類。被繼承的方法和屬性可以通過用同樣的名字重新聲明被覆蓋。但是如果父類定義方法時(shí)使用了 final,則該方法不可被覆蓋??梢酝ㄟ^ parent:: 來訪問被覆蓋的方法或?qū)傩浴?當(dāng)覆蓋方法時(shí),參數(shù)必須保持一致否則 PHP 將發(fā)出 E_STRICT 級(jí)別的錯(cuò)誤信息。但構(gòu)造函數(shù)例外,構(gòu)造函數(shù)可在被覆蓋時(shí)使用不同的參數(shù)。
子類繼承父類時(shí),會(huì)繼承父類的屬性和方法,除了 private 的屬性和方法外,其它的都可以直接訪問和調(diào)用,只能通過在父類中定義的訪問器來訪問。
2.訪問限定控制符
public : 類中,類外均可訪問, 子類中也可以訪問
protected: 類中,類外不可訪問, 但是子類中可以訪問
private: 只允許在類中, 類外, 子類中不可訪問
3.構(gòu)造方法(魔術(shù)方法)__construct
在類實(shí)例化的時(shí)候會(huì)自動(dòng)觸發(fā),一般用來初始化屬性值;
<?php namespace _9030; class Demo1 { //屬性(變量), public 公共的,公開的,誰都可以用的 public $product = '手機(jī)'; public $price = 5800; //private表示私有的,只有本類內(nèi)部可以使用;例如成本是***內(nèi)部才知道 private $chengben; //protected表示受保護(hù)的,只有本類或子類或父類中可以訪問;例如專利是受保護(hù)的 protected $zhuanli; // 構(gòu)造方法 // 前面加了二個(gè)下劃線的方法, 又叫魔術(shù)方法 // 魔術(shù)方法不需要用戶手工調(diào)用,是由php根據(jù)某種條件自動(dòng)觸發(fā) public function __construct($chengben, $zhuanli) { // 1. 初始化對(duì)象的狀態(tài),由屬性決定 $this->chengben = $chengben; $this->zhuanli = $zhuanli; // 2. 完成對(duì)象創(chuàng)建時(shí)的自動(dòng)化操作 echo $this->getInfo3(); } //方法(函數(shù)) public function getInfo1() { // 當(dāng)前類的引用: self $obj = new self(); echo '商品名稱:'.$obj->product.'----'.'商品價(jià)格:'.$obj->price.'<br><hr>'; } public function getInfo2() { // 當(dāng)前類的引用: self // 當(dāng)前對(duì)象的引用: $this, 偽變量 // 1. 類的實(shí)例化 // $this = new self(); // 2. 訪問類中成員,用對(duì)象訪問 return '商品名稱: ' . $this->product.', 商品價(jià)格: ' . $this->price; } public function getInfo3() { return '制造成本: ' . $this->chengben.', 專利歸屬: ' . $this->zhuanli; } public function getInfo4() { echo '商品名稱:'.$this->product.'----'.'商品價(jià)格:'.$this->price.'<br><hr>'; } } //訪問普通成員屬性(public)的三種方式 //1,實(shí)例話類,然后用對(duì)象直接訪問類屬性 // $obj = new Demo1(); // echo '商品名稱:'.$obj->product.'----'.'商品價(jià)格:'.$obj->price.'<br><hr>';//商品名稱:手機(jī)----商品價(jià)格:5800 //2.通過方法來直接獲取輸出 // $obj->getInfo1();//商品名稱: 手機(jī)---商品價(jià)格: 5800 // 通過方法獲取數(shù)據(jù)后返回輸出 // echo $obj->getInfo2();//商品名稱: 手機(jī), 商品價(jià)格: 5800 //3.由于使用了__construct 構(gòu)造方法,在實(shí)例化該類的時(shí)候會(huì)自動(dòng)觸發(fā) //并且由于實(shí)在類的內(nèi)部調(diào)用的私有的$chengben和受保護(hù)的$zhuanli,可以直接輸出 new Demo1('2000','諾基亞');//制造成本: 2000, 專利歸屬: 諾基亞 echo'<hr>'; //4.如果直接在類的外部訪問 protected 和 private 會(huì)報(bào)錯(cuò) // $obj = new Demo1(); // $this->chengben = '2000'; // $this->zhuanli = '諾基亞'; // echo '制造成本: ' . $this->chengben.', 專利歸屬: ' . $this->zhuanli; //5.類的繼承 關(guān)鍵字 extends // 一個(gè)類可以在聲明中用 extends,關(guān)鍵字繼承另一個(gè)類的方法和屬性。PHP不支持多重繼承,一個(gè)類只能繼承一個(gè)基類。 //被繼承的方法和屬性可以通過用同樣的名字重新聲明被覆蓋。但是如果父類定義方法時(shí)使用了 final,則該方法不可被覆蓋??梢酝ㄟ^ parent:: 來訪問被覆蓋的方法或?qū)傩浴?// 當(dāng)覆蓋方法時(shí),參數(shù)必須保持一致否則 PHP 將發(fā)出 E_STRICT 級(jí)別的錯(cuò)誤信息。但構(gòu)造函數(shù)例外,構(gòu)造函數(shù)可在被覆蓋時(shí)使用不同的參數(shù)。 class Sub1 extends Demo1 { } //由于子類Sub1繼承了父類Demo1 ,所以通過子類可以訪問父類的屬性和方法 $obj=new Sub1(2000,'華為');//制造成本: 2000, 專利歸屬: 華為 echo'<br>'; $obj->getInfo4(); //6.子類的功能擴(kuò)展 class Sub2 extends Demo1 { //在子類中新添加了一個(gè)屬性 public $num; public $zhuanli_price; //又創(chuàng)建了一個(gè)構(gòu)造方法 public function __construct($chengben, $zhuanli, $num,$zhuanli_price){ parent::__construct($chengben, $zhuanli); $this->num =$num; $this->zhuanli_price =$zhuanli_price; } //添加了一個(gè)計(jì)算總和的方法的方法 public function total(){ return round($this->zhuanli_price * $this->num, 3); } } $sub2 = new Sub2(3000,'摩托摩拉',5,888888.88888); echo ',專利總價(jià)'.$sub2->total(); //制造成本: 3000, 專利歸屬: 摩托摩拉,專利總價(jià)4444440 echo'<hr>'; //7.方法重置 class Sub3 extends Sub2 { // 重寫計(jì)算總和,加上折扣率 public function total(){ $total = parent::total(); // 設(shè)置折扣率 switch(true){ case($total>4444444&&$total<6666666): $zhekou=0.88; break; case($total>=6666666&&$total<8888888): $zhekou=0.77; break; case($total>=8888888): $zhekou=0.66; break; default: $zhekou=1; } $zhekou_zongjia = round($total * $zhekou,3); if($zhekou<1){ return '折率后總價(jià):'.$zhekou_zongjia.'元<span style="color: red">('.$zhekou.'折)</span>'; }else{ return $zhekou_zongjia; } } } $sub3 = new Sub3(3000,'蘋果',7,888888.88888); echo '<br>'.$sub3->total(); echo'<hr>'; // 訪問控制符 // public : 類中,類外均可訪問, 子類中也可以訪問 // protected: 類中,類外不可訪問, 但是子類中可以訪問 // private: 只允許在類中, 類外, 子類中不可訪問 class Demo2 { //類中成員:屬性(成員屬性).方法(成員方法) //對(duì)象屬性:需要使用類的實(shí)例進(jìn)行訪問的成員屬性 public $name;//姓名 protected $postion;//職位 private $salary;//工資 protected $department;//部門 //構(gòu)造方法,初始化賦值 public function __construct($name,$postion,$salary,$department) { $this->name = $name; $this->postion = $postion; $this->salary = $salary; $this->department = $department; } //職位訪問器->方法 public function getPostion(){ return $this->department === '硬件研發(fā)部' ? $this->postion : '無權(quán)查看' ; } //工資訪問器->方法 public function getSalary(){ return $this->department === '硬件研發(fā)部' &&$this->name === '大雄' ? $this->salary : '無權(quán)查看' ; } } $obj= new Demo2('大雄','軟件開發(fā)',6666,'硬件研發(fā)部'); echo '職位:'.$obj->getPostion().'<br>'; echo '工資:'.$obj->getSalary(); class Sub extends Demo2 { public function display() { // return $this->name; // public在子類中可以訪問 // return $this->postion; // protected 在子類中可以訪問 // return $this->salary; // private 在子類中無法訪問 // return $this->getSalary();// private 在子類中無法訪問 可以通過父類中定義的方法,在子類中調(diào)用得到返回值 return parent::salary; } } echo '<hr>'; $sub = new Sub('大雄','軟件開發(fā)',6666,'硬件研發(fā)部'); echo $sub->display(), '<br>';
點(diǎn)擊 "運(yùn)行實(shí)例" 按鈕查看在線實(shí)例
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)