php一種面向對象的語言,那么什么是面向對象呢?


php一種面向對象的語言,那么什么是面向對象呢?

傳統的面向過程的編程思想:

相信很多人第一次接觸編程都是c語言,c語言就是非常典型的面向過程的編程語言,將要實現的功能描述為一個從開始到結束的連續的“步驟(過程)”。依次逐步完成這些步驟。如果步驟較大,又可以將該步驟再次細分為子步驟,以此類推。
程序從頭開始執行一直到結尾並得到所需結果。
例子:完成來傳智“報名學習”這件事,可以這樣來實現:
第一步,學生提出要報名,並提供姓名和照片
第二步,咨詢老師接收照片並登記學生姓名
第三步,學生繳費(付款到學校賬號)並獲得繳費憑證
第四步,咨詢老師驗證憑證並分配班級
第五步,最終結果為:報名完成,學生可以在規定的時間到規定的班級(教室)上課,數據庫中就有了該學生的信息。

現代的面向對象的編程思想:

將要實現的功能描述為一個“對象/物體”完成的任務——現實中也是如此:功能的實現都是依賴於一個實體的“行動/操作/動作”。完成該最終功能的過程中需要實現其他中間功能(過程),則再去調用其它對象(或也可能是自己本身)來實現該中間功能。
整個系統的完成(功能的實現)看作是一個一個對象在發揮其各自的“能力”並在內部進行協調有序的調用過程。
例子:完成來傳智“報名學習”這件事,可以這樣來處理:學生對象:有姓名有照片,有所屬班級,能“提出報名”,能“繳費”,咨詢老師對象:能接收照片並登記姓名,能分配班級。班級對象:有班號,有開班日期,有教室。

面向對象基本概念:

類與對象:類是描述一類事物的一個總稱,是具有相同特征特性的該類事物的一個通用名字(稱呼);比如人就是一個類(人類),狗也是一個類(狗類),它們又屬於一個更大的類(哺乳類),桌子,手機,書都是一個類;
對象是一個明確的具體的“物體”,是某個類中的一個“實物”(相對來說,類就是一種抽象的泛稱)。對象離不開類,或者說,對象一定隸屬於某個類——有類才有對象,先有類再有對象。
比如“黃曉明”就是“人”這個類的一個具體對象,“阿黃”是“狗”這個類的一個具體對象。
一個類決定了一個對象所具有的所有特征特性信息,比如我是人類,則我有:姓名,性別,年齡,我還能吃飯,走路,說話。
一個對象的所有特征特性信息,都是由其所屬的類決定的,但每個對象又很有可能有自己不同的特征特性信息,比如有個對象的名字叫吳六奇,性別男,會寫程序,另一個對象可能叫章子怡,性別女,會演戲。
語法上,一個類內部可以具有自己的“變量”和“函數”,但此時在技術術語上就對應地稱為“屬性”和“方法”。一個類也可以有自己的常量。這些屬性,方法和常量就都稱為“類”的“成員”。

對象的創建:

就是由一個類“創建”出一個具體的“物體”——專業說法就是對象。創建對象的語法可以有:
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);
}*
---------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM