標籤:value 統一 default 調用 iss 自己 get php檔案 ted
【面向過程和物件導向】
* 1、面向過程:專註於解決一個問題的過程。面向過程的最大特點,是由一個個的函數去解決處理這個問題的一系列過程;
* 2、物件導向:專註於由哪個對象來處理一個問題。物件導向的最大特點,是由一個個具有屬性和方法的功能的類,從類中拿對象,進而處理問題;
*
* 【物件導向】
* 1、什麼是類?
* 具有相同屬性(特徵)和方法(行為)的一系列個體的集合。類是一個抽象的概念。
*
* 2、什麼是對象?
* 從類中拿到的具有具體屬性的個體,稱為對象。對象是一個具體的個體。
*
* 3、類和對象的關係?
* 類是對象的抽象化,對象是類的具體化。
* 類僅僅表明這類對象有哪些屬性。但是不能有具體的值,所以類是抽象的。
* 而對象,是將類所有屬性賦值後,產生具體的個體,所以對象是具體的。
【類的聲明與執行個體化】
* 1、如何聲明一個類?
* class 類名{
* 存取修飾詞 $屬性;
* [存取修飾詞] function 方法(){};
* }
*
* 2、聲明一個類的注意事項?
* ①類名只能有字母數字底線組成,開頭不能是數字,必須符合大駝峰法則;
* ②類名必須使用class修飾,類名後面一定不能有();
* ③屬性必須帶存取修飾詞;方法可以不帶存取修飾詞;
*
* 3、執行個體化對象及對象屬性方法的調用:
* $對象名=new 類名();//()可帶可不帶;
*
* 類外部調用屬性和方法:
* $對象名->屬性名稱;//使用->調用屬性時,屬性名稱不能帶$符號!!
*
* 類內部調用屬性和方法:
* $this->屬性名稱;
*
*
* 【常見的修飾符】
* public、protected、private、var……
*
* 【建構函式】
* 1、什麼是建構函式?
* 建構函式是類中的一個特殊函數,當我們使用new關鍵字執行個體化對象時,相當於調用了類的建構函式;
*
* 2、建構函式有什麼作用?
* 執行個體化對象時,自動調用,用於給對象的屬性賦初值;
*
* 3、建構函式的寫法?
* ①建構函式名必須與類同名:
* [public]function Person(){
* $this->name=$name
* }
* ②使用魔術方法
*
* 4、建構函式注意事項:
* ①第一種寫法,建構函式名,必須與類同名!!!
* ②如果一個類沒有手寫建構函式,則系統預設會有一個空參構造,因此可以使用new Person();
* 如果我們寫進了帶參數的建構函式,則將不再有空參構造,也就是不能直接使用new Person();Person後面的()中的參數列表,必須符合建構函式的要求!!(即為形參實參問題);
* ③如果兩種建構函式同時存在,將使用魔術方法__construct。
*
* 5、解構函式:__destruct():
* ①解構函式在對象被銷毀釋放之前自動調用;
* ②解構函式不能帶有任何參數;
* ③解構函式常用於對象使用完以後,釋放資源,關閉資源等;
*
* 6、魔術方法:
* PHP中給我們提供了一系列__開頭的函數,這些函數無需手動調用,會在合適的時機自動調用,這類函數稱為魔術函數(方法);
* 例如:function __construct(){} 在類new一個對象時自動調用;
* function __destruct(){} 在對象被銷毀時時自動調用;
* 我們要求,除了魔術方法之外,自訂函數與方法不能__開頭;
*
*
* 最後,一般對於功能比較複雜的類,我們會單獨的寫到一個類檔案中。
* 類檔案的命名,統一小寫,使用"類名.class.php"的方式命名。
* 在其他檔案中使用這個類時,使用include匯入這個.class.php檔案。
【繼承的基礎知識】
1、如何?繼承?
* 給子類加上extends關鍵字,讓子類繼承父類;
* eg: class Student extends Person{}
2、實現繼承的注意事項:
* ①子類只能繼承父類的非私人屬性;
* ②子類繼承父類後,相當於將父類的屬性和方法copy到子類,可以直接使用$this調用該屬性;
* ③PHP只能單繼承,不支援一個類繼承多個類。即PHP不允許多重繼承!!!
* 但是,一個類可以進行多層繼承;
eg:class Person{}
* class ChengNian extends Person{}
* class Student extends ChengNian{}//Student類就同時具有了Person類和ChengNian類的所有屬性和方法;
3、方法覆蓋:
* 條件①子類繼承父類;
* 條件②子類重寫父類已有方法;
*
* 符合上述了兩個條件稱為方法覆蓋。覆蓋之後,子類調用的方法將調用子類自己的同名方法;
*
* 同樣,除了方法覆蓋,子類也可以具有與父類同名的屬性,進行屬性覆蓋;
*
* 如果子類重寫了父類方法,如何在子類中調用父類的同名方法?
* parent::方法名();
*
* 所以,當子類繼承父類時,需在子類構造中的第一步,首先調用父類構造並進行賦值;
* eg:function __construct($name,$sex,$school){
parent::__construct($name,$sex);
$this->school=$school;
}
【封裝的基本概念】
1、什麼是封裝?
通過存取修飾詞,將類中不需要外部存取的屬性和方法進行私人化處理,以實現存取控制。
>>>注意是實現存取控制,而不是拒絕訪問。也就是說,我們私人化屬性之後,需要提供對應的方法,讓使用者通過我們提供的方法處理屬性。
2、封裝的作用?
* ①使用者只關心類能夠提供的功能,而不需要關心功能實現的細節(封裝方法)!
* ②對使用者的資料進行控制。防止設定不合法資料,控制返回給使用者的資料(屬性封裝+set/get方法)!
3、實現封裝操作:
* ①方法的封裝:
* 對於一些只在類內部使用的方法,而不想對外不提供試用。那麼,這樣的方法我們可以使用private進行私人化處理;
* eg:private function say1(){
return "我叫{$this->name},今年{$this->age}歲了!</br>";
}
function say(){
echo $this->say1();
}
②屬性的封裝+set/get方法:
* 為了控制屬性的設定以及讀取,可以將屬性進行私人化處理,並要求使用者通過我們提供的set/get方法進行設定;
* eg:private $age;
function setAge($age){
if($age>=0&&$age<=99){
$this->age=$age;
}else{
error_log("年齡設定有誤!");
}
}
function getAge(){
return $this->age;
}
$對象->getAge();
$對象->setAge(12);
③屬性的封裝+魔術方法;
* eg:private $age;
* function __get($key){
switch ($key) {
case ‘name‘:
return $this->$key."(這是__get讀取時加上的文字!)</br>";
case ‘age‘:
return $this->$key."(這是__get讀取時加上的文字!)</br>";
default:
return $this->$key."(這是__get讀取時加上的文字!)</br>";
break;
}
}
function __set($key,$value){
if($key=="name"){
$this->$key=$value."(這是__set設定上的文字!)</br>";
}else{
$this->$key=$value;
}
}
$對象->age;//訪問對象私人屬性時,自動調用__get()魔術方法,並且將訪問的屬性名稱傳給__get()
* 方法;
$對象->age=12;//設定對象私人屬性時,自動調用__set()魔術方法,並且將設定的屬性名稱以及屬性值傳給__set()方法 ;
*
* 注意:在魔術方法中,可以使用分支結構,判斷$key的不同,進行不同的操作。
4、關於封裝的魔術方法:
* ①__set($key,$value):給類私人屬性賦值時自動調用,調用時給方法傳遞兩個參數:需要設定的屬性名稱、屬性值;
*
* ②__get($key):讀取類私人屬性時自動調用,調用時給方法傳遞兩個參數:需要讀取的屬性名稱;
*
* ③__isset($key):外部使用isset()函數檢測私人屬性時,自動調用。
* >>>類外部檢測私人屬性,預設是檢測不到的。false.
* 所以我們可以使用__isset()函數,在自動調用時,返回內部檢測結果;
eg:function __isset($name){
return isset($this->$name);
}
* 當外部使用isset($對象名->私人屬性);檢測時,將自動調用上述__isset()返回的結果;
*
* ④__unset($key):外部刪除私人屬性是自動調用;
* eg:function __unset($name){
unset($this->$name);
}
* 當外部使用unset($對象名->私人屬性);刪除屬性時,自動將屬性名稱傳給__unset();,並交由這個魔術方法處理。
【關鍵字】
1、final:
* ①final修飾類,此類為最終類,不能被繼承;
* ②final修飾方法,此方法為最終方法,不能被重寫;
* ③final不能修飾屬性;
2、static:
* ①可以修飾屬性和方法,分別稱為靜態屬性、靜態方法,也叫類屬性、類方法。
* ②靜態屬性、靜態方法,只能使用類名直接調用。
* 使用“類名::$靜態屬性”、“類名::靜態方法()”
Person::$sex; Person::say();
* ③靜態屬性、方法,在類第一次裝載時就會產生。先於對象產生;
*
* ④靜態方法中,不能調用非靜態屬性或方法;非靜態方法可以調用靜態屬性或方法;(因為靜態屬性和方法在類裝載時就已經產生,而非靜態屬性方法此時還沒有執行個體化誕生!)
* ⑤在類中,可以使用self關鍵字,代指類名;
* eg:class Person{
static $sex="男";
function __construct($name,$sex){
$this->name=$name;
self::$sex=$sex;
}
}
echo Person::$sex;
⑥靜態屬性是共用的。也就是說new很多個物件也是共用一個屬性;
3、const關鍵字;
* 在類中聲明常量,不能使用define()函數!必須使用const關鍵字。
* 與define()聲明類似,const關鍵字聲明不能帶$,必須全部大寫。
* 常量一旦聲明,不能改變。調用時與static一樣,使用類名調用;Person::常量;
4、 instanceof操作符:
* 檢測一個對象,是否是某一個類的執行個體(包括父輩 爺爺輩……);
* 返回布爾值;
【小總結】幾種特殊操作符:
1、.只能連接字串 ""."";
2、=>聲明數組時,關聯鍵與值;["key"=>"value"];
3、->對象(this new出的對象)調用成員屬性、成員方法。
4、::①使用parent關鍵字,調用父類中的同名方法;parent::say()
②使用類名(和self),調用類中的靜態屬性靜態方法以及常量;
PHP中的OOP