一、繼承概念
繼承性也是面向對象程序設計中的重要特性之一。它是指建立一個新的派生類,從一個先前定義的類中繼承數據和函數,而且可以重新定義新的數據類型和函數,從而建立累的層次或等級關系。
格式:
[修飾符] class 子類名 extends 父類名
{
...
}
假如B類繼承A類,那么
從內存上來講:B繼承了A中所有的屬性和方法;但是父類中的private部分不能直接訪問
從使用上來講:B繼承了A中所有非私有的屬性和方法
其中A叫父類(基類)。 B叫子類(派生類)
PHP只支持單繼承,不允許多重繼承。一個子類只能有一個父類,不允許一個類直接繼承多個類,但一個類可以被多個類繼承。可以有多層繼承,即一個類可以繼承某一個類的子類,如類B繼承了類A,類C又繼承了類B,那么類C也間接繼承了類A。
1 class A 2 { 3 } 4 class B extends A 5 { 6 } 7 class C extends B 8 { 9 }
注意:
子類繼承父類的所有內容,但父類中的private部分不能直接訪問
子類中新增加的屬性和方法是對父類的擴展
子類中定義的與父類同名的屬性是對父類屬性的覆蓋,同名的方法也是對父類方法的覆蓋
public(公有) protected(受保護) private(私有)
===========================================================
在本類中 Y Y Y
在子類中 Y Y ? N
在類外邊 ?Y N N
?
1 <?php 2 3 class A 4 { 5 public $x=10; 6 protected $y=200; 7 private $z=3000; 8 9 public function fun1() 10 { 11 echo "class A fun1....<br>"; 12 } 13 14 protected function fun2() 15 { 16 echo "class A fun2....<br>"; 17 } 18 19 private function fun3() 20 { 21 echo "class A fun3....<br>"; 22 } 23 24 } 25 //類B繼承類A 26 class B extends A 27 { 28 29 } 30 $b=new B(); 31 var_dump($b); 32 /* 33 object(B)[1] //B繼承了A的所有屬性 34 public 'x' => int 10 //公有的還是共有的 35 protected 'y' => int 200 //受保護的還是受保護的 36 private 'z' (A) => int 3000 //私有的可以看到任然屬于類A 37 */ 38 echo $b->x; //輸出公有屬性 10 39 //echo $b->y; //嘗試輸出受保護的失敗 Fatal error: Cannot access protected property B::$y 40 //echo $b->z; //嘗試輸出私有屬性失敗 Notice: Undefined property: B::$z 41 ?>
?
二、繼承中的使用(易維護,易擴展)
在子類里面允許重寫(覆蓋)父類的方法 在子類中,使用parent訪問父類中的被覆蓋的屬性和方法 parent::__construce(); parent::fun();
1 <?php 2 //類的繼承使用(parent的使用) 3 4 class Person 5 { 6 private $name; 7 private $age; 8 9 public function __construct($name,$age) 10 { 11 $this->name = $name; 12 $this->age = $age; 13 } 14 15 public function getInfo() 16 { 17 return " 姓名:".$this->name." 年齡:".$this->age; 18 } 19 } 20 21 class Stu extends Person 22 { 23 private $classid; 24 25 public function __construct($name,$age,$classid) 26 { 27 parent::__construct($name,$age); 28 $this->classid = $classid; 29 } 30 31 public function getInfo() //重寫(覆蓋)父類方法,達到不修改只添加,易維護 32 { 33 return parent::getInfo()." 班級:".$this->classid; 34 } 35 public function say() //添加父類沒有的方法,達到擴展功能,易擴展 36 { 37 echo "hello world!<br>"; 38 } 39 } 40 41 42 $s = new Stu("wangwu",26,"lamp149"); 43 echo $s->getInfo()."<br>"; 44 $s->say(); 45 46 $p = new Person("zhangsan",22); 47 echo $p->getInfo()."<br/>"; 48 ?>
?
三、final關鍵字
在PHP5中新增加了final關鍵字,它只能用來修飾類和方法,不能使用final這個關鍵字來修飾成員屬性,因為final是常量的意思,我們在PHP里定義常量使用的是define()函數和const關鍵字,所以不能使用final來定義成員屬性。
final的特性:
使用final關鍵字標識的類不能被繼承;
使用final關鍵字標識的方法不能被子類覆蓋(重寫),是最終版本;
目的:一是為了安全,二是沒有必要
1 <?php 2 //類中final關鍵字的使用: 3 //final關鍵字可修飾類和方法,被修飾的類不可有子類,修飾的方法不可被子類覆蓋。 4 5 //final修飾的類不可有子類。 6 final class A 7 { 8 //使用final關鍵字修飾的方法不可以被子類覆蓋 9 public final function fun1() 10 { 11 echo "aaaaaaaaaaaaa<br/>"; 12 } 13 14 public final function max($a,$b) //這種方法是沒有必要重寫的 15 { 16 return $a>$b?$a:$b; 17 } 18 } 19 20 /* 21 class B extends A //類A帶有final修飾,不能被繼承 22 { 23 24 public function fun1() //如果類A沒有被final修飾但是由于fun1有關鍵字final修飾不能被重寫(覆蓋) 25 { 26 echo "bbbbbbbbbbbb<br/>"; 27 } 28 } 29 */ 30 ?>
四、static關鍵字
表示靜態的意思: 用于修飾類的屬性和方法
static關鍵字修飾方法稱為靜態方法,可以不用new(實例化)就可以直接使用方法:如 類名::方法名
注意:靜態方法在實例化后的對象也可以訪問 //$對象名->靜態方法名
static關鍵字修飾屬性稱為靜態屬性,可以不用new(實例化)就可以直接訪問屬性:如 類名::屬性名
注意:靜態屬性在實例化后的對象不可以訪問; //$對象名->靜態屬性名
注意: 靜態屬性是共享的。也就是new很多對象也是共用一個屬性
在靜態方法中不可以使用非靜態的內容。就是不讓使用$this
在類的方法中可以使用其他靜態屬性和靜態方法,不過要使用self關鍵字:
如 【self::靜態屬性名】或【self::靜態方法名】
(>PHP5.3)在一個類的方法中若沒有出現$this的調用,默認此方法為靜態方法。
類中的靜態屬性和靜態方法不用實例化(new)就可以直接使用類名訪問。
格式: 類::$靜態屬性 類::靜態方法
在類的方法中,不能用this來引用靜態變量或靜態方法,而需要用self來引用。
格式: self::$靜態屬性 self::靜態方法
1 <?php 2 //static靜態關鍵字使用 3 4 class A 5 { 6 //使用static關鍵字修飾的屬性稱靜態屬性,特點是不用實例化就可直接通過類名::調用 7 public static $name="lisi"; 8 9 //使用static關鍵字修飾的方法稱靜態方法,特點是不用實例化就可直接通過類名::調用 10 public static function max($a,$b) 11 { 12 13 return $a>$b?$a:$b; 14 } 15 16 public static function add($x,$y) 17 { 18 return $x+$y; 19 } 20 21 public function demo() 22 { 23 //在類中調用其他靜態屬性和方法使用關鍵字self 24 echo self::$name; 25 echo self::add(30,40); 26 27 } 28 29 } 30 31 echo A::max(10,20); //20 32 echo A::add(10,20); //30 33 echo A::$name; //獲取靜態屬性 34 35 A::$name = "wangwu"; 36 37 echo "<hr/>"; 38 $a = new A(); 39 $a->demo(); 40 ?>
?
單例(單態)模式
單例模式(Singleton)用于為一個類生成一個唯一的對象。最常用的地方是數據庫連接。 使用單例模式生成一個對象后,該對象可以被其它眾多對象所使用。
要點:1.構造方法私有化
2.定義私有靜態的對象屬性
3.提供公有靜態的實例化當前類對象的方法,內部判斷
1 <?php 2 //PHP手冊單例模式例子 3 class Example 4 { 5 // 2.保存類實例在此屬性中 6 private static $instance; 7 8 // 1.構造方法聲明為private,防止直接創建對象 9 private function __construct() 10 { 11 echo 'I am constructed'; 12 } 13 14 // 3.singleton 方法 15 public static function singleton() 16 { 17 if (!isset(self::$instance)) { 18 $c = __CLASS__; 19 self::$instance = new $c; 20 } 21 22 return self::$instance; 23 } 24 25 // Example類中的普通方法 26 public function bark() 27 { 28 echo 'Woof!'; 29 } 30 31 //4.阻止用戶復制對象實例 32 public function __clone() 33 { 34 trigger_error('Clone is not allowed.', E_USER_ERROR); 35 } 36 37 } 38 39 ?>
?
五、const關鍵字
在類中修飾成員屬性,將其定義成常量(不可修改的),一般要求常量名都是大寫的,沒有“$”符 沒有其他修飾符(public)
定義格式: ?const 成員常量名="值";?
使用:
在類的方法中: echo self::成員常量名;
在類的外部: ?echo 類名::成員常量名;
1 <?php 2 //類中常量定義 3 define("PI",3.14); 4 const WTO = "世貿組織"; 5 6 7 class Game 8 { 9 const UP=37; 10 const RIGHT=38; 11 const DOWN=39; 12 const LEFT=40; 13 14 public function move($m) 15 { 16 switch($m){ 17 case 37: echo "向上移動...<br/>"; break; 18 case 38: echo "向右移動...<br/>"; break; 19 case 39: echo "向下移動...<br/>"; break; 20 case 40: echo "向左移動...<br/>"; break; 21 } 22 23 } 24 } 25 26 $g = new Game(); 27 $g->move(38); 28 $g->move(37); 29 $g->move(Game::LEFT); //使用類中常量提高代碼的可讀性。 30 $g->move(Game::DOWN); 31 ?>
?
六、instanceof
用于確定一個 PHP 變量是否屬于某一類 class 的實例(親自鑒定)
1 <?php 2 //instanceof類型運算符 3 4 class A{} 5 6 class B extends A{} 7 8 class C{} 9 10 $a = new A(); 11 $b = new B(); 12 $c = new C(); 13 14 var_dump($a instanceof A); //bool(true) 15 var_dump($b instanceof A); //bool(true) 16 var_dump($b instanceof B); //bool(true) 17 var_dump($c instanceof C); //bool(true) 18 echo "<hr/>"; 19 var_dump($c instanceof A); //bool(false) 20 var_dump($c instanceof B); //bool(false) 21 ?>
?