PHP的面向對象

   PHP的面向對象:
===================================================
對象是客觀存在的一個實體。
類是對對象抽象的一個描述。

概念:對象(實體)、類、 類與對象的關係。

oop面向對象編程的特點:封裝、繼承、多態

類和對象的關係:
類的實例化結果就是一個對象(使用new關鍵字)
對對象的抽象描述就是一個類


一、如何定義一個類和使用
-------------------------------------
1.1 語法格式:
[修飾符] class 類名{
  【成員屬性】定義變量   


  【成員方法】定義函數
}


[修飾符] class 類名 [extends 父類] [implements 接口1[,接口2...]]{
  【成員屬性】定義變量   


  【成員方法】定義函數
}


1.2 其中成員屬性格式:
修飾符 $變量名[=默認值];  如:public $name="zhangsan";
注意:成員屬性不可以是帶運算符的表達式、變量、方法或函數的調用。 如:
public $var3 = 1+2;
public $var4 = self::myStaticMethod();
public $var5 = $myVar;
正確定義方式:
public $var6 = 100; //普通數值(4個標量:整數、浮點數、布爾、字串)
public $var6 = myConstant; //常量
public $var7 = self::classConstant; //靜態屬性
public $var8 = array(true, false);  //數組

常用屬性的修飾符:public、protected、private、static、var

1.3 其中成員方法格式:
[修飾符] function 方法名(參數..){
[方法體]
[return 返回值]
}

常用的修飾符:public、protected、private、static、abstract、final

1.4 對象: 他是通過new 類()來產生的對象。其中new稱爲實例化
也就是:類的實例化就會產生一個對象。
如: $p = new Person();


1.5 $this 關鍵字: 表示自己,表示當前使用對象。
 我們在類中調用自己的成員屬性或函數都是使用 $this->調用。
 注意:非靜態方法中可以使用this關鍵字  


二、構造函數和析構函數
------------------------------------------
2.1. 構造方法(構造函數):
當我們通過new關鍵字來創建一個對象時,第一個自動執行的方法稱爲構造方法。
方法名__construct();  主要用於初始化對象。
(在php4.0時可使用與類名重名的方法作爲構造方法)

2.2. 析構方法:當這個對象被銷燬時最後自動調用的方法,稱爲析構方法。
__destruct(); 目的是釋放資源(如關閉連接、文件,釋放資源)


三、封裝(訪問控制)
--------------------------------------------------------------------
3.1 封裝:就是將屬性私有,並提供公有的setter放置與getter取值方法


public(公有)    protected(受保護)    private(私有)
 ===========================================================
  在本類中      Y               Y                   Y
  在子類中      Y               Y                   N 
  在類外邊      Y               N                   N
 
 
四、 重載 
----------------------------------------------------------------
4.1 屬性重載中的四個魔術方法:__set() __get() __isset() __unset() 


 * __get():當我們直接輸出一個對象中的非公有屬性時會自動調用的方法,
並將屬性名以第一個參數傳進去。
__get($name){...}

 * __set(); 當我們直接設置一個對象中的非公有屬性時會自動調用的方法,
並將屬性名以第一個參數,值作爲第二參數傳進
__set($name,$value){...}


  __isset()當對未定義的變量調用isset() 或 empty()時,__isset() 會被調用。
  //當isset判斷一個對象的非公有屬性是否存在時,自動調用此方法。
  public function __isset($param){
 return isset($this->$param);
  }
  
  __unset()當對未定義的變量調用unset()時,__unset() 會被調用。
  //當unset銷燬一個對象的非公有屬性時,自動調用此方法。
  public function __unset($param){
 unset($this->$param);
  }
  
4.2 方法的重載:
*  mixed __call ( string $name , array $arguments )
 mixed __callStatic ( string $name , array $arguments )  php5.3.0支持


當調用一個不可訪問方法(如未定義,或者不可見)時,__call() 會被調用。 
其中第一個參數表示方法名,第二參數表示調用時的參數列表(數組類型)


當在靜態方法中調用一個不可訪問方法(如未定義,或者不可見)時,__callStatic() 會被調用。 


五、 繼承
----------------------------------------------------------------------------
5.1. 繼承:extends
假如B類繼承A類,那麼就繼承了A中所有非私有屬性和方法(函數)。
  其中A叫父類(基類)。 B叫子類(派生類)
