PHP網站開發實例教程(第3版) 課件 第5-7章 PHP操作MySQL、PHP面向對象編程、PHP框架基礎(上)_第1頁
PHP網站開發實例教程(第3版) 課件 第5-7章 PHP操作MySQL、PHP面向對象編程、PHP框架基礎(上)_第2頁
PHP網站開發實例教程(第3版) 課件 第5-7章 PHP操作MySQL、PHP面向對象編程、PHP框架基礎(上)_第3頁
PHP網站開發實例教程(第3版) 課件 第5-7章 PHP操作MySQL、PHP面向對象編程、PHP框架基礎(上)_第4頁
PHP網站開發實例教程(第3版) 課件 第5-7章 PHP操作MySQL、PHP面向對象編程、PHP框架基礎(上)_第5頁
已閱讀5頁,還剩222頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章PHP操作MySQL《PHP網站開發實例教程(第3版)》學習目標/Target

掌握MySQL環境搭建方法,能夠獨立獲取、安裝、配置和啟動、登錄MySQL。

了解PHP中的數據庫擴展,能夠說出常用的數據庫擴展。

掌握MySQLi擴展的使用方法,能夠使用MySQLi擴展連接數據庫和操作數據。章節概述/Summary任何一門編程語言都需要對數據進行操作,實現數據的存儲和獲取,PHP也不例外。PHP所支持的數據庫類型較多,在這些數據庫中,MySQL一直被認為是PHP的最佳搭檔之一。本章將對PHP操作MySQL的相關內容進行詳細講解。目錄/Contents5.15.25.3MySQL環境搭建PHP中的數據庫擴展MySQLi擴展的使用MySQL環境搭建5.1

先定一個小目標!掌握MySQL的獲取,能夠獲取MySQL的安裝包。5.1.1獲取MySQLMySQL目前使用雙授權政策,它分為社區版和商業版。社區版包含最新功能,商業版只包含已穩定的功能。以社區版為例,講解如何獲取MySQL安裝包。5.1.1獲取MySQL5.1.1獲取MySQLMySQL官方網站首頁。通過瀏覽器訪問MySQL官方網站的首頁:STEP01進入MySQL下載頁面5.1.1獲取MySQLMySQL的下載頁面。展示了MySQL的相關產品,下載MySQLCommunity(GPL):STEP02進入MySQL社區版的下載頁面5.1.1獲取MySQLMySQL社區版下載頁面。提供MySQL社區版相關產品的下載:STEP03進入MySQL社區版服務器的下載頁面5.1.1獲取MySQLMySQL社區版服務器的下載頁面。MySQL社區版相關產品的下載:STEP04進入文件下載頁面5.1.1獲取MySQLMySQL社區版文件下載頁面。下載MySQL社區版。STEP05下載MySQL安裝包

先定一個小目標!掌握安裝MySQL的方法,能夠完成MySQL的安裝。5.1.2安裝MySQL1解壓安裝包,MySQL安裝目錄:5.1.2安裝MySQLbin目錄:放置一些可執行文件。docs目錄:放置文檔。include目錄:放置一些頭文件。lib目錄:放置一系列的庫文件。share目錄:存放字符集、語言等信息。LICENSE文件:介紹MySQL的授權信息。README文件:介紹MySQL的版權、相關文檔地址和下載地址等信息。找到命令提示符工具,選擇“以管理員身份運行”。在命令提示符窗口,切換到MySQL安裝目錄下的bin目錄。3安裝MySQL服務,服務名稱為MySQL80。42mysqld-installMySQL805.1.2安裝MySQL5.1.2安裝MySQLMySQL安裝成功后如需卸載,卸載命令如下:mysqld-removeMySQL服務名稱

先定一個小目標!5.1.3配置和啟動MySQL掌握配置和啟動MySQL的方法,能夠完成MySQL的配置和啟動。1.創建MySQL配置文件在C:\web\mysql8.0目錄下創建名稱為my.ini的配置文件,添加配置:[mysqld]basedir=C:/web/mysql8.0datadir=C:/web/mysql8.0/dataport=3306basedir:MySQL的安裝目錄datadir:MySQL數據庫文件的保存目錄port:MySQL客戶端連接服務器端時使用的端口號,默認33065.1.3配置和啟動MySQL2.初始化MySQL初始化數據庫,自動創建數據庫文件目錄。初始化MySQL時自動為默認用戶root生成隨機密碼,具體命令如下:mysqld--initialize--console--initialize表示初始化數據庫--console表示將初始化的過程在命令提示符窗口中顯示5.1.3配置和啟動MySQL3.啟動MySQL啟動名為MySQL80的服務,具體命令如下:netstartMySQL80netstart是Windows系統中用于啟動服務的命令MySQL80是安裝MySQL服務時自定義的服務名稱5.1.3配置和啟動MySQL如果想要停止名為MySQL80的服務,具體命令如下:netstopMySQL805.1.3配置和啟動MySQL

先定一個小目標!5.1.4登錄MySQL掌握登錄MySQL的命令,能夠正確登錄MySQL。在命令提示符窗口中登錄MySQL數據庫,具體命令如下:mysql-uroot-pmysql表示當前目錄(C:\web\mysql8.0\bin)下的mysql.exe-uroot表示以root用戶的身份登錄5.1.4登錄MySQL在Enterpassword:后輸入密碼登錄如果想要退出MySQL服務器,使用exit或quit命令為了保護數據庫的安全,為用戶設置密碼,將root用戶的密碼設置為123456:mysql>ALTER

