亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php中類與對象的作用是什么

發布時間:2021-01-13 15:58:57 來源:億速云 閱讀:163 作者:Leah 欄目:開發技術

php中類與對象的作用是什么?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

簡介

在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中類與對象的作用是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

当阳市| 石家庄市| 万盛区| 改则县| 图片| 双牌县| 昔阳县| 泸州市| 古田县| 安康市| 永清县| 慈利县| 桃源县| 呼图壁县| 庐江县| 梅州市| 云安县| 广宁县| 香格里拉县| 孟津县| 襄樊市| 广东省| 浮梁县| 射阳县| 房山区| 绥阳县| 运城市| 炉霍县| 白山市| 安西县| 杭锦后旗| 皋兰县| 南宁市| 琼结县| 潞城市| 永兴县| 普安县| 且末县| 社会| 巴彦淖尔市| 南丰县|