前 言 OOP 學習了好久的PHP,今天來總結一下PHP中的重要成員OOP 1、專註於解決一個問題的過程。面向過程的最大特點,是由一個一個的函數去解決處理這個問題的一系列過程。 2、專註於由哪個對象來處理一個問題。面向對象的最大特點,是一個個具有屬性和功能的類,從類中拿到對象,進而處理問題。 1、什 ...
前 言
OOP
學習了好久的PHP,今天來總結一下PHP中的重要成員OOP
1 面向過程&面向對象 |
1、專註於解決一個問題的過程。面向過程的最大特點,是由一個一個的函數去解決處理這個問題的一系列過程。
2、專註於由哪個對象來處理一個問題。面向對象的最大特點,是一個個具有屬性和功能的類,從類中拿到對象,進而處理問題。
2 面向對象 |
1、什麼是類?
具有相同屬性(特征)和方法(行為)的一系列個體的集合,類事一個抽象的概念。
2、什麼是對象?
從類中,拿到的具有具體屬性值得個體,稱為對象。 對象是一個具體的個體。
3、類和對象的關係?
類是對象的抽象化!對象是類的具體化!
類僅僅表明這類對象有哪些屬性,但是不能有具體的值,所以類是抽象的。
而對象,是將類的所有屬性複製後,產生的具體的個體,所有對象是具體的。
3 類的聲明與實例化 |
1.如何聲明一個類:
class 類名{
訪問修飾符 $屬性;
[訪問修飾符] function 方法(){}
}
2.聲明一個類的註意事項:
①類名只能由字母數字下劃線組成,開頭不能是數字,必須符合大駝峰法則;
②類名必須使用class修飾,類名後面一定不能有();
③屬性必須要帶訪問修飾符,方法可以不帶訪問修飾符;
3.實例化對象及對象屬性方法的調用
$對象名 =new 類名();//()可以不帶
類外部調用屬性和方法:
$對象名->屬性名;//使用->調用屬性時,屬性名不能帶$
類內部調用屬性和方法:
$this->屬性名
4 構造函數/析構函數 |
1、什麼是構造函數?
構造函數是類中的一個特殊函數,當我們使用new關鍵字實例化對象時,相當於調用了類的構造函數;
2、構造函數有什麼作用?
實例化對象時,自動調用,用於給對象的虎山行賦初值!
3、構造函數的寫法?
① 構造函數名,必須與類同名
[public] function Person($name){
$this->name =$name;
}
② 使用魔術方法__construct
[public] function __construct($name){
$this->name =$name; }
4、構造函數的註意事項:
① 第一種寫法,構造函數名必須與類同名。
② 如果一個類沒有手寫構造函數,則系統預設會有一個空參構造,因此可以使用 new Person();
如果我們寫了帶參的構造函數,則將不會再有空參構造,也就是不能直接使用new Prenson();Person; Person後面的()中的參數列表,必須符合構造函數的要求!!!!!
③ 如果兩種構造函數同事存在,將使用__construct。
5、析構函數: __destruct():
① 析構函數在對象被銷毀釋放之前自動調用!
② 析構函數不能帶有任何的參數
③ 析構函數常用於對象使用完以後,釋放資源、關閉資源等!
5 魔術方法 |
php,中,給我們提供一系列用__開頭的函數,這些函數無需自己手動調用,會在何時的時機自動調用,這類函數稱為魔術函數。
例如:function __construct(){} 在類new一個對象時自動調用
function __destruct(){} 在對象被銷毀時自動調用
我們要求,除了魔術方法之外,自定義的函數與方法不能使用__開頭。
最後,一般對於功能比較複雜的類,我們會單獨的寫到一個類文件中。
類文件的命名,統一小寫,使用“類名小寫.class.php”的方式命名。
在其他文件中使用這個類時,可以用include導入這個.class.php文件。
6 重點來了--php中的封裝 |
1、什麼是封裝?
通過訪問修飾符,將類中不需要外部訪問的屬性和方法進行私有化處理,以實現訪問控制。
註意:是實現訪問控制,而不是拒絕訪問。也就是說,我們私有化屬性之後,需要提供對應的方法,讓用戶通過我們提供的方法處理屬性。
2、封裝的作用?
① 使用者只關心類能夠提供的功能,而不必關心功能實現的細節!(封裝方法)
② 對用戶的數據進行控制,防止設置不合法數據,空置房會給用戶的數據(屬性封裝 set/get 方法)
3、實現封裝操作?
① 方法的封裝
對於一些只在類內部使用的方法,而不向對外部提供使用。那麼,這樣的方法我們可以使用private 進行私有化處理。
privatefunction formatName(){}
function showName(){
$this -> formatName();
}
② 屬性的封裝
為了控制舒心的設置以及讀取,可以將屬性進行私有化處理,並要求用戶通過我們提供的set/get方法進行設置
private $age;
function setAge($age){
$this->age = $age;
}
function getAge($age){
return this->age
}
$對象-> setAge("")
$對象-> getAge("")
③ 屬性的封裝+set/get 方法
private $age;
function __get($key){
return $this->$ket;
}
function __set($key,$value){
return $this->$key=$value
}
$對象->age; //訪問兌現公司有屬性是,自動調用__get()魔術方法,並將訪問的屬性名傳給__get()方法。
$對象->age=12; //設置對象私有屬性時,自動調用__set()魔術方法,並且將這是的屬性名以及屬性值傳給__set()方法;
註意:在魔術方法中,可以使用分支結構,判斷$key的不同,進行不同操作。
4、關於封裝的魔術方法:
① __set($key,$value):給類私有屬性賦值時自動調用,調用時給方法傳遞兩個參數:需要設置的屬性名、屬性值
② __get($key):讀取類私有屬性是自動調用,調用時給方法傳遞一個參數:需要讀取的屬性名;
③ __isset($key):外部使用isset()函數檢測私有屬性是,自動調用。。
>>> 類外部使用 isset();檢測私有屬性,預設是檢測不到的。 false
>>> 所以,我們可以是用__isset();函數,在自動調用時,返回內側檢測結果。
function __isset($key){
return isset($this->$key);
}
當外部使用isset($對象名->私有屬性);檢測時,將自動調用上述__isset()返回結果!
④ __unset($key):外部使用unset()函數刪除私有屬性時,自動調用;
function __unset($key){
unset($this->$key);
}
當外部使用unset($對象名->私有屬性);刪除屬性時,自動將屬性名傳給__unset(),並交由這個魔方方法處理。
1 class Person{ 2 private $name; 3 private $age; 4 private $sex; 5 public function __construct($name,$age,$sex){ 6 $this->name=$name; 7 $this->age=$age; 8 $this->sex=$sex; 9 } 10 function __isset($key){ 11 return isset($this->$key); 12 } 13 function __unset($name){ 14 if($name=="name"){ 15 echo "<span style='color:red;'>刪除不掉name</span><br>"; 16 return; 17 } 18 unset($this->$name); 19 return; 20 } 21 function __set($key,$value){ 22 if($key=="name"){ 23 $this->$key=$value."這是set出的。"; 24 return; 25 } 26 $this->$key=$value; 27 } 28 function setAge($age){ 29 if($age<=120&&$age>=0){ 30 $this->age =$age; 31 }else{ 32 error_log("年齡設置有誤"); 33 } 34 } 35 function getAge($age){ 36 return "但是我永遠18歲,哈哈哈哈哈哈。" ; 37 } 38 function __get($key){ 39 return $this->$key."hahahah"; 40 } 41 private function formateName(){ 42 return "我叫{$this->name},我今年{$this->age}歲了!<br>"; 43 } 44 public function say(){ 45 echo $this->formateName(); 46 } 47 } 48 $zhangsan = new Person("張三豐",14,"男"); 49 //$zhangsan->setAge(99); 50 //$zhangsan->say(); 51 //echo $zhangsan->getAge("88"); 52 //$zhangsan->name="李四"; 53 // $zhangsan->name="李四"; 54 echo $zhangsan->name; 55 echo $zhangsan->age; 56 var_dump(isset($zhangsan->age)); 57 unset($zhangsan->age);繼承的一點演示代碼
7 重點來了--php中的繼承 |
1、如何實現繼承?
給子類使用extends關鍵字,讓子類繼承父類;
class Stydent extends Person{}
2、實現繼承的註意事項?
① 子類只能繼承父類的非私有屬性;
② 子類繼承父類後,相當於將父類的屬性和方法copy到子類,可以直接使用$this調用該屬性。
③ PHP只能單繼承,不支持一個類繼承多個類。但是一個類進行多層繼承。
class Person{};
class ChengRen extends Person{};
class Student extends ChengRen{};
//Student 類就同事具有了ChengRen類和Person的屬性和方法。
3、方法覆蓋(方法重寫)
① 子類繼承父類;
② 子類重寫父類已有方法。
符合上述兩個條件,稱為方法覆蓋。覆蓋之後,子類調用方法,將調用子類的的方法。
同樣,除了方法覆蓋,子類也可以具有與父類同名的屬性,進行屬性覆蓋。
如果,子類重寫了父類方法,如何在子類中調用父類同名方法?
partent:: 方法名();
所以,當子類繼承父類時,需在子類的構造中的第一步,首先調用父類構造進行輔助。
function __construct($name,$sex,$school);
partent::__construct($name,$sex);
$this->school = $school;。
1 class Person{ 2 public $name; 3 public $sex; 4 5 6 7 public function __construct($name,$sex){ 8 $this->name=$name; 9 $this->sex=$sex; 10 } 11 12 public function say(){ 13 echo "我叫{$this->name},我是{$this->sex}生! <br> "; 14 } 15 } 16 17 class Student extends Person{ 18 public $school; 19 public function __construct($school){ 20 $this->school=$school; 21 } 22 23 public function say(){ 24 parent::say(); 25 echo "我叫{$this->name},我是{$this->sex}生! <br> "; 26 } 27 function say1(){ 28 echo "今天下雨了,啦啦啦啦啦。<br>"; 29 } 30 } 31 32 $lalala = new Student("每天學習"); 33 $lalala->name= "lalala"; 34 $lalala->sex="不詳"; 35 $lalala->say(); 36 $lalala->say1();封裝的一點演示代碼
8 重點來了--php中的繼承 |
1、一個類,被多個子類繼承。
如果,這個類的某個方法,在多個子類中,表現出不同的功能,我們稱這種行為為多態。
2、實現多態的必要途徑;
① 子類繼承父類;
② 子類重寫父類方法;
③ 父類引用指向子類對象;
1 abstract class Person{ 2 3 abstract function say(); 4 function say1(){ 5 echo "我是Say1"; 6 } 7 } 8 class Chinese extends Person{ 9 function say(){ 10 echo "我是一個中國人<br>"; 11 } 12 } 13 class English extends Person{ 14 function say(){ 15 echo "I'am a English"; 16 } 17 } 18 19 /*$a = new Chinese(); 20 $a->say(); 21 22 $b = new English(); 23 $b->say(); */ 24 25 function func(Person $p){ 26 $p->say(); 27 }多態的一點演示代碼
學習時候的筆記,可能會有一些錯誤的地方,歡迎各位的批評指點。
反思,復盤,每天收穫一點---------------------期待更好的自己