搜索
熱搜: 活動 交友 discuz
查看: 1008|回復: 0
打印 上一主題 下一主題

用戶定義的類

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-8-14 05:11:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用戶定義的類,也是學好 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;
}
}
}
?>


要使用手推車可以用類似下例的方式。可以先將每個類存成 Include 文件,再將它 require 或 include 進來。在定義變量 $cart 時,要使用 new 的保留字,表示 $cart 使用 Cart 類。使用 -> 符號,表示執行類的方法。

<?php
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;
}
}
?>


要使用記名手推車類,請看下面的範例。當然這不算太好的設計,每個子類都一直 require 它的父類,會造成服務器在 I/O 上面的負擔。在實作時,可以將整個系列的類在同一個程序文件中,從最早的袓先類到最後的子孫類,也方便日後修正。

<?php
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 引擎可以做到類封裝的功\能也不一定。
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

本論壇為非營利之網路平台,所有文章內容均為網友自行發表,不代表論壇立場!若涉及侵權、違法等情事,請告知版主處理。


Page Rank Check

廣告刊登  |   交換連結  |   贊助我們  |   服務條款  |   免責聲明  |   客服中心  |   中央分站

手機版|中央論壇

GMT+8, 2024-4-29 19:13 , Processed in 0.274071 second(s), 16 queries .

Powered by Discuz!

© 2005-2015 Copyrights. Set by YIDAS

快速回復 返回頂部 返回列表