類是面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念,通俗的理解類就是對(duì)現(xiàn)實(shí)中某一個(gè)種類的東西的抽象, 比如汽車可以抽象為一個(gè)類,汽車擁有名字、輪胎、速度、重量等屬性,可以有換擋、前進(jìn)、后退等操作方法。
基本概念
面向?qū)ο缶幊蹋∣bject Oriented Programming, OOP, 面向?qū)ο蟪绦蛟O(shè)計(jì))是一種計(jì)算機(jī)編程架構(gòu)。OOP 的一條基本原則是計(jì)算機(jī)程序是由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成。OOP 達(dá)到了軟件工程的三個(gè)目標(biāo):重用性、靈活性和擴(kuò)展性。
PHP 在 4.0 版本之后完善了對(duì) OOP 的支持了。對(duì)于小型的應(yīng)用,使用傳統(tǒng)的過程化編程可能更簡(jiǎn)單也更有效率。然而對(duì)于大型的復(fù)雜應(yīng)用時(shí),OOP 就是一個(gè)不得不考慮的選擇。
類
類是具有相同屬性和服務(wù)的一組對(duì)象的集合。它為屬于該類的所有對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務(wù)兩個(gè)主要部分。在面向?qū)ο蟮木幊陶Z言中,類是一個(gè)獨(dú)立的程序單位,它應(yīng)該有一個(gè)類名并包括屬性說明和服務(wù)說明兩個(gè)主要部分。
對(duì)象
對(duì)象是系統(tǒng)中用來描述客觀事物的一個(gè)實(shí)體,它是構(gòu)成系統(tǒng)的一個(gè)基本單位。一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作的一組服務(wù)組成。
類與對(duì)象的關(guān)系就如模具和鑄件的關(guān)系,類的實(shí)例化結(jié)果就是對(duì)象,而對(duì)一類對(duì)象的抽象就是類。
每個(gè)類的定義都以關(guān)鍵字 class
開頭,后面跟著類名,后面跟著一對(duì)花括號(hào),里面包含有類的屬性與方法的定義。
類名可以是任何非 PHP 保留字的合法標(biāo)簽。一個(gè)合法類名以字母或下劃線開頭,后面跟著若干字母,數(shù)字或下劃線。
一個(gè)類可以包含有屬于自己的常量,變量(稱為“屬性”)以及函數(shù)(稱為“方法”)。
小實(shí)踐
新建或編輯 index.php
,內(nèi)容如下:
<?php
/**
* 類:任務(wù)
*/
class Task
{
// 屬性:任務(wù)描述
protected $description;
// 屬性:任務(wù)狀態(tài)
public $completed = false;
// 類的構(gòu)造方法
function __construct($description)
{
$this->description = $description;
}
// 類方法:完成任務(wù)
public function complete()
{
$this->completed = true;
}
// 類方法:獲取任務(wù)的狀態(tài)
public function isComplete()
{
return $this->completed;
}
public function description()
{
return $this->description;
}
}
// 定義任務(wù)數(shù)據(jù)
$tasks = [
new Task('Go to the store'),
new Task('Finish my screencast'),
new Task('Clean my room')
];
$tasks[0]->complete();
require "index.view.php";
接下來建立文件 index.view.php
用于顯示任務(wù)信息:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<ul>
<?php foreach ($tasks as $task) : ?>
<li>
<?php if ($task->completed) : ?>
<strike><?= $task->description(); ?></strike>
<?php else: ?>
<?= $task->description(); ?>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ul>
</body>
</html>
以上的例子簡(jiǎn)單描述如下:
我們建立一個(gè)待做事項(xiàng)的任務(wù)類 Task
,實(shí)例化了類的對(duì)象,并定義成了 $task
數(shù)組,通過數(shù)組獲取對(duì)象并調(diào)用類的方法 complete()
完成更改了任務(wù)狀態(tài)。之后,在頁面上循環(huán)打印了任務(wù)列表,判斷任務(wù)是否完成,如果完成的任務(wù)就通過 橫線(strike) 標(biāo)記出來。