USER

'root'@'localhost'

IDENTIFIED

BY

'123456';5.1.4登錄MySQL登錄MySQL后,查看數據庫中現有的數據庫:SHOWDATABASES;information_schema:存儲數據庫和數據表的結構信息。mysql:存儲MySQL自身需要使用的控制和管理信息,如用戶的權限。performance_schema:存儲系統性能相關的動態參數,如全局變量。sys:系統數據庫,包括存儲過程、自定義函數等信息。5.1.4登錄MySQL注意:初學者不要隨意刪除或修改MySQL自動創建的數據庫,避免造成服務器故障。5.1.4登錄MySQLPHP中的數據庫擴展5.2

先定一個小目標!了解PHP中的數據庫擴展,能夠說出常用的數據庫擴展。5.2PHP中的數據庫擴展MySQLi擴展是專門用于與MySQL數據庫交互的擴展,它是MySQL擴展的增強版,不僅包含所有MySQL擴展的功能函數,還可以使用MySQL新版本中的高級特性。例如,多語言執行和事務的執行,采用預處理方式解決SQL注入問題等。MySQLi擴展PDO擴展PDO提供了一個統一的API,只要修改其中的數據來源名稱,就可以實現PHP與不同類型數據庫服務器之間的交互。PDO擴展解決了不同數據庫擴展的API互不兼容的問題,提高了程序的可維護性和可移植性。5.2PHP中的數據庫擴展MySQLi擴展的使用5.3

先定一個小目標!了解MySQLi擴展的開啟,能夠在配置文件中開啟MySQLi擴展。5.3.1開啟MySQLi擴展在php.ini中找到“;extension=mysqli”配置項,去掉前面的分號開啟MySQLi擴展。修改后的配置代碼如下:extension=mysqli5.3.1開啟MySQLi擴展

先定一個小目標!了解MySQLi擴展中的函數,能夠說出常用的MySQLi擴展函數。5.3.2MySQLi擴展的常用函數MySQLi擴展內置了用于實現連接數據庫、設置字符集、獲取結果集中的信息等功能的函數。MySQLi擴展的常用函數:函數描述mysqli_connect(string$hostname,string$username,string$password,string$database,int$port,string$socket)連接數據庫,成功返回連接對象,失敗返回falsemysqli_connect_error()獲取連接時的錯誤信息,返回錯誤描述字符串mysqli_select_db(mysqli$mysql,string$database)選擇數據庫,若成功返回true,失敗返回falsemysqli_set_charset(mysqli$mysql,string$charset)設置客戶端字符集,成功返回true,失敗返回falsemysqli_query(mysqli$mysql,string$query)執行數據庫查詢,寫操作返回true,讀操作返回結果集對象,失敗返回falsemysqli_insert_id(mysqli$mysql)獲取上一次插入操作產生的idmysqli_affected_rows(mysqli$mysql)獲取上一次操作受影響的行數mysqli_num_rows(mysqli_result$result)獲取結果中的行數1/25.3.2MySQLi擴展的常用函數MySQLi擴展的常用函數:函數描述mysqli_fetch_assoc(mysqli_result$result)獲取一行結果并以關聯數組返回mysqli_fetch_row(mysqli_result$result)獲取一行結果并以索引數組返回mysqli_fetch_all(mysqli_result$result,int$mode)獲取所有的結果,并以數組方式返回mysqli_fetch_array(mysqli_result$result,int$mode)從結果集中獲取一行作為索引數組或關聯數組mysqli_free_result(mysqli_result$result)釋放結果集mysqli_errno(mysqli$mysql)返回最近函數的錯誤編號mysqli_error(mysqli$mysql)返回最近函數的錯誤信息mysqli_report(int$flags)開啟或禁用MySQL內部錯誤報告mysqli_close(mysqli$mysql)關閉數據庫連接2/25.3.2MySQLi擴展的常用函數

