韌館-LearnHouse

Archive for the '程式&軟體' Category

[PHP]在HTML中顯示JpGraph

以下是Document文件說的以圖片的html tag <IMG>方式顯示

4.2 How to generate images with PHP

As a general rule each PHP script which generates an image must be specified in a separate file which is then called in an HTML <IMG> tag. For example, the following HTML excerpt includes the image generated by the PHP script in "fig1.php".

 <img src="fig1.php"  border=0 align=center width =300 height=200>

Strictly speaking the "align", "width" and "height" are not necessary but helps the browser position the image correctly before the image has been fully sent back to the browser.

The library will automatically generate the necessary headers to be sent back to the browser so that it correctly recognize the data stream received as an image of either PNG/GIF/JPEG format. The browser can then correctly decode the image

Observe that you can't return anything else than an image from the image script. By definition each HTML page (or more correctly each HTTP stream) can only consist of one mime type which is determined by the header for that particular stream.

A common mistake is to have a space in the beginning of the image script which the HTTP server will send back to the browser. The browser now assumes that the data coming back from this script is text since it hasn't received an explicit header. When then the image headers get sent back to the browser to forewarn the browser of the forthcoming image the browser will not like that as it has already assumed the data stream was a text stream. The browser will then give the infamous "Headers already sent error".

To include several images together with text on a page you need to have a parent page with several <IMG> tags which each refers to an image script (or the same image script with GET/POST data).

按照doc的作法,每要在html繪製一張圖表,就用一個<IMG>標籤指定該程式

但我試了幾個一樣也無法顯示,因此就修改了一下,改讓他先輸出png的圖片檔,再用<IMG>

首先先修改之前編寫的PHP script:

將原本的$graph->StrokeCSIM();  //從HTML中直接輸出圖片

改成
$graph_name = "路徑/檔名.png";
$graph->Stroke($graph_name);

再到要顯示的html頁面中加入<IMG>:

再加入<IMG>前要先把支前編寫的PHP script先include進來

<img src="images/test.png" width="600" height="850" /> 

寬度與高度要跟你在繪製圖表的PHP script指定的大小一樣 

Tips: 在開始html之前要先把寫好的繪圖的PHP script先include進來,而且最好用require_once("XXXX.php")的方式,避免重複include

2008年2 月 posted by admin in 程式&軟體 and have No Comments

[PHP]linux下使用jpgraph顯示中文字型

這個問題讓我花了快一個禮拜的時間,本來一度想放棄使用jpgraph改用圖片的放式來顯示圖表

但今天早上一醒來,覺得想想,我花了那麼多時間蒐集資料與測試

竟然在這一刻要我從找另一個方法,真的很不甘心

因此我又從新試了一次,把可能會導致無法顯示中文或是中文亂碼的可能原因,重新的排列組合

一個一個去修改核心程式碼,最後終於讓我歸類出幾個需要改的項目

由於改很多,有些已經忘記是我改的還是原本的了,所以以下方法是我覺得可能影響的幾個要改的項目 

1.修改src/jpgraph.php

require_once('jpg-config.inc.php');
require_once('jpgraph_gradient.php');
require_once('jpgraph_errhandler.inc.php');
require_once('jpgraph_ttf.inc.php');

// Version info
DEFINE('JPG_VERSION','2.3');

// Minimum required PHP version
DEFINE('MIN_PHPVERSION','5.1.0');

// Should the image be a truecolor image?
DEFINE('USE_TRUECOLOR',true);

//------------------------------------------------------------------------
// Automatic settings of path for cache and font directory
// if they have not been previously specified
//------------------------------------------------------------------------
if(USE_CACHE) {
    if (!defined('CACHE_DIR')) {
    if ( strstr( PHP_OS, 'WIN') ) {
        if( empty($_SERVER['TEMP']) ) {
        $t = new ErrMsgText();
        $msg = $t->Get(11,$file,$lineno);
        die($msg);
        }
        else {
        DEFINE('CACHE_DIR', $_SERVER['TEMP'] . '/');
        }
    } else {
        DEFINE('CACHE_DIR','/tmp/jpgraph_cache/');
    }
    }
}
elseif( !defined('CACHE_DIR') ) {
    DEFINE('CACHE_DIR', '');
}

