第一章 :類和對象的聲明
面向對象(Object oritened)
Ø 面向對象的語法的學習
Ø 面向對象的編程思想的學習
與面向對象相關的單詞
Ø OO -- 面向對象 Object oritened
Ø OOA -- 面向對象的分析方法 Object oritened Analysis
Ø OOD -- 面向對象的設計方法 Object oritened Design
Ø OOI -- 面向對象的實現方法 Object oritened implementation
Ø OOP -- 面向對象的程序設計(OOA->OOD-OOI) Object oritened programming
面向對象和麪向過程的區分
類和對象的概念
Ø 類:所有事物的操作流程就是一個類,類是一種思想或者未實現的東西。
Ø 對象:所有事物的實體表現都是對象不僅僅是概念上的,所有事物的操作流程的實施過程就是一個對象。
類和對象的關係
Ø 對象是由類產生的一個實例的事物或者操作流程,這個過程叫做實例化。
Ø 類是由多個對象抽象或者說想像總結得來的,這個抽象總結的過程叫做抽化
類和對象的組成
Ø 成員屬性:是對特性的描述,在面向對象中叫做成員屬性。
Ø 成員方法:是對其功能的描述,在面向對象中叫做成員方法(就是函數)
類的聲明
類文件的書寫規則
Ø 函數的文件名:xxx.func.php
Ø 類的文件名:xxx.class.php(單類文件)
Ø 類的文件名一般與類名相同。
Ø 類的駝峯命名法是每一個單詞的首字母大寫,那麼意味着類文件名的首字母也要大寫。
類的聲明規則
Ø 類必須以class關鍵字開始。
Ø class關鍵字之後跟類名,類名通常和文件名相同。
Ø 類名之後直接跟着{}。
成員屬性書寫規則
Ø 聲明成員屬性必須使用關鍵字var 或者public,private,protected。
Ø 聲明成員屬性時,可以賦值,也可以不賦值。
Ø 聲明成員屬性時,屬性值不能賦值一個函數值。
Ø 成員屬性的最大作用是爲了給成員方法提供一個橋樑的作用。
成員方法書寫規則
Ø 成員方法的書寫其實和函數一樣。
Ø 聲明成員方法時,需要使用function關鍵字。
Ø 聲明成員方法可以傳入參數也可以不傳入參數。
Ø 聲明成員方法時,方法允許存在返回值。
Ø 同時需要注意:類中只能出現成員屬性和成員方法,不允許出現其他的代碼,否則會有語法錯誤。
類的使用
一般情況下,類是無法直接使用的,需要將類實例化對象之後方可使用。
實例化對象
Ø 格式1: 對象變量 = new類名;
Ø 格式2: 對象變量 = new類名();
對象成員屬性的使用
Ø 對象變量->成員屬性
對象成員方法的使用
Ø 對象變量->成員方法名();
$this關鍵字
Ø $this作用:在當前對象的成員方法中調用當前對象的成員屬性。
Ø $this表示當前的對象。
Ø 同時需要注意:如果代碼中具有$this,那麼該類必須實例化才能使用。
第二章:面向對象的特性
魔術方法
在PHP中以兩個下劃線開頭的方法(一種特殊的函數)稱之爲魔術方法。如果希望PHP調用這些魔術方法,首先必須在類中定義,否則PHP不會執行未創建的魔術方法
注意:PHP將所有以__開頭的類方法保留爲魔術方法,所以在定義類方法時,除了魔術方法,建議不要以__爲前綴.
構造方法
Ø 構造方法:__construct()
Ø 觸發時機:在對象實例化的時候自動觸發
Ø 作用:初始化成員屬性
Ø 參數:可以有,也可以沒有,取決於設定和邏輯
Ø 返回值:沒有
Ø 注意:如果構造方法具有參數且參數沒有默認值,在實例化對象的時候必須在類名()內添加實參值。
Ø 瞭解:在PHP版本5之前和類名一樣的函數也稱之爲構造方法
析構方法
Ø 析構方法:__destruct()
Ø 觸發時機:在銷魂對象的時候自動觸發(頁面執行完畢時)
Ø 作用:回收對象使用過程中的資源
Ø 參數:沒有
Ø 返回值:沒有
操作私有成員的魔術方法
Ø __get()方法
n 觸發時機:訪問私有成員屬性的時候自動觸發
n 功能:1.防止報錯。2.爲私有成員屬性訪問提供後門
n 參數: 1個訪問私有成員屬性的名稱
n 返回值:可以有,可以沒有
Ø __set()方法
n 觸發時機:對私有成員屬性進行設置的時候自動觸發
n 功能:1.屏蔽錯誤。2.位私有成員屬性設置新值
n 參數:2個。1個是私有成員屬性名,1個是要設置的新值
n 返回值:無
Ø __isset()方法
n 觸發時機:對私有成員屬性進行isset檢測時自動觸發
n 功能:代替對象外部的isset檢測返回結果
n 參數:1個私有成員屬性名
n 返回值:一般返回isset(私有屬性)的結果
Ø __unset()方法
n 觸發時機:在對象外部對私有成員屬性進行unset操作時自動觸發
n 功能:代替對象外部的unset操作
n 參數:1個私有成員屬性名
n 返回值:無
面向對象的三大特性
封裝、繼承和多態
封裝特性
在一個對象產生之後,對象的部分成員屬性和成員方法邏輯是是不允許在對象外部調用或者使用的,這就是封裝特性的由來
Ø 封裝的三個關鍵字
private 私有的
n 被private修飾的成員屬性不能夠在類的外部進行訪問,可以在類的內部進行訪問
n 被private修飾的成員方法也不能夠在類的外部進行訪問,可以在類的內部進行訪問
n var和private只能選取一個
protected 受保護的
public 公共的
Ø 封裝等級
n 子類同名的方法封裝等級必須大於或者等於父類的封裝等級
private = 1;protected = 2; public = 3;
u 基類中private封裝的方法,派生類中能用private、protected、 public來封裝。
u 基類中protected封裝的方法,派生類中能用protected、public來封裝。
u 基類中public封裝的方法,派生類中只能用public來封裝。
n var 是封裝關鍵字,但是他不是一個標準的封裝關鍵字,一般僅用於測試和學習
繼承特性
Ø 繼承概念
n 父類:被其他類繼承的就是父類,也叫做基類。
n 子類:繼承其他類的類就是子類,也叫做派生類。
Ø 繼承格式
class 類名 extends 父類名{
裏面可以寫獨有的子類方法
}
Ø 繼承特點
n 子類繼承父類既具有父類中所有的成員屬性和方法(私有的除外)
n 子類繼承父類之後可以具有子類獨有的屬性和方法
n 在繼承時,子類中允許出現和父類同名的方法,這種情況不會衝突,而是子類的方法會覆蓋父類的方法,這種方式叫做重載(重新加載)
n 魔術方法也可以被子類繼承
n 如果父類具有構造方法,子類也需要構造方法進行構造成員屬性,此時需要在子類中重載父類的構造方法,並且在構造方法中使用parent::__construct();進行調用父類的構造方法,構造繼承而來的父類的成員屬性。也可以使用類名::__construct()來調用父類的構造方法(該方法不推薦)
n 繼承代碼的時候不要瞎繼承,一定要有邏輯關係
n php繼承的特點和其他語言略有不同。PHP是單繼承的語言,其他語言可能是多繼承
常見關鍵字
Ø final 關鍵字
n final 英文意思 最終的 最後的
n 作用:
u 用來修飾成員方法。禁止在子類中重載父類的方法
u 用來修飾類。被final修飾的類無法被繼承
Ø const 關鍵字
n 作用:用於在類中聲明常量,這種常量是類中常量不歸對象所有,而是歸類所有。
n 需要注意:
u 在類中聲明常量使用const關鍵字
u 聲明常量時需要給常量賦值
u 聲明常量歸類所有而不是歸任何對象所有
n 類中常量的訪問方式
u 類外部:
類名::常量名
u 類內部:
類名::常量名
self::常量名
u 需要記住:
self 表示當前類
$this 表示當前對象
Ø static 關鍵字
n 在類中使用static聲明的成員都是靜態成員。
n 靜態成員的特徵是:不歸對象所有,而是歸類所有。
u static關鍵字,既可以修飾成員屬性,也可以修飾成員方法。
u static關鍵字,聲明的成員都是歸類所有,而不是歸對象所有,在沒有對象的情況下,可以通過類來訪問。
u 能聲明靜態的成員就聲明靜態的成員(效率高)。
u 具有動態成員的方法不可以聲明靜態成員方法。
u 如果方法中沒有$this存在,那麼這個方式實際上已經是一個靜態方法(php版本大於5.3以後要求寫上static關鍵字)
n 靜態成員訪問:
u 類內部
成員屬性
類名::$靜態成員屬性名
self::$靜態成員屬性名
成員方法
類名::靜態成員方法名();
self::靜態成員方法名();
u 類外部
成員屬性
類名::$靜態成員屬性名
成員方法
類名::靜態成員方法名();
對象->靜態成員方法名();(一般不用)
對象的串行化
將對象變成一個字符串的過程就是對象串行化。
Ø 作用
n 方便長久的保存對象。
n 方便在網絡上進行傳輸。
與串行化相關的魔術方法
Ø __sleep() 方法
n 觸發時機:在對象進行串行化操作時自動觸發。
n 功能:指定需要串行化的成員屬性。
n 參數:無。
n 返回值:需要返回一個數組類型,每個元素都是需要串行化的成員屬性名。
Ø __wakeup() 方法
n 觸發時機:在對象進行反串行化時自動觸發
n 功能:反串行化時自動修改部分成員屬性值
n 參數:無
n 返回值:無
Ø 串行化操作:字符串變量 = serializa(對象變量);
Ø 反串行化操作:對象變量 = unserializa(字符串變量);
其他魔術方法
Ø __tostring() 方法
n 觸發時機:對一個對象進行echo操作時自動觸發
n 功能:簡化操作或者爲對象輸出值
n 參數:無
n 返回值:必須有,並且必須爲字符串類型。
Ø __clone() 方法
n 觸發時機:對對象進行克隆操作時自動觸發
n 功能:修改克隆之後的對象的部分成員屬性。
n 參數:無
n 返回值:無
n 注意:對象的賦值默認是引用賦值,不能通過賦值操作獲取一個新的對象,獲取新對象的操作應該使用克隆操作或者new
n 克隆格式:新變量 = clone 對象變量
Ø __call() 方法
n 觸發時機:調用類中不存在的方法時,自動觸發
n 功能:1.屏蔽錯誤。2.爲不存在的方法定義一個功能
n 參數:2個 一個是不存在的方法名,一個傳入不存在方法的所有參數列表
n 返回值:可有可無
Ø __autoload() 方法
n 後期補充
抽象類
具有抽象方法的類就是抽象類。
抽象方法
沒有方法體的方法就是抽象方法。
方法體
方法後面花括號內就是方法體。
抽象方法作用
協同工作、制定標準(領導用的~)
抽象類特徵
Ø 抽象方法就是沒有方法體的方法,方法體相當於函數體,抽象方法前,必須使用 abstract 關鍵字,且方法後不能寫花括號({}),但是要寫分號(;)結束。
Ø 如果類中有抽象方法,那麼這個類前面也必須使用abstract 關鍵字進行修飾。
Ø 抽象類中可以具有非抽象方法。
Ø 抽象方法可以有參數,但不能有返回值。要實現該抽象方法,必須傳入同樣的參數。
Ø 抽象類不能直接使用(不能被實例化),必須由其他類繼承且完全實現出所有的抽象方法,纔可以使用。抽象類主要是給其他類進行繼承操作。
Ø 抽象類可以繼承抽象類。
Ø 抽象類中不可以使用private關鍵字。
接口
如果一個類沒有任何的非抽象方法(所有的方法都是抽象方法),且不存在常量之外的任何成員屬性(沒有成員屬性,常量除外),那麼這個類就是接口。
接口的特徵
Ø 聲明一個接口不使用class 關鍵字而是使用interface關鍵字。
Ø 接口中的抽象方法不能接abstrect 關鍵字。
Ø 接口只能用public關鍵字,不可以使用protected 或者private
Ø 接口中不允許有任何成員屬性,除了常量。
Ø 接口的繼承不是使用extends,而是使用implements關鍵字。
Ø extends 只能繼承一個普通類或者是一個抽象類,而implements可以同時繼承多個接口,從而模擬多繼承。
抽象類和接口的區別
Ø 抽象類的成員可以具有訪問級別,而接口的成員全部爲public級別。
Ø 抽象類可以包含成員屬性,而接口只可以有常量。
Ø 抽象類可以繼承接口,而接口不能繼承抽象類。
Ø 抽象類的成員具有具體的實現,而接口不行。
Ø 抽象的子類可以選擇性實現基類的抽象方法,而接口的子類必須實現。
多態設計模式
就是不同的人做相同的事得到不同的結果
Ø instanceof 運算符
判斷是不是一個類的實例化
單例設計模式
最終的結果只能實例化一個對象
Ø 比如:
PDO
PDO一是PHP數據對象(PHP Data Object)的縮寫,它是數據庫抽象層的一種。
學習PDO理由
Ø 以模塊的方式直接打入系統,執行效率高。
Ø 官方推薦使用PDO作爲數據庫抽象層。
Ø PHP版本從5.3之後都是默認開啓PDO。
開啓PDO
PDO是一個模塊,因此需要時還必須開啓。
Ø 找到配置文件php.ini
Extension=php_pdo_mysql.dll (PDO所支持的數據庫) 修改開啓。
Ø 5.3版本之前的
n 查看 Extension=php_pdo.dll 是否開啓,當開啓後才代表支持PDO。
n 重啓apache服務器。
n 檢測phpinfo中對應模塊是否開啓。
try...catch 語法
PDO是建立在try...catch語法之上
Ø 格式:
try{ //嘗試執行某代碼
}catch(){
}
PDO類
Ø PDO::beginTransaction — 啓動一個事務
啓動事務回滾。啓動前需要將自動提交關閉(setAttlribute()中設置)。
n PDO::commit 提交一個事物
n PDO::rollBack 回滾一個事物
使用完事物回滾都,需要在將自動提交開啓。
Ø PDO::__construct — 創建一個表示數據庫連接的 PDO 實例
Ø PDO::errorCode — 錯誤代碼
Ø PDO::errorInfo — Fetch extended error information associated with the last operation on the database handle —錯誤信息
Ø PDO::exec — 執行一條 SQL 語句(增、刪、改),並返回受影響的行數
Ø PDO::getAttribute — 取回一個數據庫連接的屬性
n PDO::ATTR_AUTOCOMMIT 檢測是否開啓自動提交
n PDO::ATTR_CASE 獲取大小寫轉換設置
n PDO::ATTR_CLIENT_VERSION 獲取客戶端信息
n PDO::ATTR_CONNECTION_STATUS 獲取鏈接狀態
n PDO::ATTR_DRIVER_NAME 獲取驅動名稱
n PDO::ATTR_ERRMODE 獲取錯誤模式
n PDO::ATTR_ORACLE_NULLS 獲取ORACLE空值轉換設置
n PDO::ATTR_PERSISTENT 獲取當前連接是否爲持久鏈接
n PDO::ATTR_PREFETCH 獲取數據的預計大小(MYSQL不支持)
n PDO::ATTR_SERVER_INFO 查看服務器信息
n PDO::ATTR_SERVER_VERSION 查看服務器的版本
n PDO::ATTR_TIMEOUT 獲取超時設置(MYSQL 不支持)
Ø PDO::getAvailableDrivers — 獲取PDO支持的數據庫類型
Ø PDO::inTransaction — 檢查是否在一個事務內
Ø PDO::lastInsertId — 返回最後插入行的ID或序列值
Ø PDO::prepare — Prepares a statement for execution and returns a statement object —準備SQL語句 返回pdo預處理對象。
Ø PDO::query — Executes an SQL statement, returning a result set as a PDOStatement object —執行查詢SQL語句
Ø PDO::quote — Quotes a string for use in a query. —字符串轉譯
Ø PDO::setAttribute — 設置屬性
n 設置屬性需要兩個參數,詳情可查手冊
PDO::ATTR_CASE:強制列名爲指定的大小寫。
u PDO::CASE_LOWER:強制列名小寫。 (強制轉小寫)
u PDO::CASE_NATURAL:保留數據庫驅動返回的列名。 (默認,不轉換)
u PDO::CASE_UPPER:強制列名大寫。 (強制轉大寫)
PDO::ATTR_ERRMODE:錯誤報告。
u PDO::ERRMODE_SILENT: 僅設置錯誤代碼。(寂靜模式、推薦使用)
u 什麼叫做寂靜模式:
u 有錯誤不輸出
u PDO::ERRMODE_WARNING: 引發 E_WARNING 錯誤(使用系統警告的方式報錯,不推薦使用該方式,會在網頁中直接顯示錯誤)
u PDO::ERRMODE_EXCEPTION: 拋出 exceptions 異常。(有錯誤後拋出異常模式,推薦使用)
PDO::ATTR_AUTOCOMMIT 自動提交
PDO操作MySQL數據庫
Ø 鏈接數據庫
n new PDO($dsn,’root’,’密碼’);
//實例化PDO類,中的構造方法會鏈接數據庫需要傳入對應的參數。
$dsn data source name 數據原名 需要在手冊中查找
Ø 判讀數據庫是否鏈接成功
n catch(PDOException $e)
//這裏使用的是PDO預處理類,該類會自動拋出,因此不用try手動拋出,try只要出現錯誤就會自動跳過來執行catch。
Ø 選擇數據庫
n 數據庫的選擇在鏈接數據庫的時候$dsn 裏面的dbname=’數據庫名’;
Ø 設置字符集
n 設置字符集就好比向數據庫發送一條命令,這裏需要使用PDO中的exec()方法
n 對象->exec(“SET NAMES utf8”);
Ø 準備SQL語句
Ø 判斷並且處理結果
n 增、刪、改時使用exec();方法來執行,且會返回受影響的行數。
n 查詢時使用query();方法來執行
Ø 關閉數據庫
n PDO會自動關閉數據庫,這裏不需要自己關閉。
PDOStatement操作數據庫
該類爲PDO的預處理類使用該類不需要實例化,採用PDO::prepare準備SQL語句,其返回值就是PDO的預處理對象。(其實不用記這麼多用到那個查手冊就行)
Ø PDOStatement::bindColumn — 綁定一列到一個 PHP 變量
Ø PDOStatement::bindParam — 綁定一個參數到指定的變量名
Ø PDOStatement::bindValue — 把一個值綁定到一個參數
Ø PDOStatement::closeCursor — 關閉遊標,使語句能再次被執行。
Ø PDOStatement::columnCount — 返回結果集中的列數
Ø PDOStatement::debugDumpParams — 打印一條 SQL 預處理命令
Ø PDOStatement::errorCode — 獲取跟上一次語句句柄操作相關的 SQLSTATE
Ø PDOStatement::errorInfo — 獲取跟上一次語句句柄操作相關的擴展錯誤信息
Ø PDOStatement::execute — 執行一條預處理語句
Ø PDOStatement::fetch — 從結果集中獲取下一行
Ø PDOStatement::fetchAll — 返回一個包含結果集中所有行的數組
Ø PDOStatement::fetchColumn — 從結果集中的下一行返回單獨的一列。
Ø PDOStatement::fetchObject — 獲取下一行並作爲一個對象返回。
Ø PDOStatement::getAttribute — 檢索一個語句屬性
Ø PDOStatement::getColumnMeta — 返回結果集中一列的元數據
Ø PDOStatement::nextRowset — 在一個多行集語句句柄中推進到下一個行集
Ø PDOStatement::rowCount — 返回受上一個 SQL 語句影響的行數
Ø PDOStatement::setAttribute — 設置一個語句屬性
Ø PDOStatement::setFetchMode — 爲語句設置默認的獲取模式。
Ø 預處理中的三種綁定方法:
n 第一種:變量問號綁定
變量用問號佔位,然後調用預處理對象中的bindParam()方法來綁定
(增)
n 第二種:變量冒號綁定
變量用冒號和隨意名佔位,然後調用預處理對象中的bindParam()方法綁定
(刪)
n 第三種:冒號數組綁定
和第二種一樣用冒號和隨意名佔位,然後調用預處理對象中的execute()綁定執行一氣呵成
(改)
Ø 預處理中查的三種方法:
n 第一種:使用fetch()方法 參數看手冊
u 第二種:使用fetch()加綁定的方法
n 第三種:使用fetchAll()方法
大數據庫存儲
Ø 圖片的存儲就是典型的大數據庫存儲,這裏圖片存儲數據庫採用的是二進制存儲,建表是的數據類型要選着BOLB類型。
Ø 首先要在鏈接拋出異常之後,採用file_get_contents();讀取圖片的信息,然後和其他數據存儲一樣,將其存入數據庫。
Ø 顯示圖片到瀏覽器是不要忘記,用header();通知瀏覽器相應的圖片類型。