1.面向過程與面向對象理解
1.1.面向過程的編程思想
- 面向過程是以過程(步驟)爲中心的編程思想
- 例如:遞歸思想、冒泡思想、二分法查找
- 解決一個大問題,先把大問題分解成一個個小問題,再把小問題一個個解決,最終大問題解決了
1.2.面向對象的編程思想
- 面向過程是以事物(對象)爲中心的編程思想
- 面向過程着重與做什麼,面向對象着重於誰來做
總結:面向對象適合大項目(人多),面向過程適合小項目(人少)。
2.類和對象的關係
- 現實中,先有對象,後有類
- 在計算機中,先有類,後有對象
2.1類的概念
- 類就是分類、類別、概念、理論,無形的、看不見、摸不着、不存在。
- 類由相同屬性和方法構成
- 一個類可以產生千千萬萬個對象
2.2對象的概念
- 對象就是一個個的實體。有形的、存在的
- 對象也是由屬性(特徵)和方法(行爲)構成
3.類的定義
語法格式說明:
- class是聲明類的關鍵字,不區分大小寫;
- 類名、函數名、關鍵字、都不區分大小寫;
- ClassName是類的名稱,類名的命名規則與變量已有,但不帶$符號;
- 類名可以由字母、數字、下劃線構成;
- 類名不能以數字開頭,但可以以字母、下劃線開頭
- 類名一般用“駝峯式”命名;
- 類名後部分小括號();
- 大括號{}定義的是類的成員屬性和成員方法。
//例:定義一個學生類
class Student{
//成員屬性
public $name="神樂";
public $sex="70";
//成員方法
public function showInfo(){
echo "{$this->name}的年齡是{$this->sex}歲!";
}
}
4.定義類的成員屬性
- 類中只有兩個內容,分別爲:成員屬性和成員方法。類的成員就是對象,又稱“對象屬性”和“對象方法”
4.1成員屬性介紹
- 成員屬性:就是普通變量
- 成員屬性和普通變量的區別:
- (1)成員屬性一定要有前提,就是“誰的屬性”,普通變量一般都是全局變量;
- (2)成員屬性一定要加權限控制符,而普通變量不需要
4.2定義格式
- 權限控制符 變量名 = 變量值;
- 可以給變量制定默認值,也可以沒有
4.3訪問修飾符
主要用來保護數據的安全
修飾符 | 說明 |
---|---|
public(公共權限) | 在任何地方可以訪問,主要指類內部、類外部,子類中都可以訪問 |
protected(受保護的權限) | 只能在本類中、子類中訪問,在類外不能訪問 |
private(私有的權限) | 只能在本類中訪問,在類外、子類中都無權訪問 |
5.定義類的成員方法
5.1成員方法介紹
- 成員方法:就是普通函數
- 成員方法與普通函數的區別:
- (1)成員方法,一定是某個對象的方法,不能單獨存在
- (2)成員方法要加權限控制符,普通函數不需要加
- (3)成員方法可以省略權限控制符,默認爲public,建議不要省略
- 成員方法和普通函數一樣,都有返回值和參數
5.2定義格式
權限控制符 function funName(形參1,形參2,…){
//該方法的功能代碼;
[return 參數]
}
6.創建類的實例對象
6.1實例對象含義
- 類可以產生N多個對象
- 類幾乎不佔用內存,但每個對象都要佔內存
- 平常只有對象纔可以幫我們做工作,而不是類
- 在js中,創建類的對象的方法:var obj=new Student();
- 在PHP中,創建類的對象的方法:$obj = new Student();
- 使用new關鍵字來創建類的對象
- 對象不能單獨存在,對象必須屬於某個類。沒有類,一定沒有對象
6.2定義格式
//創建類的對象的語法(類的實例化)
$obj=new ClassName;//無參數 無括號
$obj=new ClassName();//無參數 有括號
$obj=new ClassName(實參1,實參2,...);//有參數 有括號
7.對象屬性的操作
7.1訪問對象的屬性和方法
- 在js中、訪問對象的屬性和方法,使用小數點來訪問:document.write()
- 在PHP中,訪問對象的屬性和方法,使用箭頭->來訪問:obj->showInfo()
- name表示訪問$name變量值的屬性
- 符號
7.2對象屬性的操作:增加、刪除、修改、讀取
//類的實例化
$obj=new Student();
//1.修改對象屬性:對已存在的屬性重新複製
//$obj->$name表示訪問$name變量值的屬性
//$obj訪問屬性,屬性不加$符號
$obj->name="kakura";
//2.添加新屬性:給不存在的屬性賦值
$obj->cartoon="銀魂";
//3.刪除屬性
unset($obj->name,$obj->sex);
//4.讀取對象屬性的值
echo "{$obj->name}的年齡是{$obj->sex}歲!";
8.僞變量$this
- PHP中$this代表當前對象,用來調用對象的屬性和方法
- $this只能在成員方法中存在,其他地方都不能使用
- $this對象是怎麼來的?當使用$obj對象調用成員方法時,自動將當前對象$obj傳遞到成員方法中,在成員方法中,使用$this變量來代替傳遞過來的$obj變量
//例:定義一個學生類
class Student{
//成員屬性
private $name="神樂";
private $sex="70";
//私有的成員方法:返回一條水平線
private function showLine(){
return '<hr/>';
}
//成員方法
public function showInfo(){
$str="<h2>{$this->name}的基本信息如下:</h2>";
$str.=$this->showLine();
$str.= "{$this->name}的年齡是{$this->sex}歲!";
echo $str;
}
}
$obj=new Student();
$obj->showInfo();
9.self關鍵字
- | $this | slef |
---|---|---|
代表 | 代表當前對象 | 代表當前類 |
調用 | 調用對象的 成員屬性、成員方法 | 調用類的 類常量、靜態屬性、靜態方法 |
符號 | 使用箭頭->調用 | 使用雙冒號::調用 |
位置 | 只能在成員方法中使用 | 可用在成員方法,靜態方法中 |
以下代碼可對比上一個代碼:
class Student{
//公共的靜態方法
public static $title="<h2>club</h2>";
//私有的靜態方法
private static function showLine(){
return "<hr/>";
}
//公共的成員方法
public function showInfo($name,$age){
$str=self::$title;
$str.=self::showLine();
$str.="{$name}的年齡是{$age}歲";
echo $str;
}
}
//創建學生類的對象
$obj=new Student();
$obj->showInfo("kakura",70);
//創建第2個對象
$obj2=new Student();
$obj2->showInfo("gangna",20);
10.parent關鍵字
- self代表當前類,parent代表父類
- self可以調用本類的內容:類常量、靜態屬性、靜態方法、成員方法
- parent可以調用父類的內容:類常量、靜態屬性、靜態方法、成員方法
11.定義類的常量
- 常量:不能修改,不能刪除
- 提示:在一次HTTP請求過程中,常量不能修改
- 類常量定義使用const關鍵字,Define()定義的常量爲全局常量
- 類常量,就是類的常量,與對象無關
- 類常量只能通過類名(類名::常量)來調用,成員的東西,只能通過對象來調用
- 訪問類常量,是通過範圍解析符(::)來訪問類的常量:Student::TITLE
- 訪問對象的內容,是通過箭頭->來訪問:$obj->name
- 類常量在內存中只有一份,不會隨着對象增加而增加。
- 類常量可以被所有對象共享
- 好處:節省內存
//例:定義一個學生類
class Student{
//類常量
const DB_HOST="localhost";
const DB_USER="root";
const DB_PWD="";
//公共的成員方法
public function showInfo(){
$str="主機名:".Student::DB_HOST;
$str.="<br>用戶名:".Student::DB_USER;
$str.="<br>密碼:".Student::DB_PWD;
return $str;
}
}
//1.直接訪問類的常量,靜態化調用方式
$str="主機名:".Student::DB_HOST;
$str.="<br>用戶名:".Student::DB_USER;
$str.="<br>密碼:".Student::DB_PWD;
echo $str."<hr/>";
//2.對象實例化
$obj=new Student();
echo $obj->showInfo();
12 靜態屬性和靜態方法
- static關鍵字修飾
- 靜態屬性和方法,與類相關,與對象無關
- 靜態屬性和方法在內存中只有一份,不會隨着對象增加而增加。
- 可以被所有對象共享
- 靜態屬性的值是可以改變的
- 靜態屬性和方法,是有權限控制符的
//例:定義一個學生類
class Student{
//公共的靜態方法
static public $title="<h2>club</h2>";//多個修飾符關鍵字,順序可以不一致
//私有的靜態方法
private static function showLine(){
return "<hr/>";
}
//公共的成員方法
public function showInfo($name,$age){
$str=Student::$title;
$str.=Student::showLine();
$str.="{$name}的年齡是{$age}歲";
echo $str;
}
}
//創建學生類的對象
$obj=new Student();
$obj->showInfo("kakura",70);
//創建第2個對象
$obj2=new Student();
$obj2->showInfo("gangna",20);
13 最終類和最終方法
- Final最終類,不能被繼承,直接實例化。該類已經完善,不需升級擴展
- 最終方法,不能被重寫,直接調用
- 一般,數據庫操作類,也可定義爲最終類
14 抽象類和抽象方法
- Abstract抽象類:該類只能被繼承,不能直接實例化。常用於基礎類
- 抽象方法:該方法沒有方法體,抽象方法必須先繼承,後重寫
- 如果一個類中有一個抽象方法,該類必須聲明爲抽象類
- 抽象方法作用:方法的命名規範,是一種監督的機制
- 抽象類中,也可能有其他元素:成員屬性、成員方法、靜態屬性、具體方法、常量
- 抽象方法不能是靜態方法,只能是成員方法
//定義抽象的商品基礎類
abstract class Shop{
//抽象方法
abstract protected function showInfo($a,$b);
abstract protected function readMe();
}
//定義手機類,並繼承商品類
final class Mobile extends Shop{
//重寫showInfo()抽象方法
public function showInfo($a2,$b2){
echo "{$a2}的年齡是{$b2}歲";
}
//重寫readMe()抽象方法
public function readMe(){
echo "<hr>這是成員方法:".__METHOD__;
}
}
//創建手機類對象
$obj=new Mobile();
$obj->showInfo("kakura",70);
$obj->readMe();