2008-04 月份文章 顯示方式:簡文 | 列表

April 18,2008

[新知] 初探物件導向(二)

這幾天承蒙Jace的諄諄教誨,當初一知半解的物件導向現在總算是有些概念了!

承接上篇的繼承,多型是敘述繼承的狀態,解釋繼承的概念:由於子類別繼承於相同的父類別,因此由子類別建立的物件當然也繼承父類別的方法。而這種「不同物件卻有相同方法」的狀態,即是多型。

抽象類別,依照我的理解可以解釋為一個不能被New(建立)的父類別;當多個類別擁有許多共通的實體變數與方法時,就可以被獨立抽離出來成為一個抽象類別的概念。另外還有抽象方法,代表該方法不能被實作,但繼承該類別的子類別,此方法一定要被實作執行。

介面(interface)則類似抽象,但介面沒有實體變數,只有方法,而且該方法不能被實作(抽象方法),而是經由繼承(implements)自該介面的類別實作,且一定要被執行。

關於抽象與介面,Jace有非常簡潔的說明...不過這太簡潔了吧,不懂的人應該還是不懂?(還有另外一個關於「介面」的說明...)

Posted by taikobo0 at 18:32回應(0)引用(0)新知

[PHP] 表單輸入時對於HTML的過濾

在PHP中最常見的應用就是互動表單,因此接收用戶端資訊是非常常見的事!然而俗話說:「世風日下,人心不古」,這年頭誰知道用戶端的人在想些什麼?用戶端送出的資訊很有可能會包含一些惡意的語法,對於24小時暴露在網路環境的網站來說,時時刻刻都得小心防範駭客的攻擊,提升自我的資訊安全觀念非常重要。所以在接收用戶端資訊後,存入資料庫之前,都會先對其進行基本的過濾;第一個要判斷的就是HTML語法的攻擊!

許多惡意語法都是建立在HTML上,PHP本身有提供轉換HTML碼的函數:htmlspecialchars()htmlentities();其中htmlspecialchars()只會轉換HTML相關碼:
  • '&' => '&'
  • '"' => '"'
  • ''' => ''' 
  • '<' => '&lt;'
  • '>' => '&gt;'
htmlentities()則是把字串中所有字元做轉換,另外還可以設定轉換字串的編碼方式。還有一個函數:strip_tags()是直接把HTML的標籤整個過濾掉。

之前在題目試作/哇寶基本能力測試一文中,也有提到相關的觀念。另外附上那個時候google到的一個國外防止XSS的網頁:PHP XSS (cross site scripting) filter function,他有對HTML作是否可能被當作惡意的語法作判斷,不過測試後發現對中文的處理好像有點問題...就當作是英文的過濾函式吧~

Posted by taikobo0 at 18:07回應(0)引用(0)PHP

April 16,2008

[新知] 初探物件導向

說來慚愧,之前完全沒有注意物件導向的定義與使用;但是因為現在工作所使用的撰寫方式為全物件導向,這意味著我要重頭學起~從《深入淺出JAVA 第二版》開始!

事實上維基百科對於物件導向程式設計的介紹也非常完整,但是頂多也就這麼一個頁面的介紹,要把物件導向的全貌解釋清楚,還略嫌不足;當初看完整篇介紹,其實對物件導向仍是一知半解的狀態...

之前Jace就在如何學習ZendFramework的介紹文中推薦過《深入淺出JAVA 第二版》這本書。我目前先挑選書中對物件導向介紹的章節研讀:2、拜訪物件村;4、物件的行為;7、物件村的優質生活(繼承與多型);8、深入多形;9、物件的前世今生。目前已經讀完類別、物件、封裝與繼承的觀念;現在可以說是稍微有一點點概念了~

類別(class)他就像是一個規則、一個模子,物件(Object)則是利用這個規則、模子做出來的東西。類別只是規範,如果要在程式中使用的話,就一定得先New一個物件出來!類別包含實體變數(instance variables或稱屬性)與方法(method),也被稱作是狀態與行為;實體變數被用來記載此類別已知的事物,而方法則是用來說明類別執行的動作。類別所描述的是物件「知道什麼」與「執行什麼」!