if (!defined('TTF_DIR')) {
    if (strstr( PHP_OS, 'WIN') ) {
    $sroot = getenv('SystemRoot');
        if( empty($sroot) ) {
        $t = new ErrMsgText();
        $msg = $t->Get(12,$file,$lineno);
        die($msg);
        }
    else {
      DEFINE('TTF_DIR', $sroot.'/fonts/');
        }
    } else {
//    DEFINE('TTF_DIR','/usr/X11R6/lib/X11/fonts/truetype/');//修改成下面的路徑
    DEFINE('TTF_DIR','/usr/share/fonts/zh_TW/TrueType/');
    }
}

Tips: 要注意/usr/share/fonts/zh_TW/TrueType/下是否有.ttf或.ttc的字型,若沒有可從Windows系統的fonts去複製

 

2.修改src/jpg-config.inc.php

DEFINE('CHINESE_TTF_FONT','bkai00mp.ttf');

修改成DEFINE('CHINESE_TTF_FONT','mingliu.ttc');

Tips: 紅色的部份可依自己的喜好的字型修改,而字型的檔案要在上述的路徑裡面,這裡以新細明體mingliu.ttc為例

 

3.修改src/jpgraph_ttf.inc.php

        FF_CHINESE     =>   array(FS_NORMAL    =>CHINESE_TTF_FONT,
                  FS_BOLD    =>'',
                  FS_ITALIC    =>'',
                  FS_BOLDITALIC    =>'' ),
修改成

         FF_CHINESE     =>   array(FS_NORMAL    =>'mingliu.ttc',
                  FS_BOLD    =>'mingliu.ttc',
                  FS_ITALIC    =>'mingliu.ttc',
                  FS_BOLDITALIC    =>'mingliu.ttc' ),

 

4.再來就是呈現繪圖資訊的檔案了,可從Example的資料夾選擇想要的範例修改

$graph->title->Set("這裡這樣設定就可以直接顯示中文");
$graph->title->SetFont(FF_BIG5, FS_NORMAL);

Tips1:不過若是從資料庫取得utf-8的字串,要先轉成big5的編碼格式

下面範例是從資料庫取得utf-8字串後丟入陣列,陣列再轉成big5編碼,我去掉一些在資料庫上做擷取資料判斷的簡略程式片斷

for($i = 0 ; $i <= 10 ; $i++)
{
    $name[$i] = iconv("utf-8","big5",$name[$i]);
}

Tips2:轉換的動作不能寫在呈現繪圖資訊的php檔案中,不然會導致圖表無法顯示

 

最後再來說一個我遇到的問題,就是如何把SetLegends($name3)也能顯示中文

其中$name是從資料庫取得的utf-8轉big5的中文陣列

而要能在SetLegends顯示,就要加入$graph->legend->SetFont(FF_BIG5, FS_NORMAL);

這麼一來就能顯示中文了 

 

 

2008年2 月 posted by admin in 程式&軟體 and have Comment (1)

服務導向架構(Service-Oriented Architecture,SOA) 簡介

資料來源:http://www.cc.ntu.edu.tw

作者: 曾保彰 / 臺灣大學計算機及資訊網路中心資訊網路組


「以客為尊」的核心概念,提供網路服務單位建構一個具彈性、可重複使用的整合性介面,加速達到網路服務提升的目標。

前言
SOA是一種架構模型,由網站服務技術等標準化元件組成,目的是為企業、學校或提供網路服務單位建構一個具彈性、可重複使用的整合性介面,促進內外部如內部應用程式、用戶、與部門(系所)等相關單位完美的溝通,盡速達到網路服務提升的目標。何謂SOA?
我們常聴到 Information Technology (IT)產業的架構演進,由1980年代的主機(mainframe)架構,到1990年代的主從式(client server)架構,到1999年時是network centric架構,而到2004年時已複雜到所謂的 Service-Oriented Architecture架構(SOA,服務導向架構) 。此外也常聴到:如果企業不導入這個架構,企業在未來就會沒有競爭力。因此,本文將針對SOA作淺顯的簡介,也希望透過本文的介紹,對於本校網站服務技術(web services) 未來的架構有所幫助。
首先讓我們釐清一些SOA的迷思。正確來說 [1]:

  1. SOA不是新玩意:多年前即有資訊部門或公司成功地用SOA方式來建構、運行應用程式,且當時XML、web service都尚未提出。

  2. SOA不是種技術:它是種建構、組織的方法,用來建立應用程式的運行環境,以及讓學校的業務程式能以「功能化」方式發展、累積。

  3. 就算購買最新的XML、web services產品(如開發工具、執行平台、軟體元件等),也不表示就可以建構出SOA式的應用程式。

簡單來說,SOA是一種遵循典範,是針對學校或企業內應用程式的設計、開發、佈建、管理所提出的遵循典範。從資訊技術層面而言,一個執行學校或企業業務的 應用程式稱為一個獨立的「邏輯單位」,而對學校或企業營運層面而言則可稱為一項「服務」,在企業的整體運算環境中就存在著多個「獨立邏輯/業務服務」,且 需要對其進行妥善設計、開發、佈建、管理等,也因此需要採行服務導向架構(SOA)。

要 實現SOA,需要學校或企業的程式設計師改採「持續累積服務」的觀念與角度來開發應用程式,即便這麼做在短時間內看不到顯著好處,程式師還是必須跳脫、超 越過往對應用程式的想法,改以「既有服務可否再運用?」或者是「能否沿用其他同仁開發過的服務再建構?」的觀點來面對程式開發。

SOA 主張「程式開發技術」與「程式建構方法」的交替並用,以類似傳訊溝通的作法,將數個所需的「業務服務」進行連結,以此來實現一個新的應用程式,而非「從頭 開發」。透過適當的程式組構及傳訊式的程式連結,可讓學校或企業快速因應學生或用戶的需求與改變,新的應用程式只要透過「傳訊微調」即可實現,而非「重新 撰寫」。

SOA 不單只是程式開發的方法論,也提供行政管理層面的依循。例如它並非是以應用程式個體為角度來進行管理,而是直接將過往程式師開發出的程式視為「服務」來管 理。而對「服務」間的「互動傳訊」進行分析,SOA便可讓程式設計部門的主管瞭解何時該執行哪個業務邏輯,以及為何要執行,如此資訊管理者與分析師便可對 服務程序進行最佳化調適。

SOA如何運作?
SOA服務導向架構是一種新興的系統架構模型,主要概念是針對學校或企業需求組合而成的一組軟體元件。組合的元素通常包括:軟體元件、服務及流程三個部 份。當學校或企業面對外部要求時,流程負責定義外部要求的處理步驟;服務包括特定步驟的所有程式元件,而軟體元件則負責執行工作的程式。SOA 已成為現今軟體發展的重要技術,透過 SOA 讓異質系統整合變得容易,程式再使用度也提高。不必自行開發或擁有所有程式元件,發展者可以視其需要組合網路上最好的服務。不受限於特定廠商的產品功能或 是平台,達到真正的開放性(Openness)。從分散式元件架構到 SOA概念上,SOA 如同物件導向、軟體元件等軟體技術一般,運用小的零組件組合成應用系統。但 SOA 強調的是如何將彼此關係鬆散的應用系統功能元件在網路上發行、組合及使用。SOA 具有下列技術特性[2]:

  1. 分散式架構 (distributed)-SOA 的組成元件是由許多分散在網路上的系統組合而來,可能是區域網路,也可能是來自廣域網路。例如網站服務技術 (web services) 就是運作 HTTP來相互連結的 SOA。如此的作法,也使得網站服務技術很快的就成為所有支援網際網路的系統平台均能使用的技術。

  2. 關 係鬆散的界面 (loosely coupled)-傳統的系統主要是將應用系統功能需求切割成相互關聯的小零組件:模組、物件或元件,發展者要花費極大的心力了解零組件是如何設計及使 用,以確保不會違反零組件連接關係限制。如此一來,若要以不同零組件替換原始設計,就成為一件困難的事。SOA 的作法是以界面標準來組合系統,只要符合界面要求,零組件可以任意替換,大幅提高系統變更的彈性度。

  3. 依據開放的標準 (Open standard)-使用開放標準是 SOA 的核心特色,過去的軟體元件平台如 CORBA、DCOM、RMI、J2EE 採用專屬協定作為元件連結的規範,使得不同平台的元件無法相通。SOA 則著重於標準與互動性,將可避免不同平台 (.NET web services 與 Java web services) 開發程式間相互整合的困擾。

  4. 以流程角度出發 (process centric)-在建構系統時,首先了解特定工作的流程要求,並將其切割成服務界面(包括輸入與輸出資料格式),如此其他的發展者就可以依據服務界面開發 (或選擇) 合適的元件來完成工作。

