国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

詳解php中的類與對象(繼承)

2024-05-05 00:01:23
字體:
來源:轉載
供稿:網友

簡介

在php中,類型的繼承使用extends關鍵字,而且最多只能繼承一個父類,php不支持多繼承。

class MyClass  {  public $dat = 0;  public function __construct($dat) {   $this->dat = $dat;  }  public function getDat() {   return "$this->dat/n";  } } class MySubClass extends MyClass {  public function getDat() {   return "dat: $this->dat/n";  } } $a = new MyClass(3); $b = new MySubClass(4); echo $a->getDat();  // 3 echo $b->getDat();  // dat: 4 

方法覆蓋

包括構造函數在內,子類可以重新定義同名的類方法以覆蓋父類方法。覆蓋時遵循以下規則:

1.除構造函數之外,其他函數在覆蓋時,函數的參數列表必須相同

2.包括構造函數在內,方法被覆蓋后,調用子類方法時并不會自動調用父類方法

3.如果父類要禁止方法被子類覆蓋,可以使用final來聲明方法,這時如果子類仍要覆蓋父類方法,將會出錯

class MyClass  {  private $name = "";  public $num = 0;  public $str = "";  public function __construct($name) {   $this->name = $name;   $this->num = 100;   $this->str = "none";  }  public function getName() {   return $this->name;  } } class MySubClass extends MyClass {  public function __construct($name, $str) {   parent::__construct($name);    // 調用父類方法   $this->num = "0";   $this->str = $str;   echo parent::getName()."/n";    // 調用父類方法  }  public function getName() {   return parent::getName()."$this->str/n"; // 調用父類方法  } } $b = new MySubClass("myName", true);  // myName echo $b->getName();          // myName1 class MyClass  {  final public function getName() {  } } 

屬性重定義

在子類中,可以訪問父類中的public和protected屬性成員,除非重定義了同名的自有屬性,這時,父類中的屬性將無法訪問。

方法則不同,子類對方法進行覆蓋后,仍然可以訪問到父類方法。

class MyClass  {  public $a = 1;  protected $b = 2;  private $c = 3;  public function f1() {   echo "MyClass f1/n";   echo "/$a:$this->a; /$b:$this->b; /$c:$this->c;/n";  }  protected function f2() {   echo "MyClass f2/n";   echo "/$a:$this->a; /$b:$this->b; /$c:$this->c;/n";  }  private function f3() {   echo "MyClass f3/n";  } } class MySubClass extends MyClass  {  public $b = 22;  public $c = 33;  public function f1() {   echo "MySubClass f1/n";   // 繼承到父類中的$a屬性,直接使用   echo "/$a:$this->a; /$b:$this->b; /$c:$this->c;/n";   // 調用父類中的同名方法   parent::f1();   // 繼承到父類中的f2()方法,直接使用   $this->f2();  }  // 父類的f3()是私有的,這里的定義與父類無關  public function f3() {   echo "MySubClass f3/n";  } } $b = new MySubClass; $b->f1();echo "/n"; /* MySubClass f1 $a:1; $b:22; $c:33; MyClass f1 $a:1; $b:22; $c:3; MyClass f2 $a:1; $b:22; $c:3; */ $b->f3();echo "/n"; /* MySubClass f3 */ 

重定義父類(同名)屬性時,屬性的可訪問性可以變得更開放,但不能更嚴格,也就是說,父類中的public屬性,不能在子類中修改為private屬性。

如果通過子類對象調用父類方法,那么該父類方法在訪問屬性時,對于重定義了的同名屬性,public和protected的屬性將訪問到子類版本,private屬性將訪問到父類版本。也可以理解為,public和protected屬性可以被重定義(父類的版本被重定義,從而不存在了),而private并未被重定義(父類中的屬性仍然存在,通過父類方法進行訪問,與子類中是否有同名屬性毫不相干)。

class MyClass  {  public $a = 1;  protected $b = 2;  private $c = 3;  public function f1() {   echo "/$a:$this->a; /$b:$this->b; /$c:$this->c;/n";  } } class MySubClass extends MyClass  {  public $a = 11;   // 必須為public  protected $b = 22; // 必須為protected或public  private $c = 33;    public function f2() {   echo "/$a:$this->a; /$b:$this->b; /$c:$this->c;/n";  } } $b = new MySubClass; $b->f1(); // $a:11; $b:22; $c:3; $b->f2(); // $a:11; $b:22; $c:33; 

范圍解析操作符 ::

又冒號常用于訪問類常量、類靜態變量,也用于在方法覆蓋時調用父類版本。與其搭配的還包括parent、self、static等關鍵字。

class MyClass  {  const Name0 = "MyClass";  // 類常量  public static $id0 = 0;  // 類變量  public function put() {  // 將被子類覆蓋的方法   echo "MyClass put()/n";  } } class MySubClass extends MyClass  {  const Name1 = "MySubClass";  public static $id1 = 1;   public function put() {   parent::put();        // 調用父類版本的對象方法   echo parent::Name0 . "/n";  // 父類常量   echo parent::$id0 . "/n";   // 父類變量   echo self::Name1."/n";    // 子類常量   echo self::$id1 . "/n";    // 子類變量   echo static::Name1 . "/n";  // 子類常理   echo static::$id1 . "/n";   // 子類變量  } } $a = "MyClass"; $ca = new MyClass; $cb = new MySubClass;  $cb->put(); echo MyClass::Name0 . "/n"; echo MyClass::$id0 . "/n"; echo $a::Name0 . "/n"; echo $a::$id0 . "/n"; echo $ca::Name0 . "/n"; echo $ca::$id0 . "/n"; 

在子類中訪問父類中的成員時,應避免直接使用父類類名,而應使用parent::,以免破壞父類的封裝性。

final

聲明為final的方法不能被子類覆蓋,如果類聲明為final,則此類不能被繼承。

// 聲明為final的類不能被繼承 final class MyClass {  private $dat;  public function __construct($dat) {   $this->dat = $dat;  }  // final方法不能被覆蓋,不過此類已經是final類,方法無必要在聲明為final了  final public function getDat() {   return $this->dat;  } }

總結

以上所述是小編給大家介紹的php中的類與對象(繼承),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 嘉祥县| 吉首市| 苍南县| 青神县| 慈溪市| 英超| 若尔盖县| 石屏县| 榆树市| 休宁县| 黎平县| 平昌县| 德安县| 武冈市| 宜君县| 昌江| 乃东县| 新野县| 大足县| 博白县| 金秀| 大悟县| 黄石市| 霍州市| 民和| 礼泉县| 阿巴嘎旗| 类乌齐县| 芦溪县| 自治县| 沙雅县| 仪征市| 永定县| 武邑县| 衡水市| 出国| 龙口市| 根河市| 宁津县| 铜川市| 恭城|