php面向對象的特性和java的思想是一樣的,只不過一個是弱類型語言一個是強類型語言,
兩者的實現還是有許多不同點的,功能上也只能點到即止,由於我兩者經常搞混,
於是寫這篇文章來總結一下php的面向對象的一些知識點,
方便日後查詢;
class Person{
var $name;
private $age;
function Person(){ //老版構造方法,方法名和類名相同
// 構造函數在對象生成時首先自動執行的函數,一般用來初始化變量
}
function __construct(){ //php5新版構造方法
}
function __destruct(){ //析構函數
// 對象失去引用後自動執行的函數(引用放在棧中,對象放在堆中)
}
private function study(){
// 關鍵字private用來聲明私有屬性或方法,私有屬性或方法不能被外部訪問,
// 只有在類裡面能夠訪問,並且私有的屬性和方法不能被繼承
}
protected function study(){
// 關鍵字protected用來聲明受保護的屬性或方法,受保護的屬性或方法不能被外部訪問,
// 只有在類裡面能夠訪問,但受保護的的屬性或方法可以被繼承
}
public function study(){
// public聲明共有的方法或屬性,省略不寫的函數或方法都是默認的public
}
常用的一些系統方法
__set() , __get() , __isset() , __unset();
__toString() , __clone() , __call() , __autoload();
function __get($name){
// 當外部試圖訪問對象私有屬性的時候自動調用,並且接受的參數就是外部試圖訪問的屬性名
}
function __set($name,$value){
// 當外部試圖設置對象私有屬性的時候自動調用,並且接受的參數是屬性名和值
}
function __isset($name){
// 當外部使用isset()函數來測試一個對象的私有屬性是否存在時執行的函數,自動接受測試的屬性名
}
function __unset($name){
// 當外部使用unset()函數來試圖刪除一個對象的私有屬性時自動調用,自動接受試圖刪除的屬性名
}
function __toString(){
// 如果直接輸出一個對象的引用(指針)的時候會自動調用本函數
return str; //必須返回一個字符串
}
function __clone(){
// 如果外部使用clone關鍵字克隆對象($a1=clone $a2)的話會自動調用本函數
// 可以用來初始化,此時的$this代表新克隆的對象$a1,代表被克隆對象的是$that
//$a1=clone $a2 區別於$a1=$a2,前者在堆中新創建了一個對象,後者只是同一個對象多了一個指針指向它
}
function __call($funName,$argus){
// 當調用一個對象不存在的方法時自動調用此函數,自動接受參數$funName(不存在的函數名)
// 參數$argus為數組
}
__autoload()函數:
這個函數不是寫在對象裡面的,是寫在一個php文件的頂部用來自動加載這個php頁面使用到的類
function __autoload($className){ include $className."php" //組裝成一個完整路徑 }
}
繼承:
class Boy extends Person{
var $hoby;
function playgame(){
}
}
php中不支持函數重載,因為弱類型的原因,參數的類型不確定,因為php支持函數動態參數,
所以參數個數不確定,所以php中只能覆蓋函數(方法重寫)
方法重寫:在子類方法中加上一句 paret::方法名();就把父類的方法裡面的代碼加入到新方法中了
php面向對象中的常見關鍵字:
final static const
final class Person{
// 加上關鍵字final的類不能被繼承
final function study(){
// 使用final關鍵字的函數不能被重載(重寫)
}
}
使用static修飾的方法或屬性可以不用實例化對象直接使用類名::方法()或類名::屬性
靜態方法中不能使用非靜態屬性
const修飾常量:const NUM=100;常量名習慣大寫
關鍵字$this和self
前者代表本對象,後者代表本類
對象的串行化和反串行化
串行化:serialize(value)
參數為對象名,函數的返回值為字符串
反串行化:unserialize(str)
參數為字符串,函數的返回值為對象
什麼時候使用:1,在網絡傳輸的時候,2,將對象寫入文件或數據庫的時候
部分串行化:
在對象中添加這個方法:
function __sleep(){
$arr = array("name","age"); //將要串行化的屬性以數組的形式傳入
return $arr;
}
在反串行化時自動調用這個方法(如果對象中沒寫則不調用):
function __wakeup(){
//類似於__clone(),主要是做一些初始化工作
}
抽象方法和抽象類:
抽象方法:abstract function abd();
只有方法名,沒有方法體
含有抽象方法的類叫抽象類,也需要使用 abstract 關鍵字修飾
抽象類就是在普通類的基礎上多了抽象方法
抽象類不能被實例化,只作為一個規范
繼承抽象類的類必須實現裡面的抽象方法,否則也是抽象類,不能實例化對象
接口:
接口的聲明
interface demo{
}
所有成員屬性必須是常量
所有方法都是抽象的
所有成員都必須是 public
一個類只能繼承一個父類,但是可以實現多個接口
class one implements two{
}
php中的多態(和java不同)
通常php實現多態是這樣的:通常父類是抽象類或者接口由子類去實現,那麼
子類中就都含有相同的方法名,但是每個子類的實現不同