最 後舉一個學校常用的例子來說明SOA在實際應用上帶來的可能性。假設我們要建立一個線上投稿的網站,網站提供的服務包括了線上投稿作業、論文分派作業、論 文審查作業、線上註冊及報名作業等。傳統的方式我們會儘快找一個類似的網站,再儘快將其他類似網站的原始碼(source code)拿來修改,但其他類似網站的原始碼所執行的平台有可能不是架站者所熟悉的作業系統。若要讓架站者作一個客製化,並符合自己投稿主題的線上投稿的 網站,可能要熟悉這個平台並修改網頁及測試,再加上別人的網站可能有一些bug,如果要做到毫無問題,除錯時間可能要花上三個月的時間。但是,如果我們導 入SOA的架構的話,可能將來只要花費心力將作業服務模組化、物件化或元件化,然後將它們整合到網站中即可,不需要再花費時間和資源自己去維護一個線上投 稿的網站,也不需要再自行建立和資料庫連結、報名付款機制等。這個網站就像是建立在SOA上,整合了這些web services元件的一個應用程式系統。更重要的是,透過如http、XML、SOAP 等產業標準開放式協定,不必擔心這些服務使用甚麼平台、甚麼技術來建立,而將來如果有更好的服務或服務提供者時,也可以輕易的將服務更換或更新。對系統開 發者來講,可以快速輕鬆的將系統建構完成,將心思專注在規劃更好、更完善的系統上;對服務提供者而言,只要能設計出一個好的服務,它的潛在使用者市場將不 再受到使用者平台的限制而有無限的可能。單就這類應用所呈現的美好遠景,應該可以解釋為什麼會到處聽到有人在談論SOA了。

因此 SOA 的實作,就是將所有程式邏輯及服務內容全部包裹在服務內部,並實作一個標準的介面與外部作溝通,這種做法跟傳統的元件導向做法非常類似,唯一的差別是介面定義的方式、資料格式、與溝通管道必須是產業標準 (http、XML、SOAP 等)。 也就是說只要能實作出這樣的介面,不論介面後面是什麼,都可使成為 SOA。
 

結論
綜合以上的介紹,SOA能帶來的幫助,有以下好處:
1.增加企業盈收,或提升學校的服務品質。
2.提供可變動的網路服務型態。
3.降低學校或企業的成本。
4.降低開發服務的時間。
5.整合學校或企業的網路服務技術資源。
6.降低整體風險及意外。
 

參考文獻
[1] http://dev2dev.bea.com.tw/techdoc/07soa/07soa_040812_01.htm
[2] http://www.microsoft.com/taiwan/msdn/columns/soa/SOA_overview_2004112901.htm

2008年1 月 posted by admin in 程式&軟體 and have No Comments

[Java]撰寫時的良好的習慣

標準的命名規則

  1. Package (套件)
    英文單字全部小寫,例如zoo.cute, java.lang
  2. Class (類別)
    每一個英文單字的第一個字母大寫,例如Animal, NationalChungChengUniversity
  3. Interface (介面)
    每一個英文單字的第一個字母大寫,規則和類別一樣
  4. Attribute (屬性)
    第一個英文單字的第一個字母小寫,其它單字的第一個英文字母大寫,例如legs, numberOfLegs
  5. Method (方法)
    規則和屬性一樣,不過要在後面加上小括號,例如eat(), eatMeat()
  6. Constant (常數)
    英文單字全部大寫,且兩兩單字之間用底線隔開,例如COUNT, MAX_COUNT

待續..........

 

參考資料

吉米兔的學習園地

2008年1 月 posted by admin in 程式&軟體 and have Comments (4)

[PHP]物件導向程式設計

資料來源:http://php.igt.com.tw/unit_111.htm

PHP 支援物件導向程式設計,雖然就純粹的物件導向程式設計的觀點來看,它的支援並不是很完整,但是,只要我們遵循良好的程式設計習慣,我們還是可以善用 PHP ,來開發物件導向的程式。

為什麼要使用物件導向的程式設計?

在 物件導向程式設計的觀念提出之前,軟體開發者,大多是使用結構化的程式設計。所謂結構化的程式設計,就是把問題切割成各個比較小的問題,比較小的問題,如 果還是複雜到無法以一個函式來解決時,就在切割成為更小的問題。直到可以用一個單一的函式來解決為止。每個函式處理個別的功能,主程式藉由呼叫各個函式, 來完成他的工作。

課程111:物件導向程式設計
摘要:


在這個課程中,我們將討論物件導向程式設計。首先,我們討論物件導向程式設計的觀念。接著,我們以實例來示範 PHP 物件導向程式設計的撰寫。然後,再把物件導向程式設計的方法,應用在留言版的程式中。

物件導向程式設計觀念