先定一個小目標!掌握使用MySQLi擴展操作數據庫的步驟,能夠在程序中使用MySQLi擴展操作數據庫。5.3.3使用MySQLi擴展操作數據庫5.3.3使用MySQLi擴展操作數據庫使用MySQLi擴展連接數據庫的4個步驟連接數據庫關閉數據庫連接錯誤處理設置字符集1.連接數據庫使用MySQLi擴展操作數據前,需要使用mysqli_connect()函數連接數據庫。5.3.3使用MySQLi擴展操作數據庫語法格式mysqli_connect(stringhostname, //主機名或IP地址stringusername, //用戶名stringpassword, //密碼stringdbname, //數據庫名intport, //端口號stringsocket //socket通信(適用于Linux環境))使用MySQLi擴展連接數據庫:5.3.3使用MySQLi擴展操作數據庫<?php//連接數據庫$link=mysqli_connect('localhost','root','123456','mydb','3306');//查看連接結果echo$link?'數據庫連接成功':'數據庫連接失敗';如果將函數的密碼參數修改為“123”,由于密碼是錯誤的,數據庫會連接失敗,提示信息:5.3.3使用MySQLi擴展操作數據庫2.錯誤處理使用mysqli_connect_error()函數獲取錯誤信息:5.3.3使用MySQLi擴展操作數據庫<?phpmysqli_report(MYSQLI_REPORT_OFF); //關閉錯誤報告//連接數據庫$link=@mysqli_connect('localhost','root','123','mydb');//輸出連接失敗時的錯誤信息if(!$link){exit('mysqliconnectionerror:'.mysqli_connect_error());}3.設置字符集數據庫連接成功后,還需要設置客戶端字符集,以確保PHP與MySQL使用相同的字符集。使用mysqli_set_charset()函數設置字符集:5.3.3使用MySQLi擴展操作數據庫語法格式mysqli_set_charset(mysqli$mysql,string$charset)$mysql表示數據庫連接對象$charset是要設置的字符集設置成功返回true,設置失敗返回false使用mysqli_set_charset()函數設置字符集:5.3.3使用MySQLi擴展操作數據庫if(!mysqli_set_charset($link,'utf8mb4')){exit(mysqli_error($link));}注意:為了避免中文亂碼問題,需要保證PHP腳本文件、Web服務器返回的編碼、網頁的<meta>標簽、PHP訪問MySQL使用的字符集是統一的。5.3.3使用MySQLi擴展操作數據庫4.關閉數據庫連接當不需要使用數據庫連接時,需要關閉數據庫連接。使用mysqli_close()函數關閉數據庫連接:5.3.3使用MySQLi擴展操作數據庫語法格式mysqli_close(mysqli$mysql)使用mysqli_close()函數關閉數據庫連接:示例代碼mysqli_close($link);

先定一個小目標!掌握使用MySQLi擴展操作數據的步驟,能夠在程序中使用MySQLi擴展操作數據。5.3.4使用MySQLi擴展操作數據使用MySQLi擴展操作數據新增數據查詢數據更新數據刪除數據5.3.4使用MySQLi擴展操作數據1.新增數據使用MySQLi擴展新增數據的代碼://新增數據的SQL語句$query='INSERTINTO`student`VALUES(NULL,\'Bob\',20)';//執行新增操作$result=mysqli_query($link,$query);if(!$result){exit(mysqli_error($link));}echo'新增數據的id值:'.mysqli_insert_id($link);//獲取自增id5.3.4使用MySQLi擴展操作數據2.更新數據使用MySQLi擴展更新數據的代碼://更新數據的SQL語句$query='UPDATE`student`SET`age`=21WHERE`id`=5';//執行更新操作$result=mysqli_query($link,$query);if(!$result){exit(mysqli_error($link));}//返回結果echomysqli_affected_rows($link);5.3.4使用MySQLi擴展操作數據3.刪除數據使用MySQLi擴展刪除數據的代碼://刪除數據的SQL語句$query='DELETEFROM`student`WHERE`id`=5';//執行刪除操作$result=mysqli_query($link,$query);if(!$result){exit(mysqli_error($link));}//返回結果echomysqli_affected_rows($link);//關閉連接mysqli_close($link);5.3.4使用MySQLi擴展操作數據4.查詢數據使用MySQLi擴展查詢數據的代碼://查詢數據的SQL語句$query='SELECT*FROM`student`';//執行查詢操作$result=mysqli_query($link,$query);if(!$result){exit(mysqli_error($link));}//處理結果集$lists=[];while($row=mysqli_fetch_assoc($result)){$lists[]=$row;}//釋放結果集資源mysqli_free_result($result);5.3.4使用MySQLi擴展操作數據4.查詢數據將查詢結果在頁面中展示:echo'<table><tr><th>id</th><th>姓名</th><th>年齡</th></tr>';foreach($listsas$val){echo"<tr><td>{$val['id']}</td><td>{$val['name']}</td><td>{$val['age']}</td></tr>";}echo'</table>';5.3.4使用MySQLi擴展操作數據通過mysqli_fetch_all()函數一次查詢出所有記錄://一次查詢所有記錄$data=mysqli_fetch_all($result,MYSQLI_ASSOC);//輸出查詢結果var_dump($data);5.3.4使用MySQLi擴展操作數據本章小結本章首先講解了MySQL的獲取、安裝、配置和啟動、登錄,然后介紹了PHP中的數據庫擴展,最后講解了MySQLi擴展的使用方法。通過對本章內容的學習,讀者應能夠熟練運用PHP操作MySQL數據庫。本章小結第6章PHP面向對象編程《PHP網站開發實例教程(第3版)》學習目標/Target

了解面向對象的概念,能夠說出面向過程和面向對象的區別、類與對象的概念以及

面向對象的三大特征。

掌握類的定義和實例化,能夠定義類和實例化類。

掌握類成員的定義,能夠在類中定義類成員。

掌握對象的克隆方法,能夠根據需求克隆對象。

掌握訪問控制修飾符的使用方法,能夠正確使用訪問控制修飾符。學習目標/Target

掌握類中$this的使用方法,能夠在類中使用$this訪問實例成員。

掌握構造方法和析構方法的語法,能夠使用這兩個方法完成對象的初始化和銷毀。

掌握類常量和靜態成員的使用方法,能夠在類中定義類常量和靜態成員。

掌握繼承的使用方法,能夠實現類的繼承和有限繼承。

掌握重寫的使用方法,能夠實現對類成員的重寫。學習目標/Target

掌握靜態延遲綁定,能夠根據需求訪問靜態類成員。

掌握final關鍵字的使用方法,能夠使用final關鍵字定義最終類和類成員。

掌握抽象類的使用方法,能夠根據實際需求使用抽象類。

掌握接口的實現方法,能夠定義和實現接口。

掌握接口的繼承方法,能夠根據實際需求使用接口繼承。章節概述/Summary隨著PHP的不斷發展,PHP對面向對象編程的支持也越來越完善,使得PHP能夠處理更多復雜的需求。對PHP開發人員來說,PHP面向對象編程是必備的重要技能之一。本章將對PHP面向對象編程進行詳細講解。目錄/Contents6.16.26.3初識面向對象類與對象的使用類常量和靜態成員目錄/Contents6.46.56.6繼承抽象類接口初識面向對象6.1

先定一個小目標!了解面向對象的概念,能夠說出面向過程和面向對象的區別。6.1.1面向過程與面向對象的區別6.1.1面向過程與面向對象的區別面向過程是指將要實現的功能分解成具體的步驟,通過函數依次實現這些步驟,使用時按規定好的順序調用函數即可。面向過程面向對象面向對象則是一種更符合人類思維習慣的編程思想,它分析現實生活中不同事物的各種形態,在程序中使用對象來映射現實中的事物,是對現實世界的抽象。6.1.1面向過程與面向對象的區別使用學生對象示例代碼面向對象示例代碼//獲取學生對象的name屬性echo$student->name;//調用學生對象的sayHello()方法$student->sayHello();//老師布置作業$work=$teacher->createWork();//學生做作業$result=$student->doWork($work);//老師批改作業$score=$teacher->check($result);//輸出學生的作業成績echo$student->name.'的考試成績為:'.$score;主要側重于用什么對象解決什么問題每一個對象中都包含了若干屬性和方法,代碼的可讀性強,更容易維護

先定一個小目標!了解面向對象中的類與對象,能夠說出什么是類和對象。6.1.2面向對象中的類與對象面向對象思想力圖使程序對事物的描述與該事物在現實中的形態一致,為了做到這一點,面向對象思想提出了類和對象的概念:類(class):是對某一類事物的抽象描述,類中包含該類事物的一些基本特征。對象(object):用于表示現實中該事物的個體。對象是根據類創建的,類是對象的模板,通過一個類可以創建多個對象。6.1.2面向對象中的類與對象類與對象的關系:6.1.2面向對象中的類與對象

先定一個小目標!了解面向對象的特征,能夠說出面向對象的三大特征。6.1.3面向對象的三大特征封裝面向對象三大特征面向對象的核心思想,將對象的一部分屬性和方法封裝,對外提供可以操作的接口。封裝的優勢是使對象的使用者不必研究對象的內部原理,即可使用對象提供的功能。繼承繼承是實現代碼復用的重要特性。繼承描述了類與類之間的關系,將類分為父類和子類,子類通過繼承可以直接使用父類的成員。繼承的優勢是提高程序開發效率,為程序的修改補充提供了便利。多態多態是指同名操作可作用于多種類型的對象上并獲取不同結果。多態的優勢是讓不同的對象擁有相同的操作接口,降低使用者的學習成本。6.1.3面向對象的三大特征類與對象的使用6.2

先定一個小目標!掌握類的定義和實例化,能夠定義類和實例化類。6.2.1類的定義和實例化類由class關鍵字、類名和類成員組成。語法格式class類名{

類成員}6.2.1類的定義和實例化若想要使用類的功能,還需要根據類創建對象,這個操作稱為類的實例化。通過類的實例化創建的對象稱為類的實例,使用new關鍵字創建類的實例。語法格式$對象名=new類名([參數1,參數2,…]);6.2.1類的定義和實例化演示定義類和實例化類:classPerson

//定義Person類{}$person=newPerson(); //實例化Person類var_dump($person); //輸出結果:object(Person)#1(1){}6.2.1類的定義和實例化多學一招:instanceof運算符instanceof運算符instanceof運算符可以判斷對象是否是某個類的實例,具體語法格式如下:$對象名instanceof類名instanceof左側是某個類的實例,右側是類名。如果判斷成立,判斷結果為true,否則判斷結果為false。對于一個子類對象,如果instanceof右側是父類,判斷結果也為true。多學一招:instanceof運算符instanceof運算符演示instanceof運算符的使用:classOther //定義Other類{}classPerson //定義Person類{}$person=newPerson();var_dump($personinstanceofPerson); //輸出結果:bool(true)var_dump($personinstanceofOther); //輸出結果:bool(false)

先定一個小目標!掌握類成員的定義,能夠在類中定義類成員。6.2.2類成員類成員定義在類名后的“{}”中。類成員包括屬性和方法。屬性類似變量,描述對象的特征,如人的姓名、年齡。方法類似函數,描述對象的行為,如說話、走路。6.2.2類成員在類中定義類成員的語法格式:語法格式class類名{

訪問控制修飾符$屬性名=值; //定義屬性訪問控制修飾符function方法名([參數1,參數2,…]) //定義方法

{

方法體

}}6.2.2類成員定義類成員后,在創建類的對象時,程序會依據類成員創建對象成員。對象成員又稱為實例成員,使用對象成員訪問符“->”可以訪問對象成員。語法格式$對象名->屬性名; //訪問屬性$對象名->方法名(); //訪問方法(調用方法)6.2.2類成員演示類成員的使用:classPerson{

public$name='未命名';

//定義屬性

publicfunctionspeak()

//定義方法

{

echo'Thepersonisspeaking.';

}}$person=newPerson(); //實例化Person類echo$person->name;

