亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP中的類

2024-09-04 11:50:02
字體:
來源:轉載
供稿:網友
    我覺得自從使用PHP以來最難以理解的概念就是PHP的類。我除了正在學習MySQL一些基本知識以外,對于其他的數據庫引擎沒有經驗。此前對于OOP面向對象編程我也沒有經驗,OOP對于我來說也是個新鮮事物,但是通過對其原理以及為何如此強大的理解,使我有了一定的我了解如果任何程序都用OOP來實現的話,無疑會得到一個強大的程序;但是對我而言,如果我只是認為自己了解了其中的機制,而不把這種理解應用到編程實踐,OOP對我來說將始終停留在紙上談兵的層次上。于是,幾天前,在利用常規的函數來實現一些功能時,我嘗試采用對象來實現,我發現的確這讓我的工作更加簡單了!于是我將這些經驗寫出來,希望能夠幫助象我一樣的人們。

類說穿了就是一些變量(OOP概念中的成員變量,譯者注)和一些操作處理這些變量的函數(OOP概念中的成員函數)的集合。它提供了一種在程序中以現實生活的形態來思考問題的方法,換句話說,就是描述了一個對象。反之,一個對象或者實例,就是這個類的真正實現。比如說我們要描述一輛自行車:一個合適的自行車類應該含有如下變量:$pedals(腳蹬),$chain(鏈條),$front wheel(前輪),$rear wheel(后輪),$brakes(剎車), and $handl_bars(車把)。你可以參考現實生活中對一輛自行車的操作來實現你的腳本。比如可以通過向函數Accelerate()傳遞一個$Braking_Force,并將這個變量應用于你所定義的實例的其他變量如$front_wheel, $rear_wheel,也可以返回操作的結果,從而實現相應的操作。

看起來很美,但是這些通過常規的函數和變量不是也能夠實現嗎?不錯,如果你的程序中只有一個自行車的實例,為它單獨定義一個類的確意思不大,但是如果你需要很多自行車實例的時候呢?但是你程序中的變量傳遞流會變得相當復雜,你得時時保證每個自行車實例指定的變量都正確的傳遞給了不同的函數。但是使用對象大大降低了你所傳遞的變量的數量,因為對象中的處理函數(所謂的方法method,譯者著。)自動的認定作用范圍就限制在本對象之內,那么它所能夠操作的對象也就限制在了對象范圍內。而且對象的定義可以非常容易的包含到不同的腳本只用,(在得到可重用性的同時)還從而保證了每一個自行車的在不同的腳本中工作方式都是一致的。

讓我們來創建一個實際的類,這個類我幾乎用在了我站點的每一個頁面中,也許你會從中發現值得參考的東西。

我不知道你是什么情況,但是對我來說,當我寫一個動態Web頁面的時候,我最痛恨的就是時不時要中斷對程序流程的思考,轉而思考HTML的合適的表現格式。這樣做的結果就是使我最終作出來的頁面缺少吸引力,因為我沒有那么多的精力去顧及字體、字號、背景、以及文字的顏色。解決方法就是:通過PHP類來實現對文本的格式化,從而實現HTML的輸出屬性定制。


我把這個類命名為“Style”。其中包含了如下一些對于設置HTML屬性至關重要成員變量:

<?php

class Style {

var $text;
var $alink;
var $vlink;
var $link;
var $bgcol;
var $face;
var $size;
var $align;
var $valign;

}

?>

我想你已經對于HTML語法相當熟悉了,以上的變量名就是他們在HTML語法中的名字。接下來我為類Style創建一個名稱為Style的成員函數。

<?php

class Style {

function Style ($text= "#000000",$alink= "#AA00AA",$vlink= "#AA00AA",$link= "#3333FF",$bgcol= "#999999",$face= "Book Antiqua",$size=3,$align= "CENTER",$valign= "TOP") {

$this->text=$text;
$this->alink=$alink;
$this->vlink=$vlink;
$this->link=$link;
$this->bgcol=$bgcol;
$this->face=$face;
$this->size=$size;
$this->align=$align;
$this->valign=$valign;

}

}
?>

當你在類中創建一個與類同名的成員函數時,這個函數會在你每次創建一個類的實例的時候被執行,該函數稱為構造函數。我利用這個機制,來使實現在每次創建一個對象的時候,自動的為每個HTML屬性變量賦予一個缺省值。

<?php $Basic = new Style; ?>

上面的語法"=new ClassName;”就是為類Style聲明了一個實例$Basic。

