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實現多態是這樣的:通常父類是抽象類或者接口由子類去實現,那麼 子類中就都含有相同的方法名,但是每個子類的實現不同