//獲取屬性值,輸出結果:未命名$person->name='張三'; //修改屬性的值echo$person->name; //獲取屬性值,輸出結果:張三$person->speak();

//輸出結果:Thepersonisspeaking.6.2.2類成員多學一招:可變類與類成員可變類與可變類成員使用可變類或可變類成員時,對象成員訪問符號->后面跟$變量名稱。定義可變類和可變類成員的示例代碼:<?phpclassCalculate{public$width=10;public$height=20;publicfunctiongetArea(){return$this->width*$this->height;}}$classname='Calculate';$obj=new$classname(); //實例化Calculate類$width='width';echo'寬='.$obj->$width; //訪問width屬性$height='height';echo'高='.$obj->$height; //訪問height屬性$area='getArea';echo'面積='.$obj->$area(); //調用getArea()方法

先定一個小目標!掌握對象的克隆,能夠根據需求實現克隆對象。6.2.3對象的克隆當一個變量的值為對象時,如果將這個變量賦值給另一個變量,則此過程并不會創建對象的副本,而是使兩個變量引用同一個對象。如果想要獲取多個相同的對象,并且某一個對象的成員發生改變時不影響其他對象的成員,可以通過對象的克隆來實現。6.2.3對象的克隆對象的克隆使用clone關鍵字:語法格式$對象名2=clone$對象名1;6.2.3對象的克隆對比對象變量賦值和對象克隆的區別:示例代碼classPerson{public$age=1;}$object1=newPerson();$object2=$object1;$object1->age=10;var_dump($object1->age);//輸出結果:int(10)var_dump($object2->age);//輸出結果:int(10)6.2.3對象的克隆示例代碼classPerson{public$age=1;}$object1=newPerson();$object2=clone$object1;$object1->age=10;var_dump($object1->age);//輸出結果:int(10)var_dump($object2->age);//輸出結果:int(1)多學一招:魔術方法魔術方法魔術方法不需要手動調用,它會在某一刻自動執行,使用魔術方法可以為程序的開發帶來極大便利。常見的魔術方法:魔術方法描述__get()當調用一個未定義或無權訪問的屬性時自動調用此方法__set()給一個未定義或無權訪問的屬性賦值時自動調用此方法__isset()當在一個未定義或無權訪問的屬性上執行isset()操作時調用此方法__unset()當在一個未定義或無權訪問的屬性上執行unset()操作時調用此方法__construct()構造方法,當對象被創建時調用此方法__destruct()析構方法,在對象被銷毀前(即從內存中清除前)調用此方法1/2多學一招:魔術方法魔術方法魔術方法不需要手動調用,它會在某一刻自動執行,使用魔術方法可以為程序的開發帶來極大便利。常見的魔術方法:魔術方法描述__toString()當一個類被當成字符串時調用此方法__invoke()以調用函數的方式調用對象時會調用此方法__sleep()可用于清理對象,在序列化前執行__wakeup()用于預先準備對象需要的資源,在反序列化前執行__call()在對象中調用一個不可訪問的方法時會被調用__callstatic()靜態上下文中調用一個不可訪問的方法時會被調用,該方法需要定義為靜態方法2/2多學一招:魔術方法魔術方法在Person類中使用__clone()魔術方法:classPerson{

