--------------------------------------------------------------------------------
函式
--------------------------------------------------------------------------------
在 PHP 中,允許程式設計者將常用的流程或者變數等元件,組織成一個固定的格式。也就是說使用者可以自行組合函式或者是物件。
PHP 中的函式 (function) 和 C 語言一樣,包括有傳回值的及無傳回值的,不像 Pascal 分成函式 (function) 和程序 (procedure) 那復雜。
在函式的名稱上,PHP 對大小寫的管制很鬆散。可以在定義函式時寫成大寫的名字,而在使用時使用小寫的名字。總之,對函式而言,不用管大小寫,只要注意名稱沒有重復就好了。
以下就是函式的使用語法
function myfunc($arg_1, $arg_2, ..., $arg_n) {
// 執行一些動作
return $retval;
}
在使用時,在自定的函式名稱前要加入 function 的保留字,表示這是定義使用者自定函式。之的 myfunc 可以是任何的英文字母開頭的字串,字串除了開頭不能是數字或是底線,在第一個字母可以是阿拉伯數字或者是底線,當然其它的符號或是中文字不能當函式名。
$arg_1 到 $arg_n 為函式使用的參數,參數之間使用逗號隔開。在參數的大括號 {},即為整個函式的區段。函式若有傳回值,使用 return 可將值傳回。而參數可以事先定義初始值或內定值。有定義內定值的參數在使用函式時可以省略,但一定要放在沒有設定內定值參數的面,否則 PHP 在解析函式時,會出現錯誤。
另外就是參數的形態,只要參數是 PHP 支援的變數型態都可以使用,無論是陣列、字串、或是整數....等等。傳回值也是一樣。
下面即為使用內定值及不用內定值的例子
function myfunc1($arg_1, $arg_2, $arg_3="我是內定字串") {
echo $arg_1+$arg_2;
echo $arg_3."\n";
}
myfunc(3, 4); // 參數 $arg_3 省略。
myfunc(6, 6, "不用內定值") // 輸入參數 $arg_3。
?>
參數的值,通常使用傳值的方式輸入,有時在特別的需求時,可以使用傳址的方式,傳入參數的指標。方法就是在參數的前面加上 & 符號即可。如下例
function myfunc2(&$argstr) {
$argstr=ereg_replace("/", "-", $argstr);
}
$today="2000/01/01";
myfunc2($today);
echo $today; // 2000-01-01;
?>
--------------------------------------------------------------------------------
物件
--------------------------------------------------------------------------------
使用者定義的物件,也是學好 PHP 所必備的條件之一。而 PHP 的物件,和其它的物件導向語言比較起來,還算蠻單純的。PHP 只有類別 (class)、方法 (method)、屬性、以及單一繼承 (extensions) 等。對不習慣使用 C++、Java、Delphi 等物件導向語言來開發程式的使用者,不妨先閱讀一下有關物件導向觀念的書,相信可以帶來許多的收獲。
下面的范例是手推車的物件。可以看到,使用 class 表示它是一個物件類別。在類別中的 function,例如 add_item 則表示該物件的一個方法。方法可以封裝物件的實際處理情形,讓該物件自己能依封裝好的方法來執行一些動作。
程式中的 $this 物件變數也和 $GLOBALS 及 $php_errormsg 二個變數一樣,在 PHP 中屬特殊的變數。$this 變數只用在物件類別中,表示物件的本身。
// 程式名: 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 物件。使用 -> 符號,表示執行物件的方法。
require("cart.inc");
$cart = new Cart;
$cart->add_item("10", 1);
?>
之再設計有記名的手推車。記名手推車從手推車遺傳下來,因此手推車擁有的方法及屬性,記名手推車也有,而記名手推車比手推車增加了名字的方法 (或許該稱屬性較恰當)。
從下例中可以看到,子物件 Named_Cart 使用 extends 來繼承其父物件 Cart。雖然 Named_Cart 物件中沒有增加物品及減少物品的方法,不過由遺傳的特性,父物件有的東西它都有。
// 程式名: named_cart.inc
require("cart.inc");
class Named_Cart extends Cart {
var $owner;
function set_owner ($name) {
$this->owner = $name;
}
}
?>
要使用記名手推車物件,請看下面的范例。當然這不算太好的設計,每個子物件都一直 require 它的父物件,會造成伺服器在 I/O 上面的負擔。在實作時,可以將整個系列的物件在同一個程式檔案中,從最早的先物件到最的子孫物件,也方便日修正。
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 引擎可以做到物件封裝的功能也不一定。
(http://www.fanqiang.com)
進入【UNIX論壇】
|