物件
使用者定義的物件,也是學好 PHP 所必備的條件之一。而 PHP 的物件,和其它的物件導向語言比較起來,還算蠻單純的。PHP 只有類別 (class)、方法 (method)、屬性、以及單一繼承 (extensions) 等。對不習慣使用 C++、Java、Delphi 等物件導向語言來開發程式的使用者,不妨先閱讀一下有關物件導向觀念的書,相信可以帶來許多的收獲。
下面的範例是手推車的物件。可以看到,使用 class 表示它是一個物件類別。在類別中的 function,例如 add_item 則表示該物件的一個方法。方法可以封裝物件的實際處理情形,讓該物件自己能依封裝好的方法來執行一些動作。
程式中的 $this 物件變數也和 $GLOBALS 及 $php_errormsg 二個變數一樣,在 PHP 中屬於特殊的變數。$this 變數只用在物件類別中,表示物件的本身。
要使用手推車可以用類似下例的方式。可以先將每個物件存成 Include 檔案,再將它 require 或 include 進來。在宣告變數 $cart 時,要使用 new 的保留字,表示 $cart 使用 Cart 物件。使用 -> 符號,表示執行物件的方法。
之後再設計有記名的手推車。記名手推車從手推車遺傳下來,因此手推車擁有的方法及屬性,記名手推車也有,而記名手推車比手推車增加了名字的方法 (或許該稱屬性較恰當)。
從下例中可以看到,子物件 Named_Cart 使用 extends 來繼承其父物件 Cart。雖然 Named_Cart 物件中沒有增加物品及減少物品的方法,不過由於遺傳的特性,父物件有的東西它都有。
要使用記名手推車物件,請看下面的範例。當然這不算太好的設計,每個子物件都一直 require 它的父物件,會造成伺服器在 I/O 上面的負擔。在實作時,可以將整個系列的物件在同一個程式檔案中,從最早的袓先物件到最後的子孫物件,也方便日後修正。
因此,在 PHP 中使用了 extends 保留字,加上良好的系統分析與完整的 CRC 卡片 (詳見物件導向相關書籍) 設計之後,PHP 可變成擁有強大物件能力的 CGI 語言。
PHP 由於是劇本語言 (Script),因此程式原始碼可見,在軟體工程中的元件黑箱並不會在目前的 PHP 版本中出現,也就是說,全部的物件其實沒有隱藏起它的內容。對於軟體業者而言,沒有辦法保護所謂的軟體 IC,站在開放社群而言,反而有原始碼是件好事,至於孰是孰非,就很難判定了,不過目前 PHP 還是 Open Source 社群的一份子,或許日後 Zend 引擎可以做到物件封裝的功能也不一定。
使用者定義的物件,也是學好 PHP 所必備的條件之一。而 PHP 的物件,和其它的物件導向語言比較起來,還算蠻單純的。PHP 只有類別 (class)、方法 (method)、屬性、以及單一繼承 (extensions) 等。對不習慣使用 C++、Java、Delphi 等物件導向語言來開發程式的使用者,不妨先閱讀一下有關物件導向觀念的書,相信可以帶來許多的收獲。
下面的範例是手推車的物件。可以看到,使用 class 表示它是一個物件類別。在類別中的 function,例如 add_item 則表示該物件的一個方法。方法可以封裝物件的實際處理情形,讓該物件自己能依封裝好的方法來執行一些動作。
程式中的 $this 物件變數也和 $GLOBALS 及 $php_errormsg 二個變數一樣,在 PHP 中屬於特殊的變數。$this 變數只用在物件類別中,表示物件的本身。
<?php
// 程式名: cart.inc
class Cart {
var $items; // 手推車物件
// 本方法加入 $num 件物品到手推車中 (加到 $artnr 變數)
function add_item ($artnr, $num) {
$this->items[$artnr] += $num;
}
// 本方法從手推車減少 $num 件物品 (從 $artnr 變數減掉)
function remove_item ($artnr, $num) {
if ($this->items[$artnr] > $num) {
$this->items[$artnr] -= $num;
return true;
} else {
return false;
}
}
}
?>
// 程式名: cart.inc
class Cart {
var $items; // 手推車物件
// 本方法加入 $num 件物品到手推車中 (加到 $artnr 變數)
function add_item ($artnr, $num) {
$this->items[$artnr] += $num;
}
// 本方法從手推車減少 $num 件物品 (從 $artnr 變數減掉)
function remove_item ($artnr, $num) {
if ($this->items[$artnr] > $num) {
$this->items[$artnr] -= $num;
return true;
} else {
return false;
}
}
}
?>
要使用手推車可以用類似下例的方式。可以先將每個物件存成 Include 檔案,再將它 require 或 include 進來。在宣告變數 $cart 時,要使用 new 的保留字,表示 $cart 使用 Cart 物件。使用 -> 符號,表示執行物件的方法。
<?php
require("cart.inc");
$cart = new Cart;
$cart->add_item("10", 1);
?>
require("cart.inc");
$cart = new Cart;
$cart->add_item("10", 1);
?>
之後再設計有記名的手推車。記名手推車從手推車遺傳下來,因此手推車擁有的方法及屬性,記名手推車也有,而記名手推車比手推車增加了名字的方法 (或許該稱屬性較恰當)。
從下例中可以看到,子物件 Named_Cart 使用 extends 來繼承其父物件 Cart。雖然 Named_Cart 物件中沒有增加物品及減少物品的方法,不過由於遺傳的特性,父物件有的東西它都有。
<?php
// 程式名: named_cart.inc
require("cart.inc");
class Named_Cart extends Cart {
var $owner;
function set_owner ($name) {
$this->owner = $name;
}
}
?>
// 程式名: named_cart.inc
require("cart.inc");
class Named_Cart extends Cart {
var $owner;
function set_owner ($name) {
$this->owner = $name;
}
}
?>
要使用記名手推車物件,請看下面的範例。當然這不算太好的設計,每個子物件都一直 require 它的父物件,會造成伺服器在 I/O 上面的負擔。在實作時,可以將整個系列的物件在同一個程式檔案中,從最早的袓先物件到最後的子孫物件,也方便日後修正。
<?php
require("named_cart.inc");
$ncart = new Named_Cart; // 建立物件變數
$ncart->set_owner ("CyberRidder"); // 設定物件的記名屬性
echo $ncart->owner; // 顯示物件的記名屬性
$ncart->add_item ("10", 1); // 從父物件遺傳的方法也可使用
?>
require("named_cart.inc");
$ncart = new Named_Cart; // 建立物件變數
$ncart->set_owner ("CyberRidder"); // 設定物件的記名屬性
echo $ncart->owner; // 顯示物件的記名屬性
$ncart->add_item ("10", 1); // 從父物件遺傳的方法也可使用
?>
因此,在 PHP 中使用了 extends 保留字,加上良好的系統分析與完整的 CRC 卡片 (詳見物件導向相關書籍) 設計之後,PHP 可變成擁有強大物件能力的 CGI 語言。
PHP 由於是劇本語言 (Script),因此程式原始碼可見,在軟體工程中的元件黑箱並不會在目前的 PHP 版本中出現,也就是說,全部的物件其實沒有隱藏起它的內容。對於軟體業者而言,沒有辦法保護所謂的軟體 IC,站在開放社群而言,反而有原始碼是件好事,至於孰是孰非,就很難判定了,不過目前 PHP 還是 Open Source 社群的一份子,或許日後 Zend 引擎可以做到物件封裝的功能也不一定。