class B extends A{ 
....
}


在php中類只支持【單一繼承】,就是一類只能繼承一個父類。


   parent關鍵字:若子類出現覆蓋父類的方法,那麼有時還想調用被覆蓋掉了的方法,
   我們就是用關鍵字【parent::父類方法】還有使用類名


class A{
public function __construct(){
//....
}
}
class B extends A{
public function __construct(){
parent::__construct();//注意要調用一下父類的構造方法
//....
}
}


六、 final、static和const
---------------------------------------------------------------
6.1 final關鍵字:主要用於修飾類與成員方法(函數)
  
  使用final關鍵字修飾類,表示這個類不可以有子類。(一般是沒有必要有子類的,防止有子類的覆蓋)
  使用final關鍵字修飾的方法,不可以在子類中被覆蓋(重寫)。
目的:一是爲了安全,二是沒有必要
*6.2 static關鍵字:表示靜態的意思: 用於修飾類的屬性和方法
  *static關鍵字修飾方法稱爲靜態方法,可以不用new(實例化)就可以直接使用方法:如 類名::方法名
注意:靜態方法在實例化後的對象也可以訪問  //$對象名->靜態方法名
 
      static關鍵字修飾屬性稱爲靜態屬性,可以不用new(實例化)就可以直接訪問屬性:如 類名::屬性名
注意:靜態屬性在實例化後的對象不可以訪問; //$對象名->靜態屬性名
  
  注意:靜態屬性是共享的。也就是new很多對象也是共用一個屬性
*在靜態方法中不可以使用非靜態的內容。就是不讓使用$this
在類的方法中可以使用其他靜態屬性和靜態方法,不過要使用self關鍵字:
如 【self::靜態屬性名】或【self::靜態方法名】

在一個類的方法中若沒有出現$this的調用,默認此方法爲靜態方法。
 
*6.3. const關鍵字: 在類中修飾成員屬性,將其定義成常量(不可修改的),
一般要求常量名都是大寫的,沒有“$”符 沒有其他修飾符(public)
在其他方法中使用常量: 【self::常量名】
定義格式:  const 成員常量名="值"; 
     使用:在類的方法中:   echo self::成員常量名;
        在類的外部:   echo 類名::成員常量名;

6.4. 檢測當前對象是否是屬性指定的類
instanceof 用於確定一個 PHP 變量是否屬於某一類 class 的實例:
 
is_a — 如果對象屬於該類或該類是此對象的父類則返回 TRUE



七、 類型約束
----------------------------------------------------
1. 類型約束可以使用的類型是:數組或對象。
若指定的一個類名,那麼可傳入本類及子類的對象進去。
可以使用的約束類型:(複合類型)數組array,類名、抽象類名、接口名
//如下面的類
class MyClass
{
/**
* 測試函數
* 第一個參數必須爲類OtherClass的一個對象
*/
public function test(OtherClass $otherclass) {
echo $otherclass->var;
}





/**
* 另一個測試函數
* 第一個參數必須爲數組 
*/
public function test_array(array $input_array) {
print_r($input_array);
}
}

八、其他魔術方法:
-----------------------------------------------------------------
1. 對象複製clone 克隆一個對象,因爲對象屬於引用類型,普通的“=”號屬於引用賦值,
所有需要clone來複制一份。
魔術方法:__clone() 當執行clone克隆時會自動調用的方法。

2. __toString()方法:魔術方法,當我們直接要輸出一個對象時,如echo $a,print $a,
那麼會自動調用的方法。
注意:__toString()方法必須返回一個字串類型的值。




3. *自動加載類函數__autoload(類名): 
當new 實例化一個對象時,這個類若不存在,則自動調用此函數,並將類名存入參數
我可以使用這個實現類的自動加載。



九、 對象序列化(串行化)(webservice  XML)(在對象持久化存儲、和傳輸中使用)
----------------------------------------------------------------------------------------------
serialize() -- 串行化
unserialize() -- 反串行化


php裏面的值都可以使用函數serialize()來返回一個包含字節流的字符串來表示。
unserialize()函數能夠重新把字符串變回php原來的值。 
序列化一個對象將會保存對象的所有變量,但是不會保存對象的方法,只會保存類的名字。