PHP 支援物件導向程式設計,雖然就純粹的物件導向程式設計的觀點來看,它的支援並不是很完整,但是,只要我們遵循良好的程式設計習慣,我們還是可以善用 PHP ,來開發物件導向的程式。

為什麼要使用物件導向的程式設計?

在 物件導向程式設計的觀念提出之前,軟體開發者,大多是使用結構化的程式設計。所謂結構化的程式設計,就是把問題切割成各個比較小的問題,比較小的問題,如 果還是複雜到無法以一個函式來解決時,就在切割成為更小的問題。直到可以用一個單一的函式來解決為止。每個函式處理個別的功能,主程式藉由呼叫各個函式, 來完成他的工作。

在前一個課程函式的應用, 我們應用了結構化的程式設計,將留言版的功能分割成各個函式,各網頁藉由呼叫各函式的方式,完成存取留言版資料的工作。使用結構化的程式設計,的確簡化了 我們撰寫程式的工作,也提高了程式的可維護性。但是,結構化程式設計在開發大型專案時,還是無可避免的碰到了他的瓶頸。因為,結構化的程式設計,專注於功 能面(函式)的開發,而往往忽略了功能所要處理的資料。被處理的資料與功能在結構化的程式設計是分離的關係。在大型專案的開發上,由於要處理的問題,相對 的要複雜許多,如果,資料與函式之間沒有關聯性,很容易發生錯誤,維護起來也很不方便。後來,物件導向程式設計的興起,就是為了解決,結構化程式設計所面 臨的資料與功能分離的問題。

物件導向程式設計的常用名詞:

  1. 屬性(Property):即物件裡的資料(變數)。
  2. 方法(Method):即物件裡的功能(函式)。
  3. 成員(Member):即類別裡所定義的變數或函式。
  4. 物件:類別的實例。
  5. 類別:物件的定義。由使用者所定義的資料型態。

物件導向程式設計的支柱

物件導向程式設計的三大支柱,稱之為 PIE(Polymorphism多變, Inheritance繼承, Encapulation封裝)。由於,PHP目前的版本只支援繼承及封裝,所以,我們在此,僅討論繼承與封裝。

所 謂封裝,就是把功能與資料包裝起來成為一個物件,並定義物件的介面。讓外界的程式,透過物件所提供的介面,來與這個物件溝通。外界的使用者,無須知道,物 件內部如何執行他的作業。只需要知道,如何使用物件的介面,來完成自己的工作即可。所以,設計物件的開發者,日後要更新物件的程式時,只要維持物件的介面 不變,便可以確保,使用這物件的外部程式,不需要改寫,一樣可以執行。而外界程式的開發者,只要遵循不直接存取物件內部的功能及資料,僅透過介面來使用物 件的規則,便可以確保程式執行無誤。

所謂繼承,就是子類別藉由繼承父類別的方式,取得父類別所定義的屬性及方法。通常,父類別會定義通用的屬性及方法,而子類別則延伸父類別定義特定的屬性及方法,以解決特定的問題。

如何使用物件導向程式設計來開發程式

使 用物件導向的方式來開發程式,最主要的關鍵,在於程式設計觀念的改變。之前,我們使用函式來開發留言版的時候,我們著重在於找出留言版應該具有的功能,然 後,按照功能來撰寫對應的函式。外界的網頁程式,把資料餵給這些功能,來完成它的工作。使用物件導向程式設計時,我們必須把程式所企圖解決的問題,看做是 一個獨立的個體。在這個個體中,包含了它應該處理的資料,以及處理這些資料的功能。這些功能是為了處理這些資料所產生的。所以,在撰寫留言版的程式時,我 們要把留言版當作是一個自給自足的個體。把程式所要解決的問題,定義成為個別的個體,這個過程稱之為抽象化(Abstraction)。

當 我們的腦子裡,有了這個個體所需要的資料以及功能後,我們就可以專注於定義這個個體的類別。把個體的資料,定義成類別的屬性;把個體的功能,定義成類別的 方法。在定義類別時,先別管外界的程式如何運作,全心全力專注於如何按照這個個體的需求,寫好這個類別。類別定義完之後,外界的程式,便可藉由物件變數, 來使用這個我們定義的類別(使用者定義的資料型態)。物件導向程式設計,名稱上雖然是物件,但是,實際上,程式設計師大部分的心力,在於找出問題中的個 體,定義這個個體的類別。使用這類別的程式部分,反而花的時間不多。

在下一節中,我們將使用實際的例子,來實作 PHP的物件導向程式設計。

 