publicfunction__clone(){echo'__clone()方法被執行了';}}

先定一個小目標!掌握訪問控制修飾符的使用,能夠正確使用訪問控制修飾符。6.2.4訪問控制修飾符訪問控制修飾符用于控制類成員是否允許被外界訪問。訪問控制修飾符有3個:public(公有修飾符)protected(保護成員修飾符)private(私有修飾符)6.2.4訪問控制修飾符訪問控制修飾符的作用范圍:6.2.4訪問控制修飾符訪問控制修飾符同一個類內子類類外public允許訪問允許訪問允許訪問protected允許訪問允許訪問不允許訪問private允許訪問不允許訪問不允許訪問演示訪問控制修飾符的使用方法:6.2.4訪問控制修飾符classUser{

public$name='張三'; //姓名

protected$phone='123456';

//電話

private$money='5000'; //存款}$user=newUser();echo$user->name; //輸出結果:張三echo$user->phone; //報錯echo$user->money; //報錯注意:在定義類時,屬性必須有訪問控制修飾符,否則會報錯;方法如果沒有指定訪問控制修飾符,默認為public。6.2.4訪問控制修飾符

先定一個小目標!掌握類中的$this的使用,能夠在類中使用$this訪問實例成員。6.2.5類中的$this訪問實例成員時,應使用類實例化后的對象訪問。如果想在類的方法中訪問實例成員,則可以使用特殊變量$this實現,$this代表當前對象。6.2.5類中的$this通過代碼驗證$this是否代表當前對象:classUser{publicfunctioncheck($user){return$this===$user;}}$user=newUser();var_dump($user->check($user)); //輸出結果:bool(true)輸出結果true表示$this就是當前對象。6.2.5類中的$this演示$this的使用方法:classUser{public$name='張三'; //姓名

protected$phone='123456'; //電話

private$money='5000'; //存款

publicfunctiongetAll(){

echo$this->name,'';echo$this->phone,'';echo$this->money,'';}}$user=newUser();$user->getAll(); //輸出結果:張三12345650006.2.5類中的$this

先定一個小目標!掌握構造方法的語法,能夠使用構造方法完成對象的初始化。6.2.6構造方法構造方法是一種特殊的方法,用于在創建對象時進行初始化操作,例如為對象的屬性進行賦值、設定默認值等,構造方法在創建對象時自動調用,無須手動調用。每個類都有一個構造方法,如果沒有顯式定義構造方法,PHP會自動生成一個沒有參數且沒有任何操作的默認構造方法,如果顯式定義構造方法,默認構造方法將不存在。6.2.6構造方法定義構造方法的語法格式:語法格式訪問控制修飾符function__construct([參數1,參數2,…]){

方法體}構造方法的訪問控制修飾符默認是public6.2.6構造方法演示構造方法的使用方法:classUser{public$name;

publicfunction__construct($name='user'){$this->name=$name;}}$obj1=newUser();$obj2=newUser('Tom');echo$obj1->name;//輸出結果:userecho$obj2->name;//輸出結果:Tom6.2.6構造方法

