[TOC]
>[success]早期編程由于受電腦硬件限制,程序都是追求效率,而忽略可理解性,擴充性,隨著硬件技術的發展,編程越來越重視多人開發,程序員越來越重視程序的可靠性,可擴展性,可維護性,所以刺激了程序語言的發展
**面向過程**
程序員設計好程序代碼流程圖,輔助程序設計。優點:用什么功能就編寫什么函數 缺點:數據管理上比較混亂,主要集中在函數成面上,面向對象把屬性和方法進行封裝,更好的可重用性和可擴展性
**面向對象**
萬物皆對象,將構成問題的事務分解到各個對象上,建立對象的目的不是為了完成一個工作,而是為了描述某個事務在解決問題中的行為,更符合人的思維習慣,代碼重用性高,可擴展性好
在面向對象的程序設計(英語:Object-oriented programming,縮寫:OOP)中,對象是一個由信息及對信息進行處理的描述所組成的整體,是對現實世界的抽象。
在現實世界里我們所面對的事情都是對象,如計算機、電視機、自行車等。
**對象的主要三個特性**
1. 對象的行為:可以對 對象施加那些操作,開燈,關燈就是行為。
2. 對象的形態:當施加那些方法是對象如何響應,顏色,尺寸,外型。
3. 對象的表示:對象的表示就相當于身份證,具體區分在相同的行為與狀態下有什么不同。
比如 Animal(動物) 是一個抽象類,我們可以具體到一只狗跟一只羊,而狗跟羊就是具體的對象,他們有顏色屬性,可以寫,可以跑等行為狀態。

注意:對象可以理解為有屬性和方法的特殊數據類型。(屬性與方法的集合體,通常由類的實例化產生)
## 類的概念
是一種抽象的概念,是具有相同語義定義對象的集合(具有相同屬性和方法的集體),使用具體的類是不可行的,只能實例化。拿汽車為例,汽車的設計圖紙就是類,汽車是對象。設計中重點是類的創建
### 類名書寫規范
類名首字母大寫, 一個類定義在一個文件中,并以.class.php做為文件名結尾

