[TOC]
本節介紹面向對象編程的主要概述,并探索這些概念之間如何交互;第3章將深入討論這些概念在PHP6中的實現細節。本間涵蓋了以下主題:
* 類(Class)
* 對象(Object)
* 繼承(Inheritance)
* 多態(Polymorphism)
* 接口(Interface)
* 封裝(Encapsulation)
# 1.3 類
類是一個代碼單元(由變量和函數組成),該代碼單元描述了集合中所有成員的特征和行為。
## 1.3.1 對象
類可以看成是構造對象的藍本。
類永遠不能有導發值 或狀態,只有對象才可以值或狀態。
在實例化,就可以將對象用于實現應用程序的業務需求。
### 1. 創建類
```
<?php
class Demo{
}
```
實例化一個對象
```
<?php
require_once('class.Demo.php');
$objDemo = new Demo();
```
### 2.添加方法
```
<?php
class Demo{
function sayHello($name){
print "Hello $name";
}
}
```
使用 `->` 來訪問新創建的函數:
```
<?php
require_once('class.Demo.php');
$objDemo = new Demo();
$objDemo->sayHello('Steve');
```
>PHP在其OO語法中根本不使用點操作(.)
### 3.添加屬性
在面向過程代碼中,當希望存儲某個值 時,會將該值賦給一個`變量`。
在OOP中,當希望存儲某個屬性的值時,也可以使用一個`變量`。
該變量在類聲明的頂部聲明,`類聲明位于包含類代碼的大括號中`。
變量的名稱就是屬性的名稱!
聲明使用`public $property`,使用`$obj->property`來訪問。
```
<?php
class Demo{
public $name;
function sayHello(){
print "Hello $this->name!";
}
}
```
使用
```
<?php
require_once('class.Demo.php');
$objDemo = new Demo();
$objDemo->name='Steve';
$objAnotherDemo = new Demo();
$objAnotherDemo->name='Ed';
$objDemo->sayHello();
$objAnotherDemo->sayHello();
```
訪問該文件,字符串`Hello Steve!Hello Ed!`就出現在屏幕上!
### 4.保護對成員變量的訪問
正如前面的示例所示,可以將 name 屬性的值設置為任意所需要的數據——包括對象、整數數組、文件句柄或任何其他沒有意義的值 。但是,并不能在設置name屬性時執行任何形式的數據驗證或更新其他的值 。
為了解決該問題,必須以 `get[property name]` 和 `set[property name]`的函數形式來實現屬性。這些函數稱為`存儲器方法`,下面的示例演示了這些方法。
```
<?php
class Demo{
private $_name;
public function sayHello(){
print "Hello ".$this->getName()."!";
}
public function getName(){
return $this->_name;
}
public function setName($name){
if(!is_string($name) || strlen($name) == 0){
throw new Exception("Invalid name value!");
}
$this->_name = $name;
}
}
```
使用類
```
<?php
require_once('class.Demo.php');
$objDemo = new Demo();
$objDemo->setName('Steve');
$objDemo->sayHello();
$objDemo->setName(37); //would trigger an error
```
>name屬性的成員訪問級別已經由 public 變成了 private。下劃線是建議的命名約定!
### 5. 初始化對象
對于許多將要創建的類,需要在初次實例化該類的對象時執行一些特殊的設置。例如,可能需要從數據庫中獲取某些信息,或者是初始化某些屬性值 。通過創建一個`構造函數`的特殊方法可以執行實例化對象所需要的任何活動,該方法在PHP中是通過名為`_construct()`的函數來實現的。在實例化對象是時,PHP將自動調用這個特殊的函數。
### 6.銷毀對象
當請求的頁面已經完成運行,或者創建的對象變量已經不在其作用域內,又或者變量被顯式地設置為 null 時,都需要從內存中移除該變量。
在PHP6中,可以在銷毀對象之前做一些處理工作,并且在銷毀發生時采取相應的操作。
為了實現這一點,創建一個不帶參數的、名為`__destruct`的函數。在銷毀對象之前就會自動調用該函數,前提是該函數存在!
## 1.3.2 繼承
利用繼承機制, 我們可以定義一個基類!
### 1. 重寫方法
重新寫方法以覆蓋方法
### 2. 保留父類的功能
可以采用 `parent::[function name]` 這一關鍵字!
如:
```
parent::__contruct($customerID);
```
### 3. 繼承的工作原理
書中采用 `某一個變量的true和false` 的形式,以繼承不同的類!
## 1.3.3 接口
### 1. 接口的功能
接口可以指定某個對象能夠執行某種函數,但是它并不需要表明如何執行該函數。
接口是不相關的對象之間為了執行共有的函數而建立 起來的合同。
### 2. 接口的工作原理
書中用實例來表示,有意者可看 25、26頁。
## 1.3.4 封裝
書中講的其實就是業務的一些封裝!