===================================================
對象是客觀存在的一個實體。
類是對對象抽象的一個描述。
概念:對象(實體)、類、 類與對象的關係。
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. 驗證碼輸出