__sleep 和 __wakeup 

__sleep(): 是執行串行化時自動調用的方法,目的是實現資源類型的屬性實關閉操作。
注意:sleep方法需要返回一個數組,其中數組中的值是串行化時要保留的屬性名

__wakeup():是在執行反串行化時自動調用的方法,目的是實現資源屬性的打開(sleep方法關閉的資源)


public function __seep(){
        return array('server', 'username', 'password', 'db');
//此串行化要保留四個屬性
    }

十、 抽象類:
-------------------------------------------------------------------------------------  
      當類中有一個方法,他沒有方法體,也就是沒有花括號,直接分號結束。
如 public abstract function fun();
象這種方法我們叫抽象方法,必須使用關鍵字abstract定義,
包含這種方法的類必須是抽象類也要使用關鍵字abstract加以聲明。
   
    抽象類的特點:
不能實例化,也就new成對象
若想使用抽象類,就必須定義一個類去繼承這個抽象類,並定義覆蓋父類的抽象方法(實現抽象方法)。


    其實抽象類對於子類(實現類),有一個約束的作用,


   含有抽象方法的類肯定是抽象類,但是不是所有的抽象類都必須包含抽象方法。


十一、 接口:
-------------------------------------------------------------------------------------------------
   假如一個抽象類中所有的方法都是抽象的,那麼我們可以使用另外一種方式定義:接口
   接口使用關鍵字interface來定義,接口中只能有常量與抽象方法。
   格式:
interface 接口名{
[常量定義]
[抽象方法定義] //注意不要有abstract關鍵字



   實現方式:class 類名  implements 接口名,接口名2{
實現體。。
   }


   
十二、多態
-------------------------------------------------------------------------------------------
*多態(使用方式):對於同一個方法,傳入不同對象,實現了不同的效果,這個就是多態的意思,
      需要使用的技術:繼承或實現,方法的覆蓋(重寫)。


實例:
主板:mainboard   PCI插槽(規範接口)  


第三方生產
聲卡: soundCard
網卡: networkCard 

設計模式:單例、單態設計模式






http://localhost/.../index.php?m=類名&a=方法名&其他參數


http://localhost/.../user/add.html


http://news.sohu.com/web/123456.html


http://news.sohu.com//find?id=123456

 
十三、異常處理:
--------------------------------------------------------------------------------
在php5中有一種新的錯誤處理機制--異常處理:(採用面向對象方式的)
涉及的類:Exception異常類
結構:
<?php
class Exception
{
protected $message = 'Unknown exception';   // 異常信息
protected $code = 0;                        // 用戶自定義異常代碼
protected $file;                            // 發生異常的文件名
protected $line;                            // 發生異常的代碼行號


function __construct($message = null, $code = 0);


final function getMessage();                // 返回異常信息
final function getCode();                   // 返回異常代碼
final function getFile();                   // 返回發生異常的文件名
final function getLine();                   // 返回發生異常的代碼行號
final function getTrace();                  // backtrace() 數組
final function getTraceAsString();          // 已格成化成字符串的 getTrace() 信息


/* 可重載的方法 */
function __toString();                       // 可輸出的字符串
}
?> 


使用:
1. throw new Exception("年齡不可以爲負數"); //異常拋出  對象
2. try{
//捕獲異常
$s->age=30;
$s->age=-40;
3. }catch(Exception $e){
//異常處理
echo $e->getmessage();
}


 
  
   
 php面向對象中的實用類:
 ==================================================================
 1. Model.class.php 表數據信息操作類
 2. Page.class.php 分頁類
方法:屬性:URL地址、條件、總頁數、總條數、頁大小、當前 頁
構造方法(參數:總條數、頁大小、條件)
私有方法:計算最大頁數、判斷當前頁數是否越界
輸出分頁信息方法:(輸出給Model類中limit方法使用)
私有屬性的getter方法(__GET());
輸出分頁信息方法(輸出HTML代碼)(就是:【上一頁】【下一頁】。。。。)
 3. images.class.php 圖片處理類(等比縮放、圖片水印、裁剪);
 4. fileupload.class.php 文件上傳類

 5. 驗證碼輸出


 
發佈了17 篇原創文章 · 獲贊 23 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章