1、寫類的要點:
類名要具有描述性,有意義
駝峰式命名 如:class GirlFriend
2、 類裡面的變量--成員屬性
類裡面的函數--成員方法
3、在類的成員屬性前面一定要有一個修飾詞,如果不知道是用什麼修飾詞,就可以使用var(關鍵字),如果一旦有其他的修飾詞就不要有var
4、構造方法 __construct();
Ⅰ 、是對象建立完成以後,第一個自動調用的方法(特殊)
Ⅱ、方法名稱比較特殊,可以和類名相同名的方法名
Ⅲ、給對象中的成員賦初值使用的
5、析構方法 __destruct();
在對象被銷毀之前自動調用
不能帶有任參數
主要用于釋放資源(如關閉檔案,釋放結果集等)
6、魔術方法:
__get()
1、自動調用:是在直接通路私有成員的時候,自動調用! 一個參數
__set()
1、自動調用:是在直接設定私有屬性值的時候,自動調用! 兩個參數
__isset() isset() 在使用isset()判斷一個私有屬性是否存在時,自動調用__isset()魔術方法,參數則是屬性名稱
__unset() unset() 在使用unset()删除一個私有成員的時候,自動調用__unset()魔術方法,參數為屬性名稱
面向對象的程式設計思想的三個特性: 封裝性、繼承性、多态
7、繼承 --- 擴充 extends
① 子類使用extends繼承父類,子類可以将父類中所有的内容都繼承過來
② private是私有的,隻能自己用,不能别人用,包括自己的子類也不能用
③ protected 這個是保護的權限, 隻能是自己和自己的的子類中可以使用的成員,不能在外面使用
④ public 這個是公開的權限,所有都可以, 自己和子類,類外部都可以使用
8、常見關鍵字
instanceof
“instanceof”操作符用于檢測目前對象執行個體是否屬于某一個類的類型
final
在php中final不定義常量,是以就不會使用,也不能用final來修飾成員屬性
1、final可以修飾類 -- 這個類不能去擴充,不能有子類(不讓别人去擴充,這個類是最終的類時)
2、final可以修飾方法 -- 這個方法就不能在子類中覆寫(不讓子類去改這個方法,或擴充這個方法的功能時,這個方法也就是最終的方法)
static
static可以修飾屬性和方法,不能修飾類,
1、使用static修飾成員屬性,存在記憶體的初始化靜态段
2、可以被所有同一個類的對象共用
3、第一次用到類(類名第一次出現),類在加載到記憶體時,就已經将靜态的成員加到了記憶體
對象 -> 成員
類 :: 成員
4、靜态的成員一定要使用類來通路
5、self可以在類的方法中,代表自己類的($this)
6、靜态成員一旦被加載,隻有腳本結束才會被釋放掉
7、在靜态的方法中是不能通路非靜态成員
8、隻要能使用靜态的環境下聲明方法,就最好使用靜态方法(主要考慮效率)
9、單态(單例、單件)設計模式 -- 最适合php使用這個設計模式
1、如果想讓一個類隻能有一個對象,就要先讓這個類不能建立對象,将構造方法private
2、可以在類的内部使用一個靜态方法來建立對象
10、對象串行化(序列化)
1、将對象轉成字元串(不用看懂) --- 串行化(serialize)
2、将字元串轉回對象 --- 反串行化(unserialize)
注意(串行化的時機):
1、将對象在網絡中傳輸
2、将對象持久儲存
數組串行化 json -- javascript object
1、eval()函數 -- 檢查并執行php代碼
var_dump()
var_export() -- 傳回關于傳遞給該函數的變量的結構資訊
__set_state()魔術方法,就是在使用var_export()方法時,導出一個類的資訊時,自動調用的方法(靜态的、公共的)
__invoke()魔術方法 ,是在對象執行個體之後,直接像變量函數調用時,自動調用這個方法(靜态的、公共的) php5.3以後新加的方法
__call()魔術方法,是在調用不存在的方法時,自動調用這個方法
__callStatic()魔術方法,是在調用不存在的靜态方法時,自動調用這個方法(靜态的、公共的)
__autoload()魔術方法,可以寫在類外面,隻要在這個腳本中,需要加載類的時候(必須用到類名),就會自動調用這個方法
11、抽象方法和抽象類
1、什麼是抽象方法?
定義:一個方法如果沒有方法體(一個方法,不使用“{}”,直接使用分号結束的方法,才是沒有方法體的方法),這個方法就是抽象方法
一、聲明一個方法,不使用{},而直接用分号結束。
二、如果是抽象方法,必須使用abstract(抽象關鍵字來修飾)。
2、什麼是抽象類?
一、如果一個類中有一個方法是抽象方法,則這個類就是抽象類
二、如果聲明一個抽象類,則這個類必須要使用abstract關鍵字來修飾
注意1:
1、隻要使用abstract修飾這個類,這個類就是抽象類
2、抽象類是一種特殊的類,特殊在哪裡(在抽象類中可以有抽象方法)
3、除了在抽象類中可以有抽象方法以外,和正常的完全一樣
注意2:
1、抽象類不能執行個體化對象,也就是抽象類不能建立出對象
2、如果看見抽象類,就必須寫這個類的子類,将抽象類中的抽象方法覆寫(加上方法體)
3、子類必須全部實作(覆寫重寫)抽象方法,這個子類才能建立對象,如果隻實作部分,那麼還有抽象方法,則類也就必須是抽象類
抽象方法的作用:
抽象方法的作用是規定了子類必須有這個方法的實作,功能交給子類
隻寫出結構,而沒有實作,實作交給具體的子類(按自己的功能)去實作
抽象類的作用:
就是要求子類的結構,是以抽象類就是一個規範
abstract class Person{
public $name;
public $sex;
//抽象方法
abstract function say();
abstract function eat();
public function run(){
echo 'run';
}
public function sleep(){
echo 'sleep';
}
}
12、面向對象中的接口技術
抽象類是一種特殊的類,接口是一種特殊的抽象類,是以接口是一種特殊特殊的類
1、抽象類和接口都有抽象方法
2、抽象類和接口都不能建立執行個體對象
3、抽象類和接口的使用意義也就是作用相同
接口和抽象類相比,特殊在哪裡?
1、接口中的方法,必須全部是抽象方法(不能用不抽象的方法)
是以在接口中的抽象方法不需要使用abstract,直接使用分号結束即可
2、接口中的成員屬性必須是常量,不能有變量
3、接口中所有的權限都必須是共有的(public)
4、聲明接口不使用class,而是使用interface
接口應用的一些細節:
1、可以使用extends,讓一個接口繼承另一個接口(接口和接口 -- 隻有擴充新抽象方法,沒有覆寫的關系)
2、可以使用一個類來實作接口中的全部方法,也可以使用一個抽象類,來實作接口中的部分方法
(類與接口, 抽象類與接口 -- 覆寫 -- 重寫,實作接口中的抽象方法)
3、就不要使用extends關鍵字,使用implements實作, implements相當于extends
extends繼承(擴充),這個在php中,一個類隻能有一個父類
4、一個類可以在繼承另一個類的同時,使用implements實作一個接口,可以實作多個接口(一定要先繼承,再實作接口)
5、實作多個接口,隻需要使用逗号分開多個接口即可
//聲明一個接口使用interface
interface Demo{
const NAME = '張三';
const SEX = '男';
function test1();
function test2();
function test3();
}
13、PHP面象對象的特性多态
多态特性
1、程式擴充準備
技術:
1、必須有繼承關系,父類最好是接口或者抽象類
14、命名空間 -- 名字空間
1、常量
2、函數
3、類
一、namespace來聲明
二、在namespace聲明命名空間的代碼上面,不能有任何PHP代碼和HTML内容輸出(除了declare),聲明命名空間隻能是第一條
三、定義多個命名空間,以最後一個為準
四、在實際的程式設計實踐中,非常不提倡在同一個檔案中定義多個命名空間(不要在大括号外部加任何代碼)