PHP 物件導向程式設計實例演練


說明:

在這一節中,我們使用範例,來學習如何撰寫類別:

  1. 類別的語法結構。
  2. 封裝:定義屬性及方法。
  3. 使用物件:類別的實例化。
  4. 繼承。
一、類別的語法結構

class 類別名稱 [extends][父類別名稱]{

類別的定義

}

說明:

  1. 定義類別時,在 class 保留字之後,是使用者所定義的類別名稱。
  2. 如果,所定義的類別要繼承其他類別時,需加上 extends 保留字,然後,加上父類別的名稱。否則,省略 extends和父類別名稱。
  3. 之後是由 { 和 }所包圍的類別定義。在這裡,類別的定義,包括了屬性及方法。
二、封裝:定義屬性及方法。

class 類別名稱 [extends][父類別名稱]{

// 屬性的定義

var $變數名稱;

// 方法的定義

function 方法名稱([參數列]){

}

}

說明:

  1. 定義類別的個別屬性時,前面必須加 var 保留字。代表這變數是這個類別的屬性。
  2. 定義屬性時,可以給初始值。
  3. 定義方法時,規則同函式。
  4. 在方法中,如果要存取類別的屬性時,必須用 $this->變數名稱 這個格式。變數名稱在這裡,不可以加 $符號。
  5. 如果,類別中的方法名稱與類別名稱相同時,這個方法稱之為這個類別的建構方法。建構方法在類別被實例化時執行。類別實例化,說白一點,就是在外界的程式中,產生這個類別的物件變數。
範例:定義類別
<?php
/* 檔名:111_01.php
定義 Dog 類別
*/

class Dog{
var $food = '骨頭';
var $name;
     function Dog(){
echo '產生 Dog 類別的物件時,便會呼叫這個方法(建構方法)';
}
     function Eat(){
echo $this->name.'吃'.$this->food;
}
}
?>

三、使用物件:類別的實例化。
// 產生物件時
$物件變數名稱 = new 類別名稱;
// 呼叫物件方法或存取屬性時
$物件變數名稱->物件的方法或屬性;

說明:

  1. 要產生物件時,必須以一個變數來存放物件。
  2. 必須使用 new 保留字來產生物件。產生物件時,會執行這個物件的建構方法。
  3. 存取物件的屬性或呼叫物件方法時,物件與其成員之間,必須加 ->
  4. 物件的屬性之前,不可加 $ 符號。
範例:使用物件

程式碼:

<?php
/* 檔名:111_02.php
使用 Dog 類別
*/
// 含括 111_01.php 定義 Dog 類別的PHP檔
include_once('111_01.php');
// 產生 Dog 類別的物件
$mydog = new Dog;
$mydog->name = '來福';
echo '<br>';
$mydog->Eat();
?>
執行程式
四、繼承

說明:

  1. 當子類別繼承父類別時,子類別取得父類別所有的成員(屬性及方法)。
  2. 在子類別的方法,要呼叫父類別的方法時,使用 $this->父類別的方法名稱。
  3. 父類別通常只定義通用的成員。
  4. 子類別延伸父類別原有的功能,可另行定義專屬於子類別的功能。
  5. 當父類別的成員改變時,子類別的成員跟著改變。所以,藉著繼承的關係,可以讓我們的程式維護性大為提高。
範例:繼承

程式碼:

<?php
/* 檔名:111_03.php
定義 Pet, Dog, Cat 類別
*/
class Pet{
var $food;
var $name;
var $language;
     function Pet(){
echo '產生 Pet 類別的物件時,便會呼叫這個方法(建構方法)';
}
     function Eat(){
echo $this->name.'吃'.$this->food;
}
     function Speak(){
echo $this->name.'說'.$this->language;
}
}
class Dog extends Pet{
function Dog(){
$this->food = '骨頭';
$this->language = '汪汪';
echo '產生 Dog 類別的物件時,便會呼叫這個方法(建構方法)';
}
}
class Cat extends Pet{
function Cat(){
$this->food = '魚';
$this->language = '喵喵';
echo '產生 Cat 類別的物件時,便會呼叫這個方法(建構方法)<br>';
$this->Pet();
}
     function showFear(){
echo $this->name.'怕水';
}
}
?>
<?php
/* 檔名:111_04.php
使用 Dog, Cat 類別
*/
// 含括 111_03.php 定義 Pet, Dog, Cat 類別的PHP檔
include_once('111_03.php');
// 產生 Dog 類別的物件
$mydog = new Dog;
$mydog->name = '來福';
echo '<br>';
$mydog->Eat();
echo '<br>';
$mydog->Speak();
echo '<hr>';
$mycat = new Cat;
echo '<br>';
$mycat->Eat();
echo '<br>';
$mycat->Speak();
echo '<br>';
$mycat->showFear();
?>
執行程式

