一.物件導向三大基本特徵
1.封裝:
所謂的封裝,也就是把客觀的事物封裝成抽象的類,並且類可以把自己的資料和方法只讓
可信的類或者物件來操作,對不可信的進行資訊隱藏
2.繼承:
所謂的繼承是指可以讓某個型別的物件獲得另乙個型別的物件的屬性和方法
3.多型:
所謂多型是指乙個類例項的相同方法在不同情形有不同的表現形式
二.封裝
1.封裝是把物件中的成員屬性和成員方法加上訪問修飾符,使其盡可能隱藏物件的內部細節,
以達到對成員的訪問控制(切記不是拒絕訪問)
訪問修飾符:
public(公共的):類的內部、類的外部(物件)、子類中都可以訪問(通過parent::進行訪問)
protected(受保護的):類的內部、子類中可以訪問
private(私有的):類的內部可以訪問
2.封裝相關魔術方法
魔術方法:
__get($name):獲取物件中私有成員和受保護的屬性或者訪問乙個不存在的屬性時會自動呼叫
__set($name,$value): 設定物件中物件中私有成員和受保護的屬性或者訪問乙個不存在的屬性時會自動呼叫
__isset($name):檢測物件中私有成員和受保護的屬性或者訪問乙個不存在的屬性時會自動呼叫
__unset($name):銷毀物件中私有成員和受保護的屬性或者訪問乙個不存在的屬性時會自動呼叫 沒有返回值
注意:上面四個魔術方法只對類中的私有、受保護成員屬性有效
三.繼承
1.子類只會繼承父類的所有public和protected成員屬性和方法
子類無法繼承父類的private的屬性和方法
php只支援單繼承,不允許多重繼承,乙個子類只能有乙個父類,但乙個類可以被多個類繼承
子類中新增加的屬性和方法是對父類的擴充套件
繼承的關鍵字:extends
例:class 子類名 extends 父類名
2.子類重寫
子類和父類的方法同名,則子類方法重寫(覆蓋)父類方法
在子類中,可以使用parent訪問父類中的被覆蓋的方法
例:parent::父類方法名();
如果想把子類繼承下來的屬性修改的話可以在寫乙個構造方法,如果構造方法中的屬性名跟父類的屬性名有一樣時
然後把parent::方法名()寫到子類構造方法中可以代替你要宣告的屬性名,如果你要擴充套件子類的屬性還要在構造方法
前面宣告乙個屬性名,然後在構造方法中拿到這個屬性名對他進行賦值
3.final關鍵字
在php5中新增加了final關鍵字,它只能用來修飾類和方法,不能使用final這個關鍵字來修飾成員屬性
final的特性:
使用final關鍵字標識的類不能被繼承,不可能有子類
使用final關鍵字標識的方法不能被子類覆蓋(重寫)
4.static關鍵字(可以重新賦值)
static關鍵字是用於修飾類的成員屬性和成員方法(靜態屬性和靜態方法)
一般將所有的物件都相同的屬性和方法設定為靜態
類的靜態屬性和靜態方法不用例項化(new)就可以直接使用類名訪問
例:類名::$靜態屬性 類名::靜態方法
在類的內部,不能使用this來引用靜態變數和靜態方法,而需要用self來引用
例:self::$靜態屬性 self::靜態方法
靜態方法中不可以使用非靜態的屬性和方法,不讓使用$this
靜態屬性是共享的,也就是new很多物件也是共用乙個屬性
5.const關鍵字
const是乙個在類中定義常量的關鍵字,在php中定義常量使用的是define()這個函式
但是在類裡面定義常量使用的是const這個關鍵字
const只能修飾成員屬性(常量屬性),其訪問方式使用類名:常量屬性,在方法裡面使用self關鍵字
但不能使用$符號,更不能使用物件來訪問
self::常量屬性 //類內部訪問
類名::常量屬性 //類外部訪問
6.instanceof關鍵字
instanceof操作符用於檢測當前物件例項化是否屬於某個類的型別
例:class person
class student extends person
$p=new person();
s=new student();
echo $p instanceof student; //結果為false
echo $s instanceof student ; //結果為true
echo $s instanceof person; //結果為true
7.clone關鍵字
有時候需要根據需求轉殖出乙個一模一樣的物件,而且轉殖出來兩個物件互不干擾就需要使用
clone關鍵字
格式:$obj = new class();
$objectcopy=clone $obj;
魔術方法:__clone() 當執行clone轉殖時會自動呼叫的方法, 主要用於解決物件中特殊屬性的複製操作。
8.__tostring魔術方法
__tostring()是快速獲取物件的字串表示的最快捷方式,當我們去輸出乙個物件時
如echo $obj,print $obj,那麼會自動呼叫的此魔術方法。
__tostring()方法必須返回乙個字串型別的值 用這個魔術變數給他乙個返回值
__tostring()不能有引數
9.__call魔術方法
在當試圖呼叫乙個物件中不存在的方法時,就會產生錯誤,php提供了__call這個方法來處理這種情況
告訴當事人乙個提示
格式:__call( string $name , array $arguments )
第乙個引數$name表示方法名,
第二引數$arguments表示呼叫時的引數列表(陣列型別)
四.物件序列化
物件也是一種在記憶體中儲存的資料型別,他的壽命通常會隨著生成該物件的程式終止而終止
有時候可能將物件的狀態儲存下來,需要時再將物件恢復,物件通過寫出描述自己的狀態的值
以下兩種情況需要將物件序列化:
物件需要在網路中傳輸時,將物件序列化成二進位制串即可。
物件需要持久儲存時,將物件序列化後寫入檔案或資料庫。
序列化和反序列化函式:
serialize() -- 序列化,返回乙個包含位元組流的字串 私有的屬性不會被序列化 進行序列化可以把這個物件類
轉換成字串儲存起來
例:$p1=new person('李冰冰',160,50,18);
//把這個物件序列化
$str=serialize($p1)
//將字串寫入data.txt
file_put_contents("data.txt",$str);
unserialize() -- 反序列化,能夠重新把字串變回php原來的物件值。
例:$str=file_get_contents("data.txt");
//將字串中的類生成乙個物件
$p1=unserialize($str);
//echo $p1->name;
$p1->say();
序列化乙個物件將會儲存物件的所有屬性變數和類名資訊,但是不會儲存物件的
物件序列化魔術方法
__sleep()
是執行序列化時自動呼叫的方法。
注意:sleep方法需要返回乙個陣列,其中陣列中的值是需要序列化的屬性名
例:function __sleep() 這裡寫哪些屬性名就會序列化哪些屬性
__wakeup()
是在執行反序列化時自動呼叫的方法,可以在反序列化時改變屬性的值,即再次初始化。
輸出這個物件的時候可以通過這個魔術方法來改變輸出的屬性值
五.自動載入類
在編寫物件導向程式時,常規做法就是每個類儲存為乙個php原始檔,當在乙個php檔案中
需要呼叫乙個類時很容易就可以找到,然後通過include(或require)把這個檔案引入就可以了。
不過有的時候,在專案中檔案眾多,要一一將所需類的檔案include進來,是乙個很讓人頭疼的事。
php5提供了乙個__autoload()來解決這個問題。當new例項化乙個不存在的類時,
則自動呼叫此函式並將類名作為引數傳入此函式。
在定義類的檔名時,需要乙個類對應乙個同名的php檔案:
goods.class.php , user.class.php
例:function __autoload($classname)
$goodobj=new goods();
宣告的方法跟類的名字一樣的話會形成構造方法,例項化這個物件的時候會自動讀取
物件導向的封裝和繼承
封裝是物件導向程式設計的一大特徵,所謂的封裝通俗來說就是把不想被別人看到的東西隱藏起來,封裝的原則要求不能直接訪問類中的資料成員,封裝具有以下特徵 在類的定義中設定訪問物件屬性以及方法 的許可權,限制本類物件及其它類的物件的使用範圍 提供乙個介面來描述其他物件的使用方法 其他物件不能直接修改本物件所...
python物件導向開發 封裝,繼承和多型
1.乙個功能封裝成乙個函式,目的是為了重複使用 方便檢視 1.如果多的子類都需要都乙個方法,那麼我們會把這個方法給父類,目的,重複使用 2.繼承順序根據 類.mro 3.在開發中最好是先呼叫父類的這個方法也就是super init 然後在新增自己的功能,保證程式的穩定.以下的 的輸出將是什麼?說出你...
物件導向(封裝 繼承)
1.類的訪問修飾符有public private internal protected。其中pubulc 公共的,只要引用了命名空間,就可以隨意進行訪問 private 私有的,只有當前類內部才可以訪問 internal 內部的,當前程式集內可以訪問,程式集就是命名空間,此修飾符是預設的 prote...