先定一個小目標!掌握析構方法的語法,能夠使用析構方法完成對象的銷毀。6.2.7析構方法析構方法在對象被銷毀之前自動調用,執行一些指定功能或操作。例如,關閉文件、釋放結果集等。在使用unset()釋放對象或者PHP腳本運行結束自動釋放對象時,析構方法會自動調用。6.2.7析構方法定義析構方法的語法格式:語法格式訪問控制修飾符function__destruct([參數1,參數2,…]){

方法體}6.2.7析構方法演示析構方法的使用:classUser{

publicfunction__destruct()

{

echo'執行了析構方法';

}}$obj=newUser();unset($obj);//輸出結果:執行了析構方法6.2.7析構方法類常量和靜態成員6.3

先定一個小目標!掌握類常量的使用,能夠在類中定義類常量。6.3.1類常量類常量可以在類中保存一些不變的值。在類中使用const關鍵字可以定義類常量:語法格式訪問控制修飾符const類常量名稱='常量值';6.3.1類常量通過范圍解析操作符“::”訪問類常量:語法格式類名::類常量名稱在類中定義類常量并通過類訪問類常量:classStudent{

constSCHOOL='某學校';

//定義類常量}echoStudent::SCHOOL; //訪問類常量6.3.1類常量

先定一個小目標!掌握靜態成員的使用,能夠在類中定義靜態成員。6.3.2靜態成員如果想讓類中某個成員只保存一份,并且可以通過類直接訪問,可以將成員定義為靜態成員。靜態成員包括靜態屬性和靜態方法。靜態成員使用static關鍵字修飾。語法格式publicstatic$屬性名; //定義靜態屬性publicstatic方法名(){} //定義靜態方法6.3.2靜態成員在類外訪問靜態成員時,不需要創建對象,直接通過類名訪問即可:在類外訪問靜態成員類名::$屬性名; //訪問靜態屬性類名::方法名(); //訪問靜態方法(調用靜態方法)6.3.2靜態成員在類內訪問靜態成員時,self和static關鍵字在類的內部代替類名,當類名發生變化時,不需要修改類的內部代碼。6.3.2靜態成員在類內訪問靜態成員self::$屬性名; //使用self訪問靜態屬性self::方法名(); //使用self訪問靜態方法(調用靜態方法)static::$屬性名; //使用static訪問靜態屬性static::方法名(); //使用static訪問靜態方法(調用靜態方法)演示靜態成員的定義和訪問:classStudent{

publicstatic$age='18';

publicstaticfunctionshow(){

echoself::$age;

//在類內使用self關鍵字訪問靜態屬性

echostatic::$age; //在類內使用static關鍵字訪問靜態屬性

}}echoStudent::$age;

//在類外訪問靜態屬性Student::show(); //在類外訪問靜態方法6.3.2靜態成員腳下留心:使用“::”和“->”訪問類成員時的區別使用“::”和“->”訪問類成員時的區別在使用“::”和“->”訪問類成員時,需要注意如下內容:當“::”左側是類名、self或static時,可以訪問靜態屬性和靜態方法,不能訪問非靜態屬性和非靜態方法。當“::”左側是$this或$對象名時,可以訪問靜態屬性和靜態方法,不能訪問非靜態屬性和非靜態方法。當“->”左側是$this或$對象名時,可以訪問非靜態屬性、非靜態方法和靜態方法,不能訪問靜態屬性。繼承6.4

先定一個小目標!掌握繼承的使用,能夠實現類的繼承。6.4.1繼承的實現在PHP中,類的繼承是指在一個現有類的基礎上構建一個新的類,構建出來的新類被稱作子類或派生類,現有類被稱作父類或基類,子類自動擁有父類所有可繼承的屬性和方法。當子類和父類有同名的類成員時,子類的成員會覆蓋父類的成員。6.4.1繼承的實現6.4.1繼承的實現語法格式class子類名extends

父類名{}使用extends關鍵字實現子類與父類之間的繼承://定義子類Man類,繼承People類classManextendsPeople{publicfunction__construct($name){$this->name=$name;}}$man=newMan('Tom');echo$man->name;

//輸出結果:Tom$man->say();

//輸出結果:Tomisspeaking6.4.1繼承的實現//定義父類People類classPeople{public$name;publicfunctionsay(){echo$this->name.'isspeaking';}}演示繼承的實現:

先定一個小目標!掌握繼承的使用,能夠實現有限繼承。6.4.2有限繼承有限繼承是指子類繼承父類時,受訪問控制修飾符的限制,不能繼承父類所有的內容,而是繼承父類的部分內容。有限繼承的內容:6.4.2有限繼承訪問控制修飾符屬性方法public可以繼承可以繼承protected可以繼承可以繼承private可以繼承不能繼承演示有限繼承,定義People類:classPeople{

public$name='Tom'; //公有屬性

protected$age='20'; //受保護屬性

private$money='5000'; //私有屬性

publicfunctionshowName()

{

//公有方法echo$this->name;}

protectedfunctionshowAge(){ //受保護方法

echo$this->age;}

privatefunctionshowMoney(){ //私有方法

echo$this->money;}}6.4.2有限繼承定義Man類繼承People類:classManextendsPeople{publicfunctiongetProtected(){echo$this->showAge();}publicfunctiongetPrivate(){echo$this->money;$this->showMoney();}}6.4.2有限繼承實例化Man類:$man=newMan();var_dump($man);輸出結果:object(Man)#1(3){["name"]=>string(3)"Tom"["age":protected]=>string(2)"20"["money":"People":private]=>string(4)"5000"}6.4.2有限繼承通過Man類對象調用公有方法showName()、受保護方法getProtected()和私有方法getPrivate():$man->showName(); //輸出結果:Tom$man->getProtected(); //輸出結果:20$man->getPrivate(); //報錯私有屬性可以被繼承,但是無法在子類內部訪問,私有方法不能被繼承6.4.2有限繼承

先定一個小目標!掌握重寫的使用,能夠實現對類成員的重寫。6.4.3重寫重寫是指在子類中重寫父類的同名成員。重寫父類的屬性時,子類的屬性會直接覆蓋父類的屬性,父類的屬性將不存在。重寫父類的方法時,子類的方法和父類的方法同時存在,重寫的方法必須和父類的方法訪問權限一致或更加開放。通過重寫父類的方法可以實現擴展或修改業務邏輯的目的。6.4.3重寫演示重寫的使用方法,定義People類:classPeople{public$name='People';publicfunctionshow(){echo__CLASS__;}publicfunctionsay(){echo__CLASS__.'say';}}6.4.3重寫定義Man類繼承People類:classManextendsPeople{public$name='Man';publicfunctionshow(){echo__CLASS__;}publicfunctionsay(){echo__CLASS__.'say';}}6.4.3重寫實例化Man類,調用show()方法和say()方法:$man=newMan();var_dump($man); //object(Man)#1(1){["name"]=>string(3)"Man"}$man->show(); //Man$man->say(); //Mansay6.4.3重寫如果將Man類中say()方法的訪問控制修飾符修改為protected,再次運行程序時會報錯:Fatalerror:AccessleveltoMan::say()mustbepublic(asinclassPeople)in…多學一招:parent關鍵字parent關鍵字子類重寫父類的方法后,如果想繼續使用父類的方法,可以使用parent關鍵字配合范圍解析操作符調用父類方法。語法格式parent::父類方法();多學一招:parent關鍵字parent關鍵字在子類中調用父類方法:示例代碼<?phpclassManextendsPeople{publicfunctionshow(){

parent::show();}}

先定一個小目標!掌握靜態延遲綁定,能夠根據需求訪問靜態類成員。6.4.4靜態延遲綁定類可以自下而上調用父類方法,如果需要在父類中根據不同的子類調用子類的方法,那么就需要靜態延遲綁定。所謂靜態延遲綁定,就是在訪問靜態成員時,訪問實際運行的類的靜態成員,而不是訪問原本定義的類的靜態成員。靜態綁定使用self關鍵字來實現,靜態延遲綁定使用static關鍵字來實現,只適用于對靜態屬性和靜態方法進行延遲綁定。6.4.4靜態延遲綁定靜態延遲綁定的示例代碼:classPeople{publicstatic$name='People';publicstaticfunctionshowName(){

echoself::$name; //靜態綁定

echostatic::$name; //靜態延遲綁定

}}classManextendsPeople{publicstatic$name='Man';}People::showName();

//輸出結果:PeoplePeopleMan::showName();

//輸出結果:PeopleMan6.4.4靜態延遲綁定

先定一個小目標!掌握final關鍵字的使用,能夠使用final關鍵字定義最終類和類成員。6.4.5final關鍵字在類成員前面添加final關鍵字,表示這些內容不能被修改。6.4.5final關鍵字語法格式finalclass類名

//最終類{final

publicconst常量名=常量值; //最終常量

finalpublicfunction方法名(){} //最終方法}使用final關鍵字修飾的類不能被繼承,只能被實例化,這樣的類被稱為最終類。使用final關鍵字修飾的常量,表示該類的子類不能重寫這個常量,這樣的常量被稱為最終常量。使用final關鍵字修飾的方法,表示該類的子類不能重寫這個方法,這樣的方法被稱為最終方法。演示final關鍵字的使用:classPerson{finalpublicconstAGE=18; //最終常量

finalpublicfunctionshow() //最終方法

{}}classStudentextendsPerson{publicconstAGE=20; //報錯

publicfunctionshow() //報錯

{}}6.4.5final關鍵字不能重寫Person類的最終常量不能重寫Person類的最終方法抽象類6.5

先定一個小目標!掌握抽象類的使用,能夠根據實際需求使用抽象類。6.5抽象類抽象類是一種特殊的類,用于定義某種行為,具體的實現需要子類完成。例如,完成跑步有多種方式,如基礎跑、長距離跑、減速跑等。此時,可以定義跑步類為抽象類,將基礎跑這些實現方式定義為抽象方法。6.5抽象類使用abstract關鍵字定義抽象類和抽象方法。語法格式abstractclass類名

//定義抽象類{

abstractpublicfunction方法名(); //定義抽象方法}6.5抽象類使用abstract修飾類或方法時還應注意以下6點:①抽象方法是特殊的方法,只有方法定義,沒有方法體。②含有抽象方法的類必須被定義成抽象類。③抽象類中可以有非抽象方法、屬性和常量。④抽象類不能被實例化,只能被繼承。⑤子類實現抽象類中的抽象方法時,訪問控制修飾符必須與抽象類中的一致或者更寬松。⑥子類繼承抽象類時必須實現抽象方法,否則也必須定義成抽象類,由下一個繼承類實現。6.5抽象類演示抽象類和抽象方法的使用:abstractclassHuman{abstractprotectedfunctioneat();}abstractclassManextendsHuman{}classBoyextendsMan{publicfunctioneat(){echo'eat';}}6.5抽象類接口6.6

