久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

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

在php中,類型的繼承使用extends關(guān)鍵字,而且最多只能繼承一個(gè)父類,php不支持多繼承。這篇文章主要介紹了php中的類與對(duì)象(繼承),需要的朋友可以參考下

簡(jiǎn)介

在php中,類型的繼承使用extends關(guān)鍵字,而且最多只能繼承一個(gè)父類,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 

方法覆蓋

包括構(gòu)造函數(shù)在內(nèi),子類可以重新定義同名的類方法以覆蓋父類方法。覆蓋時(shí)遵循以下規(guī)則:

1.除構(gòu)造函數(shù)之外,其他函數(shù)在覆蓋時(shí),函數(shù)的參數(shù)列表必須相同

2.包括構(gòu)造函數(shù)在內(nèi),方法被覆蓋后,調(diào)用子類方法時(shí)并不會(huì)自動(dòng)調(diào)用父類方法

3.如果父類要禁止方法被子類覆蓋,可以使用final來(lái)聲明方法,這時(shí)如果子類仍要覆蓋父類方法,將會(huì)出錯(cuò)

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);    // 調(diào)用父類方法 
  $this->num = "0"; 
  $this->str = $str; 
  echo parent::getName()."\n";    // 調(diào)用父類方法 
 } 
 public function getName() { 
  return parent::getName()."$this->str\n"; // 調(diào)用父類方法 
 } 
} 
$b = new MySubClass("myName", true);  // myName 
echo $b->getName();          // myName1 
class MyClass  
{ 
 final public function getName() { 
 } 
} 

屬性重定義

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

方法則不同,子類對(duì)方法進(jìn)行覆蓋后,仍然可以訪問(wèn)到父類方法。

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"; 
  // 調(diào)用父類中的同名方法 
  parent::f1(); 
  // 繼承到父類中的f2()方法,直接使用 
  $this->f2(); 
 } 
 // 父類的f3()是私有的,這里的定義與父類無(wú)關(guān) 
 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 
*/ 

重定義父類(同名)屬性時(shí),屬性的可訪問(wèn)性可以變得更開(kāi)放,但不能更嚴(yán)格,也就是說(shuō),父類中的public屬性,不能在子類中修改為private屬性。

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

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; 

范圍解析操作符 ::

又冒號(hào)常用于訪問(wèn)類常量、類靜態(tài)變量,也用于在方法覆蓋時(shí)調(diào)用父類版本。與其搭配的還包括parent、self、static等關(guān)鍵字。

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();        // 調(diào)用父類版本的對(duì)象方法 
  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"; 

在子類中訪問(wèn)父類中的成員時(shí),應(yīng)避免直接使用父類類名,而應(yīng)使用parent::,以免破壞父類的封裝性。

final

【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過(guò)測(cè)試外,其他素材未做測(cè)試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途。如損害你的權(quán)益請(qǐng)聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡(jiǎn)單分析了插值查找算法的概念、原理并結(jié)合實(shí)例形式分析了php實(shí)現(xiàn)針對(duì)有序表插值查找的相關(guān)操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實(shí)現(xiàn)服務(wù)端分頁(yè)的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
下面小編就為大家分享一篇PHP實(shí)現(xiàn)APP微信支付的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
這篇文章主要介紹了PHP實(shí)現(xiàn)的多維數(shù)組排序算法,結(jié)合實(shí)例形式對(duì)比分析了php針對(duì)多維數(shù)組及帶有鍵名的多維數(shù)組進(jìn)行排序相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
這篇文章主要為大家詳細(xì)介紹了php結(jié)合ajaxuploadfile實(shí)現(xiàn)無(wú)刷新文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細(xì)介紹了PHP開(kāi)發(fā)接口使用RSA進(jìn)行加密解密方法,對(duì)此有興趣的朋友可以學(xué)習(xí)下。
主站蜘蛛池模板: 精品国产va久久久久久久 | 国内精品视频在线观看 | 91精品久久香蕉国产线看观看 | 欧美激情视频一区二区 | 欧美三根一起进三p | 午夜在线小视频 | 成人涩涩视频 | 中文字幕精品在线观看 | 国产精品久久久久久久久久久久午夜片 | 国产伊人网| 久久久久国产 | 91精品一区 | 国产三级在线播放 | www.久久爱| 久久久久久久久国产精品 | 视频一区二区三区在线观看 | 国产资源视频 | 国产精品成人免费视频 | 看国产毛片 | 国产suv一区二区 | 在线观看中文字幕 | 日韩网站免费观看 | 日韩精品在线看 | 国产成人97精品免费看片 | 亚洲777 | 99cao| 99视频网 | 国产高清一区 | 人人射人人 | 色老板免费视频 | 久久亚洲精品视频 | 欧美视频在线观看免费 | 91久久综合亚洲鲁鲁五月天 | 黄色大片网站 | 性大毛片视频 | 官场少妇尤物雪白高耸 | 欧美顶级黄色大片免费 | 欧美成人三级在线观看 | 欧美一区视频 | 国产女人18毛片18精品 | 精品少妇一区二区三区免费观 |