狀態影響行為,行為影響狀態。方法可以引用實體變數的值作判斷,實體變數可以用參數的方式影響方法;而方法則可以利用的set或是get的方式,對實體變數作存取的動作。封裝的意義在於避免洩漏資料,為了不讓實體變數就這樣直接暴露在隨時隨地可以任意設定的狀況下,在習慣上會將實體變數標示為private,另外利用標示為public的方法setter與getter,對實體變數進行存取,也可在此同時進行限制及過濾。

繼承也是物件導向的特色之一。子類別可以用繼承的方式沿用父類別的實體變數及方法;唯父類別實體變數與方法的標示需為public或protect。A extends B意味著B的種類中含有A,B擁有的所有特性A也會有,然而A擁有的特性B並不一定會有;如白馬是馬,白馬跟馬一樣有長長的臉而且跑的很快,但是並不代表所有的馬都是白色的。子類別繼承父類別所有的方法,但是也可以依照子類別自己的需求,建立新方法;或是完全改寫繼承自父類別的方法(override),但實體變數不行。

Posted by taikobo0 at 9:45回應(0)引用(0)新知

April 15,2008

[新知] MVC的觀念

經由透視WebMVC的作者Jace親自講解,讓我稍微了解到什麼是MVC架構。透過一個簡單的留言版程式的範例解構,重新建立一個符合MVC架構的留言版程式。

依照過去一般留言版程式的撰寫模式,先將其分為二個部分:一個是業務邏輯、表現邏輯。業務邏輯(business)是指PHP控制與執行的部分;表現邏輯(present)則是指單純HTML或XML輸出呈現的部分。一但程式分為此二部分,表現邏輯就相當於View的部分;之後再將業務邏輯分成Model與Controller。

Model在留言版程式中所代表的角色,就有點像是「取得資料」這一部分;不論取得資料的方式是經由文字檔或是資料庫的連結讀出寫入,這一塊在MVC的架構中就相當於Model的部分。所以在範例的留言版程式中,Guestbook.php扮演的角色是用來與資料來源溝通的管道。

Controller在留言版程式中所代表的角色,就比較像是「操縱動作」這一部分;從留言版程式的功能面來說,分為選擇頁面(首頁/新增頁/RSS的XML頁面)、新增資料時取得的變數與重新導向。如果說Guestbook.php是與資料來源溝通的管道,Actions.php就像是觸發事件,以及運用Guestbook.php去產生動作的角色;當然最後所呈現的結果是View。所以Controller可以說是串聯Model與View的重要橋樑。

其後又提到一些物件導向的觀念,因為我這方面實在是很弱;所以整個聽下來有些吃力。在我粗淺的理解後導出的一個見解是:利用抽象化後繼承父類別的子類別,可以減少使用判斷式,以及更動到原有程式碼的機會。大概是這樣的意思吧?(抓頭)關於物件導向,Jace建議我看《深入淺出 Java 程式設計 第二版》這本書,我想我得好好花時間研究一下囉!

Posted by taikobo0 at 11:40回應(0)引用(0)新知

April 11,2008

[AJAX] 初探jQuery

因為哇寶在Ajax的應用上是採用jQuery,所以利用時間稍為了解一下。

我以往在處理Ajax時大部分是借用網上的範例JS檔,所以它通常都有一套制式的規範,哪裡要new,哪裡要丟參數,範例上都寫得清清楚楚,只要按部就班,通常都能很快達到我想要的功能。另外一種是土法煉鋼,自己造輪子;先從JS丟參數到php,再由php切我要的參數去跟伺服端Query我要的資料,最後呈現。這二種方式其實好像都不是正統的方式說...在看完jQuery的介紹後更是讓我有這樣的感覺~

網路上其實有很多淺顯易懂的介紹,我是看:國二學生認真打雜jQuery 學習心得筆記一系列文章稍微接觸jQuery這個Framework的。詳盡且生動有趣的介紹,讓我對jQuery有粗淺的認識!有興趣可以去逛逛~^^

Posted by taikobo0 at 11:29回應(0)引用(0)AJAX

April 6,2008

[PHP] ZendFramework 1.5.1安裝

ZendFramework是PHP的一個開發用框架,主要以PHP5作為撰寫時的基礎。要使用之前當然得先建立環境,以下是安裝的順序:參考「在Zend Framework上開發一個HelloWorld