先定一個小目標!掌握接口的實現,能夠定義和實現接口。6.6.1接口的實現接口用于指定某個類必須實現的功能,接口通過interface關鍵字來定義。在接口中,所有的方法只能是公有的,不能使用final關鍵字修飾。語法格式interface接口名{const常量名=''; //接口常量

publicfunction方法名(); //接口方法}6.6.1接口的實現接口的方法體沒有具體實現,需要通過某個類使用implements關鍵字來實現接口。語法格式class類名implements

接口名{}6.6.1接口的實現演示接口的定義和實現:interfaceHuman{constNAME=''; //接口常量

publicfunctioneat(); //接口方法}classManimplementsHuman{publicfunctioneat() //實現接口方法

{}}6.6.1接口的實現

先定一個小目標!掌握接口的繼承,能夠根據實際需求使用接口繼承。6.6.2接口的繼承接口可以被繼承,從而實現接口的成員擴展。類只能繼承一個父類,也就是單繼承,接口可以實現多繼承,一次繼承多個接口,使用逗號分隔多個接口。語法格式interfaceA{}interfaceB{}//接口繼承interfaceCextendsA{}//接口多繼承interfaceDextends

A,B{}6.6.2接口的繼承演示接口繼承的使用方法:interfaceHuman{publicfunctionwalk();publicfunctiontalk();}interfaceAnimal{publicfunctioneat();publicfunctiondrink();}interfaceMonkeyextendsHuman,Animal{publicfunctionsleep(){};}6.6.2接口的繼承本章小結本章首先講解了面向對象和類與對象的使用,接著講解了類常量和靜態成員,最后講解了繼承、抽象類和接口。通過學習本章的內容,讀者應能夠理解面向對象思想,掌握面向對象的基本語法,使用面向對象思想編程。本章小結第7章PHP框架基礎(上)《PHP網站開發實例教程(第3版)》學習目標/Target

了解框架的概念,能夠說出什么是框架。

熟悉常見的PHP框架,能夠列舉常見的PHP框架。

掌握MVC設計模式,能夠在自定義框架中實現MVC設計模式。學習目標/Target

掌握框架單一入口和路由的實現方式,能夠在自定義框架中實現單一入口和路由。

掌握命名空間的使用方法,能夠定義、訪問和導入命名空間。

掌握自動加載的使用方法,能夠注冊自動加載函數和自動加載方法。章節概述/Summary在項目開發中,為了提高開發效率,節省編寫底層代碼所花費的時間,開發者一般會使用框架開發項目。要想深入學習框架,需要先掌握框架的基礎知識。本章將對PHP框架的基礎知識進行講解。目錄/Contents7.17.27.3初識框架MVC設計模式框架的單一入口和路由7.4命名空間7.5自動加載初識框架7.1

先定一個小目標!了解框架的概念,能夠說出什么是框架。7.1.1框架概述7.1.1框架概述為什么使用框架?由于每個人的編程習慣各有不同,當一個項目需要多個人同時參與開發和維護時,就容易出現問題。例如,開發人員小明定義了一個$user變量,開發人員小紅也定義了一個$user變量,當合并代碼時,兩個變量命名沖突,程序出錯。雖然看似是很小的問題,但是如果項目有成千上萬行代碼,開發人員就需要花費大量的時間去排查問題。7.1.1框架概述框架是一種遵循通用的代碼規范,采用特定設計模式編寫的代碼文件集合,用于為項目開發提供基礎支撐。使用框架的優點:在項目開發初期方便開發人員快速、高效地搭建系統。在項目開發過程中,開發人員將注意力專注于業務實現,無須過多考慮項目底層架構,節省時間。在項目維護升級時,框架具有靈活性和可維護性,能夠根據需求調整,保證項目維護升級。使用框架的缺點:會導致項目的復雜度增加、運行效率降低等問題。7.1.1框架概述在開發時,不可一味地生搬硬套,要根據具體情況決定是否使用框架以及使用什么框架。

先定一個小目標!熟悉常見的PHP框架,能夠列舉常見的PHP框架。7.1.2常見的PHP框架7.1.2常見的PHP框架2.Yii一款快速、高效、基于組件的PHP框架,實現了MVC設計模式,并基于該模式組織代碼。1.Laravel采用MVC設計模式,具備敏捷開發特質,支持Composer,提倡代碼重用,保證代碼簡潔性與優雅性。3.Symfony具有穩定性、長久性、靈活性、組件可復用、速度快、性能高等特性而備受關注。4.ThinkPHP在國內使用較多的開源PHP框架。靈活、高效、擁有完善的技術文檔,成為國內非常受歡迎的PHP框架之一。MVC設計模式7.2

先定一個小目標!了解MVC設計模式,能夠說出MVC設計模式的工作流程。7.2.1MVC概述MVC是一種軟件設計模式,到目前為止,MVC已經成為一種廣泛流行的軟件設計模式。MVC采用了人類分工協作的思維方法,將程序中的功能實現、數據處理和界面顯示分離,從而在開發復雜的應用程序時,開發者可以專注于其中的某個方面,進而提高開發效率和項目質量。MVC設計模

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論