將物件導向程式設計應用在留言版的資料庫網頁


說明:

在這一節當中,我們將把物件導向程式設計,應用在留言版的網頁程式中。

我們按照以下的步驟,來修改留言版的程式:

  1. 準備工作
  2. 產生網站設定檔:web_config.php
  3. 產生資料庫類別檔:db.php
  4. 產生應用程式設定檔:app_config.php
  5. 產生留言版類別檔:Guestbook.php
  6. 修改原本的程式: index.php, add.php, update.php, delete.php
一、準備工作

說明:

將之前110課程所做好的PHP程式,放在另一個新的目錄 guestbook111 之下。然後,在網站的根目錄底下,建立一個 inc 的目錄。存放網站整體各項設定的檔案,以及存取資料庫物件的父類別檔案。

複製檔案:
  1. 使用putty連線到伺服主機。
  2. 輸入以下的命令,進入 public_html 目錄:
    cd public_html
  3. 輸入以下的命令,產生新的目錄 guestbook111,並將 guestbook110 中所有檔案,
    複製到guestbook111:
    cp -r guestbook110 guestbook111
  4. 輸入以下命令,產生新的目錄 inc。用來存放整體網站的設定檔及父類別檔。
    mkdir inc
  5. 輸入以下命令,產生 web_config.php 和 db.php 這兩個檔案。
    touch inc/web_config.php inc/db.php
二、產生網站設定檔:web_config.php

說明:

在 web_config.php 中,我們定義一些有關整體網站各含括目錄所需的參數,以及存取資料庫的設定,方便網站的管理者,日後修改網站的設定。

程式碼:

<?php
/* 檔名:web_config.php
定義各目錄及資料庫參數的常數
*/
// 定義網站目錄的設定
define(WEB_DIR, '/home/lib13/public_html/');
define(INCLUDE_DIR, WEB_DIR.'inc/');
// 定義資料庫的設定
define(DB_HOST, 'localhost');
define(DB_USER, 'lib13');
define(DB_PASSWORD, 'mypassword');
define(DB_DATABASE, 'lib13');
?>
三、產生資料庫類別檔:db.php

說明:

在 db.php 檔案中,我們定義存取資料庫的父類別,供網站中所有需要存取資料庫的類別繼承之用。在這個類別中,我們定義了資料庫連線及選用資料庫的方法 init()。同時,我們也擷取出存取資料庫的通用功能,分別依照功能定義成各種方法。透過繼承這個父類別,其他子類別就可繼承父類別的方法,無須再個別 定義存取資料庫的方法。子類別只需定義,個別類別所需的特定功能。這樣子的做法,一來,減輕修改程式的負擔,提高整個網站程式的維護便利性。二來,要新增 其他類似的資料庫網頁時,可以透過繼承父類別的方式,減少程式碼的撰寫,提高程式開發的效率。

程式碼:

<?php
/* 檔名:db.php
定義資料庫父類別,供其他需要存取資料庫的類別繼承之用。
*/
class DB{
var $add_sql;
var $update_sql;
var $delete_sql;
var $select_sql;
var $retrieve_sql;
     function DB(){
$this->init();
}
     function init(){
mysql_pconnect(DB_HOST, DB_USER, DB_PASSWORD)
|| die('無法與資料庫建立連結');
mysql_select_db(DB_DATABASE)
|| die('無法選擇資料庫:'.DB_DATABASE);
}
     function Add(){
$this->setSQL();
return mysql_query($this->add_sql);
}
     function Update(){
$this->setSQL();
return mysql_query($this->update_sql);
}
     function Delete(){
$this->setSQL();
return mysql_query($this->delete_sql);
}
     function Select(){
$this->setSQL();
return $this->recordset($this->select_sql);
}

function recordset($sql){
$rs = array();
$result = mysql_query($sql);
if($result){
while($record = mysql_fetch_assoc($result)){
array_push($rs, $record);
}
return $rs;
}else{
return false;
}
}
     function Retrieve(){
$this->setSQL();
$result = mysql_query($this->retrieve_sql);
if($result and mysql_num_rows($result) == 1){
return mysql_fetch_assoc($result);
}else{
return false;
}
}
}
?>
四、產生應用程式設定檔:app_config.php

