php一種面向對象的語言,那麼什麼是面向對象呢?php
傳統的面向過程的編程思想:css
相信不少人第一次接觸編程都是c語言,c語言就是很是典型的面向過程的編程語言,將要實現的功能描述爲一個從開始到結束的連續的「步驟(過程)」。依次逐步完成這些步驟。若是步驟較大,又能夠將該步驟再次細分爲子步驟,以此類推。
程序從頭開始執行一直到結尾並獲得所需結果。
例子:完成來傳智「報名學習」這件事,能夠這樣來實現:
第一步,學生提出要報名,並提供姓名和照片
第二步,諮詢老師接收照片並登記學生姓名
第三步,學生繳費(付款到學校帳號)並得到繳費憑證
第四步,諮詢老師驗證憑證並分配班級
第五步,最終結果爲:報名完成,學生能夠在規定的時間到規定的班級(教室)上課,數據庫中就有了該學生的信息。
現代的面向對象的編程思想:mysql
將要實現的功能描述爲一個「對象/物體」完成的任務——現實中也是如此:功能的實現都是依賴於一個實體的「行動/操做/動做」。完成該最終功能的過程當中須要實現其餘中間功能(過程),則再去調用其它對象(或也多是本身自己)來實現該中間功能。
整個系統的完成(功能的實現)看做是一個一個對象在發揮其各自的「能力」並在內部進行協調有序的調用過程。
例子:完成來傳智「報名學習」這件事,能夠這樣來處理:學生對象:有姓名有照片,有所屬班級,能「提出報名」,能「繳費」,諮詢老師對象:能接收照片並登記姓名,能分配班級。班級對象:有班號,有開班日期,有教室。sql
面向對象基本概念:數據庫
類與對象:類是描述一類事物的一個總稱,是具備相同特徵特性的該類事物的一個通用名字(稱呼);好比人就是一個類(人類),狗也是一個類(狗類),它們又屬於一個更大的類(哺乳類),桌子,手機,書都是一個類;
對象是一個明確的具體的「物體」,是某個類中的一個「實物」(相對來講,類就是一種抽象的泛稱)。對象離不開類,或者說,對象必定隸屬於某個類——有類纔有對象,先有類再有對象。
好比「黃曉明」就是「人」這個類的一個具體對象,「阿黃」是「狗」這個類的一個具體對象。
一個類決定了一個對象所具備的全部特徵特性信息,好比我是人類,則我有:姓名,性別,年齡,我還能吃飯,走路,說話。
一個對象的全部特徵特性信息,都是由其所屬的類決定的,但每一個對象又頗有可能有本身不一樣的特徵特性信息,好比有個對象的名字叫吳六奇,性別男,會寫程序,另外一個對象可能叫章子怡,性別女,會演戲。
語法上,一個類內部能夠具備本身的「變量」和「函數」,但此時在技術術語上就對應地稱爲「屬性」和「方法」。一個類也能夠有本身的常量。這些屬性,方法和常量就都稱爲「類」的「成員」。
對象的建立:編程
就是由一個類「建立」出一個具體的「物體」——專業說法就是對象。建立對象的語法能夠有:
new 類名();
new 變量名(); //該變量的內容是一個表示類名的字符串。
new 對象名();//建立該對象所屬類的一個新對象
new self; //用於在類的方法內部建立一個該類對象。
類名::getNew();//定義類的一個靜態方法用於獲取該類的一個對象設計模式
對象的使用:數組
要麼使用其屬性,要麼使用其方法。使用屬性,就能夠看成一個變量看待。使用方法,就能夠看成一個函數看待。
一個類中能且只能包含以下3種成員(代碼):變量(稱爲屬性),函數(稱爲方法),常量(稱爲類常量)。
通常屬性:服務器
屬性就是定義在類中的變量,須要使用public或var來修飾(定義),也可使用protected或private來修飾(見後續知識)。
定義的時候能夠不賦值,也能夠賦(初)值,但只能是一個「直接值」(常量值)或常量,不能是變量值或計算值或函數調用返回值等。
屬性的使用形式:框架
對象名->屬性名;
屬性是可讀可寫的(可取值賦值)。
通常方法:
方法就是定義在類中的函數,但函數前可使用public,protected, private修飾,也能夠省略。
但該方法的調用(使用)不能獨立進行,而是須要經過對象來調用。
方法中$this關鍵字具備特定含義:表示調用該方法的對象。
獲取$this的所屬類:get_class($this)
靜態屬性:
一個僅僅隸屬於(依附於)類的屬性,其是經過類名直接來取用的。
定義形式:
static $靜態屬性名 [ = 初值];//訪問修飾符省略則默認爲public,初值也應該是直接值或常量
使用形式:類名::$靜態屬性名;//可取值可賦值;
靜態方法:
一個僅僅隸屬於(依附於)類的方法,其是經過類名直接調用的(不過新版php已經可使用該類的對象名來調用了)
定義形式:
[訪問修飾符] static function $靜態方法名(…){ …… }
使用形式:
類名::靜態方法名(…);其中類名也能夠用該類的對象名,一個內容爲該類名的字符串變量名,self等來代替。
self關鍵字:
用在方法中,表示該方法所在的類。
static關鍵字:
代替self關鍵字的位置,除了具備self做用外,還具備更靈活的做用,那就是所謂「後期靜態綁定」。注意:$this在靜態方法中不能使用,靜態方法中不該調用非靜態方法。
類常量:
一個僅僅隸屬於(依附於)類的常量,其是經過類名直接來取用的(不過新版php已經可使用該類的對象名來調用了)
定義形式:
const 常量名 = 初值;//必須賦初值
使用形式:
類名::常量名;其中類名也能夠用該類的對象名,一個內容爲該類名的字符串變量名,self等來代替。
構造方法(函數):
構造方法是一個類在進行實例化(new一個對象出來)的時候,會首先自動調用的方法。
構造方法適用於建立對象時(使用對象前)對該對象作一些初始化工做。
定義形式:[訪問修飾符] function __construct(...){ ...... };//訪問修飾符一般老是須要public(或省略)。
調用形式:實際上,沒有直接的調用形式,而是在new一個對象的時候就調用了:new C1("小花",18,"女");
若是一個類中定義了構造方法,則實例化該類時就會調用該方法,且實例化時的參數須要跟構造方法的參數匹配。
若是一個類中沒有定義構造方法,則會自動調用其父類的構造方法(若是有),則實例化時的參數需跟父類的構造方法的參數匹配。
也能夠在當前類的構造方法中調用父類的構造方法:parent::__construct();
析構方法(函數):
析構方法是在一個對象被銷燬的時候會自動調用(執行)的方法;對象銷燬的幾種狀況:
腳本程序運行結束,自動銷燬;
明確地unset()一個對象變量,則被銷燬;
改變對象變量的值,被銷燬;
析構方法適用於銷燬對象時對對象中使用的一些資源進行清理(銷燬)——不過實際上現代PHP已經內具了垃圾回收機制,通常無需清理。。
定義形式:function __destruct(){ ...... };//注意:只能是public的,且不能有參數
調用形式:無需在代碼中手工調用,而是在代碼運行結束時自動被調用(執行)。
若是一個類中定義了析構方法,則銷燬對象時就會調用該方法。
若是一個類中沒有定義析構方法,則銷燬對象時就會調用其父類的析構方法(若是有)
類的繼承:
基本含義:類是用來描述現實世界中同一種事物的共有特性的抽象模型。但現實世界中,不一樣種類的事物之間有每每有一些上下級或大小範圍的關係。好比,動物是一個「類」,具備某些特性。但脊椎動物也是一個類,也具備一些特性,且同時具備動物類的全部特性。哺乳動物仍是一個類,具備一些特性,並同時具備脊椎動物的全部特性。如此等等,則面向對象編程中,咱們定義的類也一樣能夠具備相似的關係特徵,這就是類的繼承。
**基本語法:**extends
**基本概念:**
**繼承:**一個類從另外一個已有的類得到其特性,稱爲繼承。
**派生:**從一個已有的類產生一個新的類,稱爲派生。
**父類/子類:**已有類爲父類,新建類爲子類。
**單繼承:**一個類只能從一個上級類繼承其特性信息。PHP和大多數面向對象的語言都是單繼承模式。C++是多繼承。
**擴展:**在子類中再來定義本身的一些新的特有的特性信息(屬性,方法和常量)。沒有擴展,繼承也就沒有意義了。
訪問控制修飾符:
public公共的:在全部位置均可訪問(使用)。
protected受保護的:只能再該類內部和該類的子類或父類中訪問(使用)。
private私有的:只能在該類內部訪問(使用)。
parent關鍵字:在類的內部用來表示(表明)該類的父類。能夠用來訪問父類的屬性或方法或常量。
構造和析構方法中的調用上級一樣方法的問題:
子類中沒有定義構造方法時,會自動調用父類的構造方法。所以實例化子類時,需按照父類的構造方法的形式進行。
子類定義了本身的構造方法,則不會自動調用父類的構造方法,但能夠手動調用:parent::__construct();
子類中沒有定義析構方法時,會自動調用父類的析構方法。
子類定義了本身的析構方法,則不會自動調用父類的析構方法,但能夠手動調用:parent::__destruct()
重寫override
**什麼是重寫?**重寫又叫「覆蓋」,就是將從父類繼承下來的屬性或方法從新定義。只有保護的或公有的屬性或方法可以被覆蓋。
**爲何要重寫?**由於父類的某個屬性可能對於子類來講不夠具體或詳細,子類想要一樣特性或功能的更準確或詳細信息。
**重寫的基本要求:**訪問控制權限,方法的參數形式。
**私有屬性和私有方法的重寫問題:**私有屬性和方法都不能覆蓋,但其實子類能夠定義跟父類私有的同名屬性或方法。只是看成一個自身的新的屬性或方法來看待而已。不過方法的參數必須一致。
**構造方法的重寫問題:**構造方法不但能夠像其餘普通方法同樣重寫,並且,比普通方法更寬鬆:重寫的時候參數能夠不一致。
**最終類final class:**
**最終方法final method:**
設計模式:
**工廠模式:**一種專門用於「生產」其餘各類類的對象的一個類
**單例模式:**一種只能從中實例化出來一個對象的類
類的「擴大化」技術:
**抽象類,抽象方法:**
一個類可使用關鍵字abstract聲明爲抽象類;抽象類是不能實例化的類,只用做其餘類的父類。
一個方法可使用關鍵字abstract聲明爲抽象方法;抽象方法只須要聲明方法頭,不須要大括號部分的方法體。
**一個類中有抽象方法,則該類必須聲明爲抽象類。**
子類繼承自一個抽象類,則子類必須實現父類中的全部抽象方法,除非子類也繼續做爲抽象類。
子類實現抽象父類的方法時,訪問控制修飾符的範圍不能下降,且方法的參數也須一致。
重載技術overloading:
**屬性重載:**__set(), __get(), __isset(), __unset()
**方法重載:**__call(), __callstatic();
接口interface:
**什麼是接口?
爲何須要接口?
接口的定義形式:**
**接口的實現:**使用接口被稱爲接口的「實現」(implements),其實就是相似「繼承」
**接口的多實現:
接口常量:
接口繼承:
有關類或對象的其餘相關技術:**
**類的自動加載:**__autoload(), spl_autoload_register();
**對象的複製(克隆):
對象的遍歷:
PHP內置標準類:
對象的類型轉換:** 將獲得一個標準類stdClass的對象
**對象轉換爲對象:**沒有變化;
**數組轉換爲對象**:數組的鍵名看成屬性名,值爲對應值;
**null轉換爲對象:**空對象;
**其餘標量數據轉換爲對象:**屬性名爲固定的「scalar」,值爲該變量的值
**類型約束:**能夠對函數(或方法)的參數設定必須使用的類型。只能對對象,接口,數組進行約束,以下所示:
function f1(類名 $p1){....}:要求該參數只能使用該類的對象;
function f1(接口名 $p1){....}:要求該參數只能使用實現該接口的對象;
function f1(array $p1){....}:要求該參數只能使用數組;
其餘的類型不能,好比:function f1(int $p1){...}, function f1(string $p1){...}都是錯的。
**與類有關的魔術常量:**__CLASS__, __METHOD__
**與類有關的其餘魔術方法:**
**已學過的魔術方法:**__construct, __destruct, __set(), __get(), __isset(), __unset(), __call(), __callstatic()
__sleep()和__wakeup(): 序列化操做的時候,會先調用__sleep()方法,反序列化操做的時候會先調用__wakeup()方法。
__tostring():將對象看成字符串來使用的時候,會自動調用該方法,以此來做爲對象轉換爲字符串的結果數據。
__invoke():將對象看成函數來使用的時候,會自動調用該方法。
*與類有關的系統函數:*class_exists(), interface_exists(), get_class(),get_parent_class(), get_class_methods(), get_class_vars(), get_declared_classes()
*與對象有關的系統函數:*is_object(),get_object_vars()
*與類有關的運算符:*new,instanceof
**面向對象編程思想的3個特徵:封裝,繼承,多態。**
MVC框架與應用:
項目開發流程介紹
顯示與邏輯相分離
原始作法:顯示與邏輯混合
高級作法:顯示與邏輯分離
實現方式:模板技術
MVC框架原理
MVC思想簡單演示1
數據生產文件
數據顯示文件
邏輯(功能)控制文件
MVC思想框架結構圖
MVC思想演示(常規帶數據庫操做)
視圖文件
模型文件
控制器文件
**模型層(Model)的典型實現**
功能:用於處理數據的存取操做,好比表的增刪改查。
模型層的典型代碼模式
控制器調用模型方法以獲取數據
基礎模型類
實現模型類的單例(模型工廠)
整個模型層的類庫結構圖
**控制器層(Controller)的典型實現**
控制器的做用
獲取請求數據
調用模型獲取數據
載入視圖文件以顯示數據
控制器類
功能:用於獲取用戶的請求數據並(或)獲取模型數據以顯示到視圖中
劃分:一般按應用的模塊(功能組)進行劃分,一個控制器對應一個模塊(頁面)的不一樣功能/操做。
區別:與模型層相比,模型層一般嚴格按照表來進行劃分,一個模型處理一個表的數據操做
動做:一般一個控制器是爲了完成一個模塊(頁面)上的一些相關操做(功能),每一個操做(功能)都對應一個控制器的動做(方法)。
基礎控制器類
用於將控制器功能中的一些常見操做集中處理,好比設定文檔編碼,實現頁面跳轉。
**視圖層(View)的典型實現**
功能:展現頁面的靜態內容,以及相關的變量數據。
數據分爲:普通標量數據,數組數據, 對象數據。
有關MVC項目的其餘常見作法
請求分發器
平臺的區分
目錄結構設定
基礎常量設定
自動加載的實現
禁止其餘目錄中文件的直接訪問
使用MVC框架模擬實現ECShop後臺登陸
數據庫的準備
文件結構分析
登陸流程分析
視圖所需相關文件(css,js,圖片等)
跳轉的實現
PDO:PHP數據對象:
PDO介紹:
鏈接MySQL數據庫:
DSN = "mysql:host=服務器地址/名稱;port=端口號;dbname=數據庫名";
Options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>’set names utf8’);
$pdo = new pdo(DSN, "用戶名", "密碼", Options);
執行sql語句
執行全部sql語句:query(sql)
執行無返回數據集的sql語句:exec(sql)
釋放資源:
$pdo = null;
$result->closecursor();
pdo對象的其餘常見操做
$pdo->lastInsertId();
$pdo->beginTransaction();
$pdo->commit()
$pdo->rollBack();
$pdo->inTransaction();
$pdo->setAttribute(屬性名,屬性值);
pdo的錯誤處理
錯誤模式:這是pdo的默認模式,能夠獲取pdo最後一次發生的錯誤信息。
$pdo->errorCode();
$pdo->errorInfo();
異常模式:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
PDOStatement(PDO結果集)對象
PDO結果集對象經常使用方法:
$stmt = $pdo->query(「select ...... 」);//這是得到結果集
$stmt->rowCount() ;
$stmt->columnCount() ;
$stmt->fetch( [返回類型] ); //返回類型經常使用的有:
PDO::FETCH_ASSOC:表示關聯數組
PDO::FETCH_NUM:表示索引數組
PDO::FETCH_BOTH:表示前兩者皆有,這是默認值
PDO::FETCH_OBJ:表示對象
$stmt->fetchAll([返回類型]);
$stmt->fetchColumn( [$i] );
$stmt->fetchObject();
$stmt->errorCode();
$stmt->errorInfo();
$stmt->closeCursor();
PDOStatement對象的預處理語句
語法一:$sql = "select * from tab1 where f1 = :val1 and f2 >:val2"; //命名參數形式
語法二:$sql = "select * from tab1 where f1 = ? and f2 >?"; //佔位符形式
預處理:$stmt = $pdo->prepare($sql);//也就是「編譯」該sql語句,這樣就能夠屢次反覆使用該語句
綁定值:$stmt->bindValue(命名參數或佔位符序號, 值,[類型]);
綁定變量:$stmt->bindParam(命名參數或佔位符序號, 變量,[類型]); //類型爲可選項,包括:
PDO::PARAM_BOOL,
PDO::PARAM_NULL,
PDO::PARAM_INT,
PDO::PARAM_STR,
PDO::PARAM_BLOB,
PARAM_INPUT_OUTPUT:表示參數是「可傳出值的」。
執行方式一:$stmt->excute(); //前提是前面進行的「綁定」操做
執行方式二:$stmt->excute(arry(":val1"=>值1,":val2"=>值2)); //對應命名參數形式
執行方式三:$stmt->excute(arry(值1,值2)); //對應占位符形式
異常:
**基本理解:**
錯誤:是程序出現問題時面向過程的處理方式,就是使用特定函數來捕獲(取得)錯誤信息並進行處理;
**異常:**是程序出現問題時面向對象的處理方式,就是使用特定語法來捕獲(取得)錯誤信息並進行處理。
基本使用形式:
異常的拋出(建立)
自定義異常類:
class myException extends Exception{
function __construct($message, $code = 0){
parent::__construct($message, $code);
}
}
將常見的錯誤轉換爲異常:
class ErrorException extends Exception {
function __construct($errMsg, $errCode, $errSeverity, $errFile, $errNo){}
}
set_error_handler("MyErrorHanler");
function MyErrorHandler($errCode, $errMsg, $errFile, $errLine{
throw new ErrorException($errMsg, $errCode, $errCode, $errFile, $errLine);
}*
---------------------