~~~
<?php
class phpClass {
var $var1;
var $var2 = "constant string";
function myfunc ($arg1, $arg2) {
[..]
}
[..]
}
?>
~~~
### 對象的產生
實例化類,產生對象,步驟:
在內容中開辟出對象的空間
執行構造方法
將對象的引用地址返回
#### 對象句柄
用于區分不同對象。對象創建后,在內存中獲取一塊存儲空間,儲存空間的地址就是對象的標識或句柄
#### 屬性
在類中定義的變量,即為成員屬性,用于描述對象靜態特性的數據。 如人的姓名,性別,首字母小寫
#### 方法
函數定義在類中即為成員方法,用于描述對象動態特性的操作行為,方法名不區分大小寫,不可重名,首字母小寫
#### 對象的生命周期
創建后,生命周期開始,當程序結束后或程序員清除對象后即銷毀,PHP會自動銷毀對象
~~~
<?php
class Site {
/* 成員變量 */
var $url;
var $title;
/* 成員函數 */
function setUrl($par){
$this->url = $par;
}
function getUrl(){
echo $this->url . PHP_EOL;
}
function setTitle($par){
$this->title = $par;
}
function getTitle(){
echo $this->title . PHP_EOL;
}
}
$runoob = new Site;
$taobao = new Site;
$google = new Site;
// 調用成員函數,設置標題和URL
$runoob->setTitle( "菜鳥教程" );
$taobao->setTitle( "淘寶" );
$google->setTitle( "Google 搜索" );
$runoob->setUrl( "www.runoob.com" );
$taobao->setUrl( "www.taobao.com" );
$google->setUrl( "www.google.com" );
// 調用成員函數,獲取標題和URL
$runoob->getTitle();
$taobao->getTitle();
$google->getTitle();
$runoob->getUrl();
$taobao->getUrl();
$google->getUrl();
?>
~~~
## 構造方法&析構方法
### 構造方法__construct()
在創建對象時自動執行,沒有返回值,用于執行類的一些初始化工作,如對象屬性的初始化工作,PHP4中構造方法必須與類同名,php5中規定構造方法為construct(),優點是不受類名的影響,如果不存在__construct php搜索與類同名的方法自動執行。
### 析構方法__destruct()
用于對象在內存中被銷毀時自動執行的方法,不帶任何參數
## 繼承
可以使一個類繼承并擁有另一個已經存在類的成員屬性和方法,被繼承的類稱為父類或基類,繼承類為子類。extends關鍵字實現繼承關系。(PHP 不支持多繼承)
~~~
<?php
// 子類擴展站點類別
class Child_Site extends Site {
var $category;
function setCate($par){
$this->category = $par;
}
function getCate(){
echo $this->category . PHP_EOL;
}
}
~~~
## 方法重寫
如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。
## 訪問控制
PHP 對屬性或方法的訪問控制,是通過在前面添加關鍵字 public(公有),protected(受保護)或 private(私有)來實現的。
1. public(公有):公有的類成員可以在任何地方被訪問。
2. protected(受保護):受保護的類成員則可以被其自身以及其子類和父類訪問。
3. private(私有):私有的類成員則只能被其定義所在的類訪問。
## Static 關鍵字
需要一個數據對象只服務于類,即類內部可用,對外不可用時。建對象是極其耗費資源的,因此當一個方法具有比較強的公用性的時候, 沒有必要為了調用這個方法而重新再生成該類的實例。定義的方法或變量在程序第一次加載時即駐留內存,程序結束釋放。靜態方法不能被非靜態方法重寫,構造方法不允許聲明為static的
### static變量
通過static聲明的成員變量為靜態變量,是該類的公共變量,在第一次使用時即生成,對于該類的所有對象只有一份,是 屬于類的,不是屬于對象的。static變量是屬于類而不屬于對象,可以在任何地方通地類來訪問,是類的全局變量,類創建時即存入 內存。對多個對象來說,靜態數據成員只存儲一處,可以節省內存。只要對靜態數據成員的值更新一次,保證所有對象存取更新后的相同的值。
### static方法
用static聲明的方法為靜態方法,執行該方法時不會將對象引用傳給函數,所以我們不能訪問非靜態成員,只能訪問靜態 方法或靜態變量。使用時不用生成對象即可執行
~~~
<?php
class Foo {
public static $my_static = "foo";
public function staticValue() {
return self::$my_static;
}
}
print Foo::$my_static . PHP_EOL;
$foo = new Foo();
print $foo->staticValue() . PHP_EOL;
?>
~~~
## 方法調用
### $this
是當前對象的引用,一般出現在方法里,用于獲取類的成員屬性,或執行類的成員方法
### self::
對本類的引用 ,用于獲取當前類的靜態成員屬性或靜態成員方法 self::run()
### parent::
對父類的引用,調用父類的方法或屬性。
## 抽象類
具有抽象方法的類為抽象類,抽象方法即為沒有內容的空方法,要求子類 進行完善內容,抽象類不能實例化,只能繼承,通過extends來實現,抽 象類中也可以定義普通方法,父類方法執行方式不確定,但子類還都有這個方法。
例如:定義動物類,每個動物都有叫聲方法,但是表面不同,所以要 定義為抽象類,讓每種動物類去實現功能。
當父類為抽象類時,子類必須重寫父類的抽象方法抽象類里不一定非要寫抽象方法,但有抽象方法的類必須定義為抽象類,抽象類必須繼承使用抽象方法不能有主體即{}
~~~
<?php
abstract class AbstractClass
{
// 強制要求子類定義這些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue();
}
}
/**
* 子類-繼承了抽象類
*/
class Car extends AbstractClass
{
protected function getValue(){
}
protected function prefixValue($prefix){
}
}
?>
~~~
## 接口
使用接口(interface),可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容。接口是通過 interface 關鍵字來定義的,就像定義一個標準的類一樣,但其中定義所有的方法都是空的。接口中定義的所有方法都必須是公有,這是接口的特性。要實現一個接口,使用 implements 操作符。類中必須實現接口中定義的所有方法,否則會報一個致命錯誤。類可以實現多個接口,用逗號來分隔多個接口的名稱。
~~~
<?php
interface DbInterface {
public function connectDb(); //獲得連接
public function close(); //關閉數據庫
public function exe($sql); //發送沒有返回值的sql
public function query($sql); //有返回值的sql
}
class Db implements DbInterface
{
public function exe($sql){
}
public function query($sql{
}
}
?>
~~~
**接口與抽象類的區別:**
1. 接口只能用implements實現 抽象類用extends繼承實現
2. 接口中不可以有成員方法,抽象類可以有成員方法
3. 接口沒有構造函數,抽象類可以定義構造函數
4. 接口方法都是public 抽象類方法可以用protected private public來修飾
5. 一個類可以實現多個接口,但只能繼承一個抽象類
## 魔術常量
<table>
<caption>
<strong>
幾個 PHP 的“魔術常量”
</strong>
</caption>
<thead>
<tr>
<th>
名稱
</th>
<th>
說明
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<strong>
<code class=" language-php"><span class="token constant">__LINE__</span></code>
</strong>
</td>
<td>
文件中的當前行號。
</td>
</tr>
<tr>
<td>
<strong>
<code class=" language-php"><span class="token constant">__FILE__</span></code>
</strong>
</td>
<td>
文件的完整路徑和文件名。如果用在被包含文件中,則返回被包含的文件名。自 PHP 4.0.2 起,
<strong>
<code class=" language-php"><span class="token constant">__FILE__</span></code>
</strong>
總是包含一個絕對路徑(如果是符號連接,則是解析后的絕對路徑),而在此之前的版本有時會包含一個相對路徑。
</td>
</tr>
<tr>
<td>
<strong>
<code class=" language-php"><span class="token constant">__DIR__</span></code>
</strong>
</td>
<td>
文件所在的目錄。如果用在被包括文件中,則返回被包括的文件所在的目錄。它等價于
<em>
dirname(__FILE__)
</em>
。除非是根目錄,否則目錄中名不包括末尾的斜杠。(PHP 5.3.0中新增) =
</td>
</tr>
<tr>
<td>
<strong>
<code class=" language-php"><span class="token constant">__CLASS__</span></code>
</strong>
</td>
<td>
類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。類名包括其被聲明的作用區域(例如
<em>
Foo\Bar
</em>
)。注意自 PHP 5.4 起 __CLASS__ 對 trait 也起作用。當用在 trait 方法中時,__CLASS__ 是調用 trait
方法的類的名字。
</td>
</tr>
<tr>
<td>
<strong>
<code class=" language-php"><span class="token constant">__METHOD__</span></code>
</strong>
</td>
<td>
類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。
</td>
</tr>
</tbody>
</table>
## 魔術方法
<table>
<thead>
<tr>
<th>
名稱
</th>
<th>
說明
</th>
</tr>
</thead>
<tbody>
<tr>
<td><code class=" language-php"><span class="token function">__isset<span class="token punctuation">(</span></span><span class="token punctuation">)</span></code></td>
<td>檢測對象里面的私有成員屬性是否存在</td>
</tr>
<tr>
<td><code class=" language-php"><span class="token function">__unset<span class="token punctuation">(</span></span><span class="token punctuation">)</span></code></td>
<td>是個共有的方法,用來刪除對象里的私有成員屬性</td>
</tr>
<tr>
<td><code class=" language-php"><span class="token function">__get<span class="token punctuation">(</span></span><span class="token punctuation">)</span></code></td>
<td>獲取對象未定義的屬性時,自動運行的魔術函數</td>
</tr>
<tr>
<td><code class=" language-php"><span class="token function">__set<span class="token punctuation">(</span></span><span class="token punctuation">)</span></code></td>
<td>給未定義的屬性賦值時,自動運行的魔術函數。可以將set設置的未定義屬性存到類的數組類型成員屬性,get時再找相應變量索引</td>
</tr>
<tr>
<td><code class=" language-php"><span class="token function">__call<span class="token punctuation">(</span></span><span class="token punctuation">)</span></code></td>
<td>調用一個未定義的方法時,自動執行的魔術函數,2個參數 1方法名 2參數數組</td>
</tr>
<tr>
<td><code class=" language-php"><span class="token function">__autoload<span class="token punctuation">(</span></span><span class="token variable">$className</span><span class="token punctuation">)</span></code></td>
<td>引用一個類時自動執行的函數,可以讀入類文件,可以通過 spl_autoload_register(array('a','run'));
來指定新的魔術函數。</td>
</tr>
</tbody>
</table>
>[danger] 練習:通過面向對象思想實現文件上傳類Upload.class.php
- 序言
- 第一章:準備工作
- 寫在學習之前的話
- web應用開發結構
- 開發工具/環境
- 第二章:展現層面(HTML/CSS)
- HTML簡介
- HTML基礎
- HTML編碼
- HTML鏈接
- HTML圖像
- HTML列表
- HTML表單
- HTML表格(分水嶺)
- HTML 實體
- HTML框架
- CSS層疊樣式表
- CSS選擇器
- CSS文本/字體
- CSS繼承和疊加
- CSS框模型
- CSS浮動(分水嶺)
- CSS定位
- CSS背景
- CSS圖標字體
- CSS補充
- 開發技巧
- 第三章:展現層面(Javascript)
- JS簡介
- JS實現
- JS輸出交互
- JS變量
- JS數據類型
- JS運算符
- JS流程控制(分水嶺)
- JS函數
- JS數組
- JS對象(分水嶺)
- JS數組對象
- JS字符串對象
- JS數學對象
- JS日期對象
- JS BOM對象(分水嶺)
- JS DOM對象
- JS事件對象
- JS元素對象
- JS DOM節點
- 第四章:展現層面(Jquery)
- JQ簡介
- JQ使用
- JQ選擇器
- JQ篩選
- JQ屬性
- JQ-CSS
- JQ事件
- JQ文檔處理
- JQ效果
- JQ-ajax
- 第五章:邏輯/業務層面(PHP)
- PHP簡介
- PHP變量
- PHP數據類型
- PHP常量
- PHP運算符
- PHP流程控制
- PHP函數(分水嶺)
- PHP日期
- PHP數學
- PHP數組
- PHP字符串
- PHP正則表達式(分水嶺)
- PHP目錄操作
- PHP文件
- PHP上傳/下載
- PHP面向對象(分水嶺)
- PHP圖像處理
- PHP會話控制
- Ajax異步處理
- PHPMysql擴展
- PHPMysqli擴展
- PHPPdo擴展
- PHP接口
- PHP命名空間
- 第六章:邏輯/業務層面(框架設計)
- 第七章:存儲層面(mysql)
- Mysql基礎
- Mysql Sql簡介
- Mysql數據庫
- Mysql數據類型
- Mysql數據表
- Mysql操作記錄
- Mysql查詢
- Mysql修改表結構
- Mysql日期與時間
- Mysql分組統計
- Mysql多表查詢
- Mysql安全
- Mysql存儲引擎
- Mysql事務
- Mysql視圖
- Mysql觸發器
- Mysql存儲過程
- Mysql存儲函數
- Mysql優化
- 第八章:服務器(Linux)
- Linux介紹與安裝
- Shell
- 目錄與文件操作
- VIM編輯器使用
- 帳號管理
- SUDO
- 權限控制
- 壓縮與打包
- 軟件安裝
- 計劃任務
- 進程管理
- 寶塔Linux面板