說明:

app_config.php 這個檔案,定義了有關留言版所有網頁程式的設定。其他留言版的網頁,只需含括這個檔案,便可以使用定義好的各種設定。

藉由使用目錄來存放各相關子系統的方式,可以讓我們網站的功能模組化,日後需要增減功能時,只要新增或刪除目錄即可。在各目錄中,放置個別的 app_config.php 檔,來負責個別子系統的環境設定。這樣可以提昇各模組的可攜性,方便網站程式開發的管理。

程式碼:

<?php
/* 檔名:app_config.php
定義這個目錄所需的各項設定
*/
// 含括網站設定檔 web_config.php
include_once('../inc/web_config.php');
?>
五、產生留言版類別檔:Guestbook.php

說明:

Guestbook.php,定義了留言版所需要使用的類別 Guestbook。Guestbook類別藉由繼承父類別 DB,取得了存取資料庫的通用功能。所以,在這個類別,只要定義專屬於留言版的各種屬性及功能即可。

程式碼:

<?php
/* 檔名:Guestbook.php
定義 Guestbook 類別
*/
// 藉由含括子系統的設定檔,取得網站及子系統的各種設定
include_once('app_config.php');
// 含括父類別 db.php 
include_once(INCLUDE_DIR.'db.php');
class Guestbook extends DB{
// 定義屬性
/ 通常可以用所要存取的資料表的各個欄位,作為這個類別的屬性
var $id;
var $name;
var $email;
var $web;
var $content;
var $post_time;
var $fk_icon;
 // 類別的建構方法
function Guestbook(){
$this->DB();
}

// setProperties 方法用來連接表單的欄位以及類別的屬性
function setProperties(){
$this->id = $_POST[id];
$this->name = $_POST[name];
$this->email = $_POST[email];
$this->web = $_POST[web];
$this->content = $_POST[content];
}
 // setSQL 方法定義存取資料表所需的各個 SQL 命令
function setSQL(){
$this->add_sql = 'INSERT INTO Guestbook ";
$this->add_sql .= "(name, email, web, content, post_time) ';
$this->add_sql .= "VALUES('$this->name','$this->email','$this->web',";
$this->add_sql .= "'$this->content',NOW())";
$this->update_sql = "UPDATE Guestbook SET name='$this->name', ";
$this->update_sql .= "email='$this->email', web='$this->web', ";
$this->update_sql .= "content='$this->content' WHERE id=$this->id";
$this->delete_sql = "DELETE FROM Guestbook WHERE id=$this->id";
$this->select_sql = "SELECT * FROM Guestbook ORDER BY post_time DESC";
$this->retrieve_sql = "SELECT * FROM Guestbook WHERE id=$this->id";
}
}
?>
六、修改原本的程式: index.php, add.php, update.php, delete.php

說明:

在這裡,我們含括 Guestbook.php檔案。藉由產生 Guestbook的物件 $obj,按照各網頁程式所需要的功能, 透過 $obj物件,呼叫Guestbook所定義及繼承的各個方法。

index.php
add.php
update.php
delete.php
執行程式
2007年11 月 posted by admin in 程式&軟體 and have No Comments

安裝EclipseMe

參考來源:EclipseMe

在安裝之前,請先確認以下軟體是否已安裝

  1. Sun Java Wireless Toolkit 下載
  2. Eclipse 下載

官方提供的安裝方式也有兩種,一種是直接線上安裝,一種是下載後再安裝

我在這裡只列出直接安裝的部份,而且我是建議能不用中文化的Eclipse最好就不要用

畢竟以後可能會想裝一些plug-in,如果用中文化的很容易會產生其他的莫名問題

  1. 啟動Eclipse → Help menu → Software Updates → Find and install

  2. 選擇Search for new features to install:
    screenshot

  3.   點選 New Remote Site:
    screenshot

  4. 輸入以下資訊URL http://www.eclipseme.org/updates/
    screenshot

  5. 勾選EclipseME update site → Next
    screenshot

  6. 勾選EclipseME → Next.
    screenshot

  7. 選擇 I accept the terms of the license agreements → Next.
    screenshot

  8. 選擇你想要安裝的路徑: screenshot

  9. Install:
    screenshot

  10.  

    New installations screenshot
    Updates screenshot

    安裝好後會有 J2ME entry 在Window / Preferences
    screenshot

2007年10 月 posted by admin in 程式&軟體 and have No Comments