你可以在聲明一個類的實例的同時,通過傳遞參數的形式為類中的某個變量指定不同的值。但是即使你聲明只修改其中一個變量,也得通知指定其他成員變量的值。從這一點來說,類和常規函數是相同的。比如說你要為Style類中的text變量指定一個缺省值以外的值,其他的變量你也要指定一遍。不過這還有更簡單的方法(實際上這就是通常使用的方法,沒有什么新鮮的―譯者注),就是通過在類中加一個成員函數來改變其中類中某個變量的值:

<?php

Function Set($varname,$value) {

$this->$varname=$value;

}

?>

然后,我們通過如下的代碼就可實現對一個對象實例中指定變量值的修改。

<?php $Basic->Set( 'size', '2'); ?>

你必須使用”->”操作符以聲明是一個對象的變量或函數。上面的代碼就是告訴代碼解釋器”運行$Basic中的Set()成員函數”。解釋器就會知道,$Basic就是類Style的一個實例,因為我們此前已經聲明過了。同樣我們可以通過如下代碼引用一個實例的變量(如:$Basic->text)

讓我們創建一個表頭樣式對象,其屬性與缺省值有些不同。

<?php

$Theader= new Style;
$Theader->Set( 'text', '#0000FF');
$Theader->Set( 'bgcol', '#000000');

?>

到在這里,夠好了吧?現在我的表格頭有了藍色的文字和黑色的北京。我還想要我的表體相對于我的主頁而言有些輕灰,文字用黑色的,而表體中的文字要小一些,于是我可以:

<?php

$Tbody=new Style;
$Tbody->Set( 'bgcol', '#AAAAAA');
$Tbody->Set( 'size',2);

?>

相當不錯,現在我們還能夠用他來作什么呢?問得好!我很高興你會問這個問題。我們需要在類中再創建幾個成員函數來是Style可以用到任何HTML頁面對象中。首先我要做的就是,為我的頁面設置屬性,于是:

<?php

function Body() {

PRINT "<BODY BGCOLOR="$this->bgcol" ".
"TEXT="$this->text" ".
"LINK="$this->link" VLINK="$this->vlink" ".
"ALINK="$this->alink"> ";

}

?>

上述代碼,為我站點中的所有頁面設置了整體風格。其中還設計到了一個變量”$this”。我們在類中只用這個變量,解釋器會自動將其理解為我們在引用當前對象本身的一個成員變量。換句話說,$this變量在應用中與對象名稱(如本例中的$Basic)是等義的。你應該注意到我們在此所做的的確要比用常規函數來實現來得簡單。我們可以不用向函數傳遞變量而在函數中引用這個變量。而通常,常規函數是通過幾個全程變量數組才能夠實現這種機制的。不過需要聲明的是,所有對象的變量和成員函數的作用域都是在本對象范圍以內的。

試驗以下下面的PHP代碼(假設你已經包含了Style類,并為其創建了一個實例$Basic,然后頁面中已經有了 和 <HEAD></HEAD> 標簽)

<?php $Basic->Body(); ?>

這樣我們就可以輸出一些東西到頁面中了,我們可以采用傳統的方法,但我想做點不同的….(這個作者故弄玄虛,幽默過頭了―譯者注)這就是我用的另外一個成員函數TextOut:

<?php

function TextOut($message= " ") {

PRINT " "text">$message ";

}

?>

這個函數需要一個參數$message,$message是你要輸出的文字,該函數會以指定的屬性輸出這些文字。我們可以通過如下方法實現:

<?php

$Basic->TextOut( 'This is my test message');
$Tbody->TextOut( ' -- kinda neat, huh?');

?>

注意,由于這兩個函數中間沒有輸出回車換行<br>,所以結果將輸出到同一行上。而我還想要第二部分的字體更小一點,這個我在上面的$Tbody對象中已經聲明了,這樣比較安全,$Tbody與$Basic唯一的不同還有個$bgcol屬性,在這里沒有用到。注意到了程序聲明中的” ”嗎?這是用來在沒有參數傳遞給函數時函數,函數就輸出缺省的不間斷空格,原因后述。

到目前為止,我們的工作還沒有保存。最后的一個例子說明如何通過一種簡單的方法,來修改字體的顏色和或大小,即使在一個輸出語法的中間,也不需要改動整個類。我們加入如下的代碼:

<?php

function TDOut ($message= " ",$colspan=1) {

PRINT "<TD COLSPAN=$colspan BGCOLOR="$this->bgcol" ".
"ALIGN="$this->align" VALIGN="$this->valign">";
$this->TextOut($message);
PRINT "</TD>
";

}

?>

那么,講解就到此為止!記住我想讓我的表格有不同的背景顏色,我可以這樣實現:

<TABLE>
<TR>
<?php

$Theader->TDOut( "Name",2);
$Theader->TDOut( "Location",3);

?>
</TR>
<TR>
<?php