1、首先先從ZendFramework的官方網站下在最新版本的ZendFramework 1.5.1;解壓縮後放在任意資料夾。我是放在「C:\ZendFramework」這個目錄下。

2、修改Apache httpd.conf設定:
(1)啟動 Apache的 .htaccess功能,搜尋「AllowOverride」 並將其設定為 All
(2)
開啟 LoadModule rewrite_module modules/mod_rewrite.so。

3、
修改PHP php.ini設定:
(1)設定include_path = ".;C:\ZendFramework"
(2)開啟extension=php_pdo.dll、extension=php_pdo_mysql.dll

重新啟動
Apache,如此一來基本的環境算是建置完成了。

Posted by taikobo0 at 22:22回應(0)引用(0)PHP

April 3,2008

[新知] Windows的伺服器環境架設

Windows環境下伺服器的安裝:apache_2.2.8-win32-x86-no_ssl.msiphp-5.2.5-Win32.zipmysql-essential-5.0.51a-win32.msiphpMyAdmin-2.11.5-all-languages-utf-8-only.zip

事實上在Windows環境下,我一直是用AppServ;簡單、快速、方便。但事實上各軟體之間的結合,是需要一些設定的。AppServ雖然提供一個很快就能上手的管道,然而他卻不是一個純粹乾淨的環境。那種感覺有點像是重灌時是用Ghost而不是一步步重新建立。

第一次一個一個軟體裝,完全架站手冊幫了我許多;或許裡面的版本有點舊了,不過基本的大方向是相同的。

1、首先先來看Apache的安裝與設定吧:

執行apache_2.2.8-win32-x86-no_ssl.msi->Next->Next->Next->localhost/localhost/E-mail->Custom Next->Next->Install->Finish

猴子也能學會的「軟體安裝Next」!安裝完成以後右下角的工具列會常佇一個Apache Monitor,表示安裝成功啦,可以從這裡控制Apache的服務。重點是設定啊,httpd.conf設定:

DirectoryIndex index.html index.htm index.php  //索引頁的設定

LoadModule php5_module "C:/PHP/php5apache2_2.dll"  //設定PHP5與Apache2.2的連接檔

<IfModule mod_php5.c>
  AddType application/x-httpd-php .php
  AddType application/x-httpd-php .php3
  AddType application/x-httpd-php-source .phps
</IfModule>  //設定Apache使用正確的方式處理 php 副檔名的檔案

2、PHP5的安裝與設定:

解壓縮php-5.2.5-Win32.zip->"C:\PHP\"->複製 php.ini-recommended 到 C:\WINDOWS 資料夾下並改名為 php.ini->複製 C:\PHP\libeay32.dll、C:\PHP\ssleay32.dll及C:\PHP\libmcrypt.dll至 C:\WINDOWS\System32 資料夾

這個有點複雜,因為要複製很多檔案到Windows的系統所在資料夾。php.ini設定:

extension_dir = "C:/PHP/ext"  //設定PHP延伸函式庫存放路徑

extension=php_curl.dll  //不知道
extension=php_gd2.dll  //圖片處理函式庫
extension=php_mbstring.dll  //字串編碼處理函式庫
extension=php_mcrypt.dll  //不清楚
extension=php_mysql.dll  //MySQL資料庫連接函式庫

3、MySQL5的安裝與設定:

執行mysql-essential-5.0.51a-win32.msi->Next->Complete Next->Install->Next->Finish->Configuration Wizard->Next->root 密碼->Execute->Finish

最後手動複製C:\Program Files\MySQL\MySQL Server 5.0\bin\libmySQL.dll 至 C:\WINDOWS\System32 資料夾。重新啟動Apache,建立一個phpinfo.php看看PHP5是否已在Apache環境中,MySQL是否運作正常。一切OK以後,再加上phpMyAdmin就完美啦!

4、phpMyAdmin的安裝與設定:

解壓縮phpMyAdmin-2.11.5-all-languages-utf-8-only.zip->"..\htdocs\phpmyadmin\"->複製 config.sample.inc.php 並改名為 config.inc.php

$cfg['blowfish_secret'] = '0123456789';  //設定cookie登入時的編碼參數

經由之前MySQL設定的root密碼,即可利用phpMyAdmin管理MySQl資料庫囉!


Posted by taikobo0 at 14:20回應(0)引用(0)新知
 [1]