以我的觀點來說說PHP中的Class,用于表達的語言都是非正式的語言,也不能確定是否正確。
建立一個類很簡單。
<?php
class my_class {}
?>
類到底干什么呢?很多人都是什么黑匣子,我在這里稱它為一個獨立的整體。我們只知道類名,而不知道里面有什么東西。那么,該如何使用這個類呢?
首先:要知道它里面是否定義了公共的變量--專業(yè)術(shù)語上稱它為“屬性”。
其次:要知道它里面定義了什么函數(shù)--專業(yè)術(shù)語中稱它為“方法”。
我都被這些專業(yè)術(shù)語搞糊涂了,所以干脆不理它了。
類中的如何定義公共變量,它有什么作用呢?
很簡單,我們來擴充 my_class 類
<?php
class my_class
{
var $username;
}
?>
看上面很簡單,我們定義了一個公共的變量,只是用 var+空格+普通變量名構(gòu)成。它有什么用呢?考慮一下函數(shù)中,如果我們要訪問函數(shù)外的變量,是不是要先 global 一下呢?這個想實現(xiàn)的效果也是如此,它是想讓這個類中的所有函數(shù)都能訪問它,而它區(qū)別于函數(shù)的一個地方,是類的外部也可以訪問這個變量,我隨后再講外部如 何訪問它。還有一個區(qū)別,不能用復(fù)雜的語句給這個變量賦值(具體的等理解了類以后自己去看規(guī)則)。給它一個默認值
<?php
class my_class
{
var $username = "深空";
}
?>
OK,定義了一個公共的變量了,接下來定義一個函數(shù)(也就是所謂的“方法”)。
<?php
class my_class
{
var $username = "深空";function show_username()
{
}
}
?>
這個定義函數(shù)跟普通的定義函數(shù)形式上沒什么區(qū)別了。簡單就好,定義一個打印 $username 的函數(shù):
<?php
class my_class
{
var $username = "深空";function show_username($username)
{
echo $username;
}
}
?>
到這里可能某些人開始迷糊了,呵呵,最關(guān)鍵的就是這里了,看清楚了。現(xiàn)在有三個 $username 了。到底哪個是哪個啊~~
函數(shù)所帶的行參,不用解釋了吧?這個函數(shù)功能就是打印行參所接收的值,也就是如果:
<?php
show_username("豬頭深空");
?>
那么它將打印 “豬頭深空” ,就這么簡單。
怎么樣訪問這個函數(shù)?肯定不是我上面說的那樣直接 show_username("豬頭深空"); 了,別急,類有類的一套。如下:
<?php
$Name = new my_class();
?>
這樣就初始化上面的那個 my_class 的類了,并把這個對象賦給變量 $Name ,你可以這樣理解,這個變量就代表整個類了,呵呵。
使用類中的函數(shù):
<?php
$Name->show_username("豬頭深空");
?>
暈了,為什么這么復(fù)雜?還要箭頭?其實很形象的。本來已經(jīng)把類給了變量 $Name 了是吧?也就是 $Name 代表了這個類,然后用一個箭頭指向類中的 show_username 這個函數(shù)。就是這么簡單,也就是說,這個函數(shù)是這個類中的,而不是其他的函數(shù)--你就理解為表示一個區(qū)別吧,呵呵。
試試看哦,打印出 “豬頭深空” 這四個字了。你說為什么要這么復(fù)雜?用函數(shù)不是也能實現(xiàn)么?我說,這么簡單的你當(dāng)然看不出好處了,我們繼續(xù)擴充。
還有一個疑問:剛才說的“公共的變量”怎么一點用處都沒有呢?為什么這個函數(shù)不會自動接收這個公共變量 var $username 中的默認值?也就是如果我使用:
<?php
$Name->show_username($username);
?>
會有什么結(jié)果呢?答案是沒有任何輸出。因為你沒有給形參 $username 一個值。
那么該怎么使用這個公共的變量?我們來修改一下這個類:
<?php
class my_class
{
var $username = "深空";function show_username()
{
echo $this->username;
}
}
?>
哇靠,不是吧,這回臉形參都沒有了?還多了一個$this->,暈了不是,呵呵。其實這也是類的一個最大的方便之處。
$this 的作用:訪問一個公共的變量,或者類里面的函數(shù)。
訪問?這么專業(yè)?其實就是用 $this->username 來代替 var $username 而已拉,$this 用來說明它是公共的??梢栽L問的,函數(shù)外部的東西。
試試看:
<?php
$Name->show_username();
?>
看到了吧,終于打印 “深空” 這兩個字了,娃哈哈。
我不打印“深空”這兩個字,我要打印“豬頭深空”,怎么辦?很簡單,我們給這個公共變量重新賦值拉。服了你了。
<?php
$Name->username = "豬頭深空";
?>
這個能明白意思么?$Name->username 表示的是類里面的這個公共變量。等號賦值不用我解釋了。
我們再來打印看看
<?php
$Name->show_username();
?>
哈哈,終于打印“豬頭深空”了。不錯吧,很方便吧,不用形參也能任意修改打印值哦~~。
不過單單打印一個名稱也太沒意思了,我們說點歡迎的話吧,來擴充一下這個類,創(chuàng)建一個名叫 Welcome 的函數(shù):
<?php
class my_class
{
var $username = "深空";function show_username()
{
echo $this->username;
}function Welcome()
{
}
}
?>
恩,實現(xiàn)什么功能好呢?簡單點吧,就實現(xiàn)在名字前面有 “歡迎” 兩個字好了
<?php
class my_class
{
var $username = "深空";function show_username()
{
echo $this->username;
}function Welcome()
{
echo "歡 迎";
$this->show_username();
}
}
?>
第二次看到 $this 了吧?$this->show_username(); 干什么用呢?其實它就是調(diào)用 show_username 這個函數(shù),用 $this 來表示這個函數(shù)在類中并且和 Welcome 函數(shù)平行,而不是在其他地方(比如Welcome函數(shù)中)。
Welcome 函數(shù)實現(xiàn)的功能很簡單,首先打印兩個字"歡迎",然后接下去執(zhí)行 show_username 函數(shù),打印名字。
來試試這個函數(shù)吧:
<?php
$Name->Welcome();
?>
看到了吧,打印出“歡迎深空”這四個字了。
可是我要打印“歡迎豬頭深空”,怎么辦?我服了你了,我們給公共變量 var $username 一個值吧:
<?php
$Name->username = "豬頭深空";
?>
接下去打印歡迎語:
<?php
$Name->Welcome();
?>
嘿嘿,終于打印“歡迎豬頭深空”了。
怎么樣?明白了類的用法了么?好處在于能夠調(diào)用類中的任意函數(shù),只要用 $this 指出來,可以改變一個公共變量的值,可以在類中的函數(shù)中使用這個公共變量。………多了去了,它的應(yīng)用等待你去發(fā)現(xiàn)了。
PHP 類入門實例
用戶定義的類,也是學(xué)好 php 所必備的條件之一。而 php 的類,和其它的面向?qū)ο笳Z言比較起來,還算蠻單純的。php 只有類別 (class)、方法 (method)、屬性、以及單一繼承 (extensions) 等。對不習(xí)慣使用 c++、java、delphi 等面向?qū)ο笳Z言來開發(fā)程序的用戶,不妨先閱讀一下有關(guān)面向?qū)ο蟾拍畹臅?,相信可以帶來許多的收獲。
下面的范例是手推車 類??梢钥吹?,使用 class 表示它是一個類類別。在類別中的 function,例如 add_item 則表示該類的一個方法。方法可以封裝類的實際處理情形,讓該類自己能依封裝好的方法來執(zhí)行一些步驟。
程序中的 $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 類。使用 -> 符號,表示執(zhí)行類的方法。
<?php
require("cart.inc");
$cart = new cart;
$cart->add_item("10", 1);
?>
之后再設(shè)計有記名的手推車。記名手推車從手推車遺傳下來,因此手推車擁有的方法及屬性,記名手推車也有,而記名手推車比手推車增加了名字的方法 (或許該稱屬性較恰當(dāng))。
從下例中可以看到,子類 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;
}
}
?>
要使用記名手推車類,請看下面的范例。當(dāng)然這不算太好的設(shè)計,每個子類都一直 require 它的父類,會造成服務(wù)器在 i/o 上面的負擔(dān)。在實作時,可以將整個系列的類在同一個程序文件中,從最早的袓先類到最后的子孫類,也方便日后修正。
<?php
require("named_cart.inc");
$ncart = new named_cart; // 建立類變量
$ncart->set_owner ("cyberridder"); // 配置類的記名屬性
echo $ncart->owner; // 顯示類的記名屬性
$ncart->add_item ("10", 1); // 從父類遺傳的方法也可使用
?>
因此,在 php 中使用了 extends 保留字,加上良好的系統(tǒng)分析與完整的 crc 卡片 (詳見面向?qū)ο笙嚓P(guān)書籍) 設(shè)計之后,php 可變成擁有強大類能力的 cgi 語言。
php 由于是腳本語言 (script),因此程序源代碼可見,在軟件工程中的元件黑箱并不會在目前的 php 版本中出現(xiàn),也就是說,全部的類其實沒有隱藏起它的內(nèi)容。對于軟件業(yè)者而言,沒有辦法保護所謂的軟件 ic,站在開放團體而言,反而有源代碼是件好事,至于孰是孰非,就很難判定了,不過目前 php 還是 open source 團體的一份子,或許日后 zend 引擎可以做到類封裝的功能也不一定。
如對本文有疑問,請?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會為你解答??! 點擊進入論壇