$Theader->TDOut( "Last");
$Theader->TDOut( "First");
$Theader->TDOut( "City");
$Theader->TDOut( "State/Province");
$Theader->TDOut( "Country");

?>
</TR>

這里,你可以看到colspan參數是如何起作用的,如果沒有聲明,將會有個缺省值1。于是在第一個行“Name”中,合并了2列;Location行合并了3列。第二行,所有的列都被合并成了一個。

我們通過如下方式來實現表體:

<TR>
<?php

$Tbody->TDOut( "Kreisler");
$Tbody->TDOut( "Rod");
$Tbody->TDOut( "Cortlandt");
$Tbody->TDOut( "New York");
$Tbody->TDOut( "USA");
?>
</TR>

但看起來似乎仍然有些繁瑣,我們是否可以節省更多的步驟?那么采用下面的函數:

<?php

function TROut($message) { /*And NO comments about fish, please! ;) */

PRINT "<TR>
";
$cells=explode( "|",$message);
$iterations=count($cells);
$i=0;
while ($i<$iterations) {
list($message,$span)=explode( ":",$cells[$i]);
if (strlen($message)<1) $message= " ";
if ($span){
$this->TDOut ($message,$span);
}else{
$this->TDOut ($message);
}
$i++;
}
PRINT "</TR>
";

}

?>

WOW!看起來有些繁瑣,我們來分解一下:

第3行根據”|”符號分解一個字符串,并且將分解出來的每個元素都放到數組$cell中。第四行取得數組的中數組元素的個數到$iterations;第6行開始一個循環處理數組中的每個元素。第7行以”:”作為分隔符分解一個數組元素,將其存儲到$message和$span中。第8行檢查$message是否有值。如果沒有就賦一個缺省值。第九行檢查有沒有$span(就是合并不合并單元格,通過$cell數據中冒號后還有$span來要確定),如果是這樣,第10行調用TDOut函數,傳遞$message和單元格個數參數;如果沒有第12行程序單純輸出$message信息(TDOut函數就用缺省值1來設置$colspan屬性)。最后,我們結束一個表格行(通過</tr>)。

或許你看了還有些糊涂(不糊涂才怪),到底如何傳遞給TROut參數才能包括所有的必要信息?正確地格式就是:celldata[:colspan]|celldata[:colspan]|......celldata[:colspan](用|分隔單元格,單元格中數據后跟:號分隔的合并單元格的數目來指定要擴展本單元格的個數―譯者注。)

所以,總結一下我們以前所作的工作,表頭和表體可以通過下面的調用來完成:

<TABLE>
<?
$Theader->TROut( "Name:2|Address:3");
$Theader->TROut( "First|Last|City|State/Province|Country");
$Tbody->TROut( "Rod|Kreisler|Cortlandt|New York|USA");
?>
</TABLE>

Wow!是不是非常的簡單?(實際上的確非常簡單,但是這個作者寫的還不足以讓人認識到這一點。也就是說給的例子缺乏說服力,我個人就覺得依靠TROut這行代碼,輸出一個行還不如樣式表來得簡單。作者起碼用一個BBS的例子來說明OOP在PHP中的用處才有意義。當然了,作為PHP中OOP的入門課程,本文也算生動了,而且各個方面講得也差不多。)。

如果有單元格中的數據存放在變量中的情況怎么辦?只要Join數組就可以了:

<?php

$message=join($arry, "|");
$Tbody->TROut($message);

?>

當然,你不能在一個Join中同時輸入列擴展的單元格數,但是你可以再用一個。假設你的數組包含6個元素,第3和第4行分別要擴展2個和3個單元格,你可以通過如下代碼實現將:#擴展格數參數指定到$message中

$newarray=$arry;
$newarray[2]=join(list($newarray[2],"2"),":");
$newarray[4]=join(list($newarray[4],"3"),":");
$message=join($newarray,"|");
$Tbody->TROut($message);

顯然,你可以加入更多的成員函數。如果有人有更好的想法,可以Email給我,我會封裝更多的代碼并發表出來。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
九九热这里只有精品免费看| 国产91精品久久久久久久| 欧美黄色片在线观看| 欧美大片免费看| 日韩成人av在线| 尤物tv国产一区| 日韩免费在线观看视频| 美女精品久久久| 91av视频在线观看| 日韩在线视频观看| 色无极影院亚洲| 91精品国产综合久久香蕉| 国产一区二区三区在线免费观看| 亚洲精品成人免费| 久久久久久久久久久人体| 精品一区二区三区三区| 精品在线小视频| 7777kkkk成人观看| 国产美女直播视频一区| 久久九九热免费视频| 亚洲缚视频在线观看| 国产精品色悠悠| 日韩av在线网址| 在线看国产精品| 亚洲男女自偷自拍图片另类| 久久视频在线看| 92版电视剧仙鹤神针在线观看| 成人两性免费视频| 亚洲第一视频网| 欧美精品久久久久久久久久| 欧美成人免费播放| 国产精品男女猛烈高潮激情| 伊人伊成久久人综合网站| 国产精品视频99| 国产精品美女午夜av| 午夜精品久久久久久久久久久久| 欧美精品18videos性欧美| 亚洲性夜色噜噜噜7777| 日本久久久久亚洲中字幕| 中文字幕在线日韩| 亚洲а∨天堂久久精品喷水| 欧美重口另类videos人妖| 欧美视频裸体精品| 国产精品电影观看| 久久手机精品视频| 亚洲欧美国产一区二区三区| 久久色在线播放| 992tv在线成人免费观看| 国模吧一区二区| 日韩中文娱乐网| 国产精品福利在线观看网址| 日韩视频免费大全中文字幕| 综合激情国产一区| 欧美人成在线视频| 精品久久久一区二区| 久久免费视频这里只有精品| 日韩电影在线观看免费| 另类图片亚洲另类| 国产精品91久久久久久| 91九色视频导航| 亚洲国产精品va在线看黑人动漫| 国产精品99久久久久久久久久久久| 成人午夜激情免费视频| 狠狠色狠色综合曰曰| www日韩中文字幕在线看| 欧美在线一区二区视频| 欧美激情区在线播放| 欧美激情伊人电影| 91久久精品一区| 狠狠爱在线视频一区| 亚洲三级黄色在线观看| 在线观看欧美成人| 最近2019年中文视频免费在线观看| 欧美在线视频在线播放完整版免费观看| 亚洲第五色综合网| 欧美激情精品久久久久久久变态| 5278欧美一区二区三区| 日韩经典中文字幕在线观看| 国产精品永久在线| 夜夜嗨av色综合久久久综合网| 一区二区三区在线播放欧美| 国产精品中文在线| 国产精品爽黄69天堂a| 中文字幕日韩综合av| 欧美性做爰毛片| 亚州欧美日韩中文视频| 欧美精品www| 成人女保姆的销魂服务| 97人洗澡人人免费公开视频碰碰碰| 成人性生交大片免费看小说| zzijzzij亚洲日本成熟少妇| 日韩国产高清视频在线| 国产精品第100页| 91香蕉电影院| 亚洲影院色在线观看免费| 国产欧美精品一区二区| 国产偷国产偷亚洲清高网站| 26uuu日韩精品一区二区| 国产成人精品av在线| 国产精品旅馆在线| 国产精品精品久久久久久| 在线视频中文亚洲| 国产精品久久久久久久久久尿| 57pao国产精品一区| 久久成年人免费电影| xxx成人少妇69| 国产xxx69麻豆国语对白| 国产欧美日韩综合精品| 亚洲一区二区三区四区在线播放| 国产91av在线| 国产精品久久久久久久久久久新郎| 日韩视频免费大全中文字幕| 欧美日韩在线观看视频小说| 久久国产精品久久久久久久久久| 久久久久久久久久久91| 日韩精品极品视频| 91精品国产自产91精品| 中文字幕亚洲精品| 91成人精品网站| 久久视频在线观看免费| 久久人人爽国产| 日韩网站在线观看| 日韩中文字幕在线观看| 欧美日韩中文字幕| 这里只有视频精品| 欧美国产日韩中文字幕在线| 国产男人精品视频| 992tv成人免费影院| 欧美性xxxx极品hd满灌| 亚洲欧美一区二区三区久久| 欧美日韩一区免费| 欧美日韩在线一区| 欧美国产视频一区二区| 亚洲精品资源美女情侣酒店| 欧美日韩免费网站| 亚洲一区中文字幕| 亚洲aaa激情| 欧美性xxxx在线播放| 免费99精品国产自在在线| 91老司机精品视频| 亚州国产精品久久久| 一区二区在线视频播放| 国产美女精彩久久| 国产裸体写真av一区二区| 在线播放国产一区中文字幕剧情欧美| 欧美一性一乱一交一视频| 色婷婷久久一区二区| 亚洲最大福利网站| 亚洲国内精品视频| 永久免费看mv网站入口亚洲| 久久99精品国产99久久6尤物| 在线视频欧美日韩精品| 亚洲精品成人免费| 亚洲色图日韩av| 中文字幕国内精品| 国产成人jvid在线播放| 91黄色8090| 国产精品露脸自拍| 亚洲免费小视频| 中文字幕精品在线视频| 国产精品久久久久久久av电影| 日韩精品亚洲视频| 国产亚洲精品久久久久久牛牛| 日韩av在线免播放器|