<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>色胚子部落 &#187; php</title>
	<atom:link href="http://blog.colorbase.tw/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.colorbase.tw</link>
	<description>訊息多變的時代裡，需要多學習多思考</description>
	<lastBuildDate>Mon, 15 Aug 2011 03:29:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>解決使用 jQuery.getJSON 時 Session 卻過期期的問題</title>
		<link>http://blog.colorbase.tw/web-development/1141</link>
		<comments>http://blog.colorbase.tw/web-development/1141#comments</comments>
		<pubDate>Sun, 20 Jun 2010 10:06:25 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/web-development/1141</guid>
		<description><![CDATA[當我們在做具有權限控管的網頁時，將會用到Session來做為是否已登入的紀錄及處理，通常在判斷為尚未登入時，將直接顯示錯誤訊息頁面或轉到登入表單頁面，但如果使用jQuery.getJSON()來做AJAX應用的話這樣的處理就不恰當了，因為這樣一來Session因為閒置過久而過期的話 getJSON() 將會得到非預期的結果而導致程式發生錯誤。
 
當然這種問題的解決的辦法有許多個，我們也可以在getJSON()取得資料後再判斷目前得到的資料是否正確，但這樣一來前端的程式碼將會顯得很囉嗦，因此解決辦法中有一個簡單又實用的就是直接取代 jQuery 的 getJOSN()，並搭配後端的對於不同請求給予不同的回應，來統一簡化整個判斷流程。
這裡主要用到了之前所提「使用 PHP 判斷 jQuery 傳來的 AJAX 請求類型」及「取代jQuery內置函數」兩種技巧。
在Javascript中寫入取代jQuery.getJSON()的函數：

(function($) {

	/**
	 * 取代 jQuery 的 JSON
	 */
	$.getJSON = function(url,paramData,callback){

		if($.isFunction(paramData)) {
			callback = paramData;
			paramData = null;
		}

		var opt = {
			url: url,
			dataType: 'json',
			cache: false,
			data: paramData,
			success: function(data, textStatus, XMLHttpRequest){

				if(null === data) return opt.error(XMLHttpRequest,textStatus);

				var handleError = false;

				if(data.TimeoutError != undefined ){
					if(data.TimeoutError == true){
						handleError = true;
						//提示錯誤訊息
						alert('您可能閒置過久，請重新登入系統再重試');
						//進一步轉向登入頁面
						window.location = '登入頁面URL';
					}
				}

				if(!handleError &#38;&#38; callback ...]]></description>
			<content:encoded><![CDATA[<p>當我們在做具有權限控管的網頁時，將會用到Session來做為是否已登入的紀錄及處理，通常在判斷為尚未登入時，將直接顯示錯誤訊息頁面或轉到登入表單頁面，但如果使用jQuery.getJSON()來做AJAX應用的話這樣的處理就不恰當了，因為這樣一來Session因為閒置過久而過期的話 getJSON() 將會得到非預期的結果而導致程式發生錯誤。</p>
<p> <span id="more-1141"></span>
<p>當然這種問題的解決的辦法有許多個，我們也可以在getJSON()取得資料後再判斷目前得到的資料是否正確，但這樣一來前端的程式碼將會顯得很囉嗦，因此解決辦法中有一個簡單又實用的就是直接取代 jQuery 的 getJOSN()，並搭配後端的對於不同請求給予不同的回應，來統一簡化整個判斷流程。</p>
<p>這裡主要用到了之前所提「<a href="http://blog.colorbase.tw/web-development/668" target="_blank">使用 PHP 判斷 jQuery 傳來的 AJAX 請求類型</a>」及「取代jQuery內置函數」兩種技巧。</p>
<p>在Javascript中寫入取代jQuery.getJSON()的函數：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:3f743993-4a17-479d-9727-3b783d8c652f" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">(function($) {

	/**
	 * 取代 jQuery 的 JSON
	 */
	$.getJSON = function(url,paramData,callback){

		if($.isFunction(paramData)) {
			callback = paramData;
			paramData = null;
		}

		var opt = {
			url: url,
			dataType: 'json',
			cache: false,
			data: paramData,
			success: function(data, textStatus, XMLHttpRequest){

				if(null === data) return opt.error(XMLHttpRequest,textStatus);

				var handleError = false;

				if(data.TimeoutError != undefined ){
					if(data.TimeoutError == true){
						handleError = true;
						//提示錯誤訊息
						alert('您可能閒置過久，請重新登入系統再重試');
						//進一步轉向登入頁面
						window.location = '登入頁面URL';
					}
				}

				if(!handleError &amp;&amp; callback != undefined) {
					callback(data, textStatus, XMLHttpRequest);
				}
			},
			error: function(XMLHttpRequest, textStatus, errorThrown){
				//提示錯誤訊息
				alert('連線發生錯誤！請檢查您的連線並重新嘗試');
			}
		};

		$.ajax(opt);

	};

})(jQuery);</pre>
</div>
<p>在PHP中給予不同回應：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d5938bc4-2520-4538-8d79-06c4ad512813" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">session_start();
if(!isset($_SESSION['login'])){ // 尚未登入
	if('application/json, text/javascript, */*' == $_SERVER['HTTP_ACCEPT']){
		//回應給取代後的getJSON()
		echo json_encode( array('TimeoutError' =&gt; true) );
	}else{
		//轉向登入頁面表單
		header('location: 登入頁面URL');
	}
}else{
	// 已登入的其他處理......
	echo json_encode( array('msg' =&gt; '取得訊息') );
}
</pre>
</div>
<p>之後一樣使用jQuery.getJSON()完全不變：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d2751d1b-d3cb-4e7c-81cb-4b78e3f1785d" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">$(function(){

	$('#test').click(function(){
		// 取得 JSON資料
		// 若已登入將顯示「取得訊息」
		// 若未登入或Session過期將顯示「您可能閒置過久，請重新登入系統再重試」
		$.getJSON('/index.php',function(data){
			alert(data.msg);
		});
	});

});</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/1141/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>使用 PHP 判斷 jQuery 傳來的 AJAX 請求類型</title>
		<link>http://blog.colorbase.tw/web-development/668</link>
		<comments>http://blog.colorbase.tw/web-development/668#comments</comments>
		<pubDate>Sun, 07 Mar 2010 08:49:35 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=665</guid>
		<description><![CDATA[今天看到 Detecting Ajax Events on the Server 這篇文章中提到一個有趣的好方法，當jQuery送出AJAX請求時會附上 X-Requested-With 請求檔頭，其值為「XMLHttpRequest」。
依據該文的描述在PHP中我們可以透過判斷 X-Requested-With 請求檔頭來分辨現在的請求是不是AJAX請求而給予不同的回應。
 
但這樣的判斷似乎不夠完整，在某些時候我們可能需要更進一步的判斷，jQuery所提供的AJAX方法不僅可以指定回傳的格式，它在送出AJAX請求時也會根據指定回傳格式的不同而傳出不同的Accept請求檔頭，因此在相同的概念下進一步聯想，其實我們還可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。
以下依據該文的描述透過判斷 $_SERVER[ 'HTTP_X_REQUESTED_WITH' ] 來分辨現在的請求是不是AJAX請求而給予不同的回應。    例如： 


if('XMLHttpRequest' === $_SERVER[ 'HTTP_X_REQUESTED_WITH' ]){
	// 回應 AJAX 請求，例如JSON格式
	echo json_encode(array('message' =&#62; 'hello'));
} else {
	// 回應一般請求，例如HTML格式
	echo 'hello';
}

當需要更進一步區分請求類型的不同時，將可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。
以下我整理出jQuery中各種不同的AJAX方法所傳出的「Accept」請求檔頭：

#table td{font-size:12px; background-color:#eeeeee}
#table th{font-size:12px; background-color:#999; color:#fff}



jQuery code
Accept header


$.getJSON(URL); 
$.ajax({url:URL, dataType :&#8217;json&#8217;});

application/json, text/javascript, */*


$.getScript(URL); 
$.ajax({url:URL, dataType :&#8217;script&#8217;}) ;
$.ajax({url:URL, dataType :&#8217;jsonp&#8217;}) ;

text/javascript, ...]]></description>
			<content:encoded><![CDATA[<p>今天看到 <a href="http://www.learningjquery.com/2010/03/detecting-ajax-events-on-the-server?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+LearningJquery+%28Learning+jQuery%29" target="_blank">Detecting Ajax Events on the Server</a> 這篇文章中提到一個有趣的好方法，當jQuery送出AJAX請求時會附上 X-Requested-With 請求檔頭，其值為「XMLHttpRequest」。</p>
<p>依據該文的描述在PHP中我們可以透過判斷 X-Requested-With 請求檔頭來分辨現在的請求是不是AJAX請求而給予不同的回應。</p>
<p> <span id="more-668"></span>
<p>但這樣的判斷似乎不夠完整，在某些時候我們可能需要更進一步的判斷，jQuery所提供的AJAX方法不僅可以指定回傳的格式，它在送出AJAX請求時也會根據指定回傳格式的不同而傳出不同的Accept請求檔頭，因此在相同的概念下進一步聯想，其實我們還可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。</p>
<p>以下依據該文的描述透過判斷 $_SERVER[ 'HTTP_X_REQUESTED_WITH' ] 來分辨現在的請求是不是AJAX請求而給予不同的回應。    <br />例如： </p>
</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterSmartContent">
<pre class="php:nogutter" name="code">if('XMLHttpRequest' === $_SERVER[ 'HTTP_X_REQUESTED_WITH' ]){
	// 回應 AJAX 請求，例如JSON格式
	echo json_encode(array('message' =&gt; 'hello'));
} else {
	// 回應一般請求，例如HTML格式
	echo '<strong>hello</strong>';
}</pre>
</div>
<p>當需要更進一步區分請求類型的不同時，將可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。</p>
<p>以下我整理出jQuery中各種不同的AJAX方法所傳出的「Accept」請求檔頭：</p>
<style type="text/css">
<p>#table td{font-size:12px; background-color:#eeeeee}
#table th{font-size:12px; background-color:#999; color:#fff}</style>
<table id="table" cellspacing="3" cellpadding="2" width="90%">
<tbody>
<tr>
<th width="50%" align="center">jQuery code</th>
<th width="50%" align="center">Accept header</th>
</tr>
<tr>
<td>$.getJSON(<strong>URL</strong>); </p>
<p>$.ajax({url:<strong>URL</strong>, dataType :&#8217;json&#8217;});</p>
</td>
<td>application/json, text/javascript, */*</td>
</tr>
<tr>
<td>$.getScript(<strong>URL</strong>); </p>
<p>$.ajax({url:<strong>URL</strong>, dataType :&#8217;script&#8217;}) ;</p>
<p>$.ajax({url:<strong>URL</strong>, dataType :&#8217;jsonp&#8217;}) ;</p>
</td>
<td>text/javascript, application/javascript, */*</td>
</tr>
<tr>
<td>$.get(<strong>URL</strong>);</td>
<td>*/*</td>
</tr>
<tr>
<td>$(&#8216;#result&#8217;).load(<strong>URL</strong>); </p>
<p>$.ajax({url:<strong>URL</strong>, dataType :&#8217;html&#8217;});</p>
</td>
<td>text/html, */*</td>
</tr>
<tr>
<td>$.ajax({url:<strong>URL</strong>, dataType :&#8217;xml&#8217;})</td>
<td>application/xml, text/xml, */*</td>
</tr>
</tbody>
</table>
<p>現在有了這個對照表，我們就可以根據Accept header來回應不同格式的結果：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterSmartContent">
<pre class="php:nogutter" name="code">switch ($_SERVER['HTTP_ACCEPT']){
	case 'application/json, text/javascript, */*':
		// 回應 JSON 格式
		break;
	case 'text/javascript, application/javascript, */*':
		// 回應 javascript 或 JSONP 格式
		break;
	case 'text/html, */*':
		// 回應 HTML 格式
		break;
	case 'application/xml, text/xml, */*':
		// 回應 XML 格式
		break;
}</pre>
</div>
<p>參考文章：<a href="http://www.learningjquery.com/2010/03/detecting-ajax-events-on-the-server?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+LearningJquery+%28Learning+jQuery%29" target="_blank">Detecting Ajax Events on the Serve</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/668/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lazybones PHP 開發框架 0.1 釋出</title>
		<link>http://blog.colorbase.tw/web-development/654</link>
		<comments>http://blog.colorbase.tw/web-development/654#comments</comments>
		<pubDate>Wed, 10 Feb 2010 17:03:52 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[作品分享]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[lazybones]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=654</guid>
		<description><![CDATA[最近因為需求而開始嘗試尋找一個合適的PHP開發框架，了解過幾個知名的框架之後發現每個框架都有其優點，但卻沒有符合我需求的框架，於是就便自行寫了一個開發框架，我把它命名為 Lazybones。
最後我決定以 new BSD license 釋出，希望可以讓有相同需求的人多個選擇。


Lazybones 吉祥物
名稱：藍惰蟲 (bluelazy)
分類：軟體生物
棲息地：每個人的心中
特性：可能促使宿主懶散不事生產，也可能促使宿主為了消除藍惰蟲所釋放的懶惰激素進而改進或創造新事物來滿足懶惰的慾望。
記得小時候被長輩罵懶時，總是以比喻的方式消遣「你是沒骨頭嗎？」
因此以這樣一個概念設計了這個沒有骨頭的生物「藍惰蟲」。
Lazybones 簡介
Lazybones 是一個微型PHP快速開發框架，它被設計的主要目的是減少小型架構網站所需撰寫的程式碼，加快開發的速度、增加可維護性，同時能兼具一定的執行的效能，努力在效能與核心功能間取得平衡點。
目前已實現的特色：

核心迷你，執行效能高
操作簡便，語法親和
MVC架構
具備可擴充性及開發彈性
存取控制清單 (ACL)
模型內建ORM
事件
URL路由器
視圖佈局
主題支援
資料驗證器
國際化


Lazybones 官方網站
Lazybones 討論區

]]></description>
			<content:encoded><![CDATA[<p>最近因為需求而開始嘗試尋找一個合適的PHP開發框架，了解過幾個知名的框架之後發現每個框架都有其優點，但卻沒有符合我需求的框架，於是就便自行寫了一個開發框架，我把它命名為 Lazybones。</p>
<p>最後我決定以 new BSD license 釋出，希望可以讓有相同需求的人多個選擇。<br />
<span id="more-654"></span><br />
<span class="thickbox"><img class="alignnone size-medium wp-image-655" title="bluelazy" src="http://blog.colorbase.tw/wp-content/uploads/2010/02/bluelazy.png" alt="" width="469" height="194" /></span></p>
<h2><strong><strong>Lazybones 吉祥物</strong></strong></h2>
<p>名稱：藍惰蟲 (bluelazy)</p>
<p>分類：軟體生物</p>
<p>棲息地：每個人的心中</p>
<p>特性：可能促使宿主懶散不事生產，也可能促使宿主為了消除藍惰蟲所釋放的懶惰激素進而改進或創造新事物來滿足懶惰的慾望。</p>
<p class="mgt10">記得小時候被長輩罵懶時，總是以比喻的方式消遣「你是沒骨頭嗎？」</p>
<p>因此以這樣一個概念設計了這個沒有骨頭的生物「藍惰蟲」。</p>
<h2><strong>Lazybones 簡介</strong></h2>
<p>Lazybones 是一個微型PHP快速開發框架，它被設計的主要目的是減少小型架構網站所需撰寫的程式碼，加快開發的速度、增加可維護性，同時能兼具一定的執行的效能，努力在效能與核心功能間取得平衡點。<br />
目前已實現的特色：</p>
<ul>
<li>核心迷你，執行效能高</li>
<li>操作簡便，語法親和</li>
<li>MVC架構</li>
<li>具備可擴充性及開發彈性</li>
<li>存取控制清單 (ACL)</li>
<li>模型內建ORM</li>
<li>事件</li>
<li>URL路由器</li>
<li>視圖佈局</li>
<li>主題支援</li>
<li>資料驗證器</li>
<li>國際化</li>
</ul>
<ul>
<li><a href="http://lazybones.colorbase.tw/" target="_blank">Lazybones 官方網站</a></li>
<li><a href="http://lazybones.colorbase.tw/forum/" target="_blank">Lazybones 討論區</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/654/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>網頁使用特殊字型的解決方案</title>
		<link>http://blog.colorbase.tw/web-development/651</link>
		<comments>http://blog.colorbase.tw/web-development/651#comments</comments>
		<pubDate>Tue, 15 Dec 2009 01:30:35 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[網頁設計]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=651</guid>
		<description><![CDATA[字型的兼容對於網頁設計而言是一個很頭痛的問題，如果在網頁中使用特殊字型，而訪客的電腦中沒有安裝這個字型，將會因為無法正確顯示字型而導致網頁的設計走味。因此一般在設計網頁的時候只能選擇通用的字型，如：Verdana, Geneva, sans-serif,Georgia這些芭樂到不行的字型，結果是可能會讓外觀大打折扣。

很久以前若要設計有字型樣式的文字，會用圖片來替代文字，但自從SEO觀念盛行之後，這個方法便不那麼恰當了，因為縱然使用alt或title屬性來加強描述也不是很被搜尋引擎建議的方法。
因為終極目標是除了外觀要美也要符合SEO的原則，所以目前最佳的解決之道便是「以純文字設計」，並於顯示時「替換為圖片、Flash或其他方式」。
為了解決這個困擾，曾經出現過很多不同的解決方案，在此介紹幾種已知的方法，每個方法各有利弊，實際應用時可以依照情況斟酌著使用。
1.CSS技巧 &#8211; Image Replacement
利用CSS耍點花招將文字隱藏，並以background屬性顯示圖片，來達到替換文字為「具有字體樣式的文字型圖片」效果，要將文字隱藏方法有很多，其中一個較簡便的方法就是利用text-indent將文字「縮」到看不見的地方。


#title{
	background: url(text.gif) no-repeat left top;
	width: 150px;
	height: 40px;
}

#title span{
	text-indent: -9999px;
}





	
文字

	



缺點：

如果想替換的地方很多的話，只能慢慢做到天荒地老、海枯石爛&#8230;.。
只能於設計階段手工製作，如果是動態產生的內容則無法使用這個方法。

優點：

不論是Client端或Server端都不需消耗額外的效能與資源（因為在設計階段，已經用設計人員的腦力與耐性抵消掉了&#8230;）

2. sIFR &#8211; Scalable Inman Flash Replacement
Flash所產生的SWF播放檔可以內嵌字體，sIFR就是利用這個特性，動態的以Javascript將文字用SWF元素替代，來達到呈現特殊字型的效果。
範例：
http://dev.novemberborn.net/sifr3/svn/test/distribution/demo/
相關網址：
官方網站：http://wiki.novemberborn.net/sifr/
sIFR3：http://novemberborn.net/sifr3
缺點：

內嵌中文字型將造成SWF非常肥大。

優點：

輕鬆簡單，Server端無需耗費額外硬體資源，Client端耗用資源幾乎可以忽略不計。

3. jQuery Flash Plugin &#8211; sIFR
sIFR功能是這個jQuery Plugin的其中一個功能，一樣也是利用SWF播放檔可以內嵌字體的特性來達成替代文字的效果。
相關網址：
http://jquery.lukelutman.com/plugins/flash/index.html
http://jquery.lukelutman.com/plugins/flash/example-text-replacement.html
範例：
http://jquery.lukelutman.com/plugins/flash/example-text-replacement.html
優缺點同sIFR。
4. cufon
這是相當有趣的一項技術，它提供一個產生器(PHP寫的)，能將字型檔案TrueType (TTF), OpenType (OTF), Printer Font Binary (PFB)，轉換為一個Javascript格式的字型檔(或者可以說它是一個javascript的字型定義檔)，再即時的利用javascript透過canvas 與 VML，動態於網頁中繪出字體，並取代對應的網頁元素。
相關網址：
http://cufon.shoqolate.com/generate/
http://wiki.github.com/sorccu/cufon
範例：
http://www.acidsmile.co.uk/
更多範例：http://wiki.github.com/sorccu/cufon/demos
優點：

預先轉換字型檔，把解讀的工作交給Client端，可節省Server的資源耗用。

缺點：

中文字型產生的檔案太大了！字型檔是用MB計算的。
IE6與IE7這兩個市佔率最高的大老不支援，IE8才支援。

5. facelift
使用PHP在Server端產生對應的圖片，並於前端用javascript替換對應的HTML元素。
http://facelift.mawhorter.net/
優點：

以圖片達成，因此沒有瀏覽器顯示支援的問題，也不需安裝任何Plugin(Flash是一種Plugin)。
訪客瀏覽時只需下載特換過的特殊字型圖片，沒有中文字型過大的問題。

缺點：

Server端的loading比較重，但它具有cache可以抵消掉很多負擔。
Server必須能執行PHP。

範例：
http://facelift.mawhorter.net/examples/
碎碎念一下：
中文的博大精深為我們奠定了深厚的文化基礎，但中文的繁雜在印刷術發明後已經吃過一次虧，現在又吃了一記悶棍，簡體字也仍然保留缺點，真可謂成也蕭何敗也蕭何啊！
]]></description>
			<content:encoded><![CDATA[<p>字型的兼容對於網頁設計而言是一個很頭痛的問題，如果在網頁中使用特殊字型，而訪客的電腦中沒有安裝這個字型，將會因為無法正確顯示字型而導致網頁的設計走味。因此一般在設計網頁的時候只能選擇通用的字型，如：Verdana, Geneva, sans-serif,Georgia這些芭樂到不行的字型，結果是可能會讓外觀大打折扣。</p>
<p><span id="more-651"></span></p>
<p>很久以前若要設計有字型樣式的文字，會用圖片來替代文字，但自從SEO觀念盛行之後，這個方法便不那麼恰當了，因為縱然使用alt或title屬性來加強描述也不是很被搜尋引擎建議的方法。</p>
<p>因為終極目標是除了外觀要美也要符合SEO的原則，所以目前最佳的解決之道便是「以純文字設計」，並於顯示時「替換為圖片、Flash或其他方式」。</p>
<p>為了解決這個困擾，曾經出現過很多不同的解決方案，在此介紹幾種已知的方法，每個方法各有利弊，實際應用時可以依照情況斟酌著使用。</p>
<h2><span style="color: #008080;">1.CSS技巧 &#8211; Image Replacement</span></h2>
<p>利用CSS耍點花招將文字隱藏，並以background屬性顯示圖片，來達到替換文字為「具有字體樣式的文字型圖片」效果，要將文字隱藏方法有很多，其中一個較簡便的方法就是利用text-indent將文字「縮」到看不見的地方。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
#title{
	background: url(text.gif) no-repeat left top;
	width: 150px;
	height: 40px;
}

#title span{
	text-indent: -9999px;
}
</pre>
</div>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">
<html>
	<body>
<h1 id="title"><span>文字</span></h1>

	</body>
</html>
</pre>
</div>
<p><span style="color: #008080;"><strong>缺點：</strong></span></p>
<ul>
<li>如果想替換的地方很多的話，只能慢慢做到天荒地老、海枯石爛&#8230;.。</li>
<li>只能於設計階段手工製作，如果是動態產生的內容則無法使用這個方法。</li>
</ul>
<p><span style="color: #008080;"><strong>優點：</strong></span></p>
<ul>
<li>不論是Client端或Server端都不需消耗額外的效能與資源（因為在設計階段，已經用設計人員的腦力與耐性抵消掉了&#8230;）</li>
</ul>
<h2><span style="color: #008080;">2. sIFR &#8211; Scalable Inman Flash Replacement</span></h2>
<p>Flash所產生的SWF播放檔可以內嵌字體，sIFR就是利用這個特性，動態的以Javascript將文字用SWF元素替代，來達到呈現特殊字型的效果。</p>
<p><span style="color: #008080;"><strong>範例：</strong></span></p>
<p><a href="http://dev.novemberborn.net/sifr3/svn/test/distribution/demo/" target="_blank">http://dev.novemberborn.net/sifr3/svn/test/distribution/demo/</a></p>
<p><span style="color: #008080;"><strong>相關網址：</strong></span></p>
<p>官方網站：<a href="http://wiki.novemberborn.net/sifr/" target="_blank">http://wiki.novemberborn.net/sifr/</a></p>
<p>sIFR3：<a href="http://novemberborn.net/sifr3" target="_blank">http://novemberborn.net/sifr3</a></p>
<p><span style="color: #008080;"><strong>缺點：</strong></span></p>
<ul>
<li>內嵌中文字型將造成SWF非常肥大。</li>
</ul>
<p><span style="color: #008080;"><strong>優點：</strong></span></p>
<ul>
<li>輕鬆簡單，Server端無需耗費額外硬體資源，Client端耗用資源幾乎可以忽略不計。</li>
</ul>
<h2><span style="color: #008080;">3. jQuery Flash Plugin &#8211; sIFR</span></h2>
<p>sIFR功能是這個jQuery Plugin的其中一個功能，一樣也是利用SWF播放檔可以內嵌字體的特性來達成替代文字的效果。</p>
<p><span style="color: #008080;"><strong>相關網址：</strong></span></p>
<p><a href="http://jquery.lukelutman.com/plugins/flash/index.html" target="_blank">http://jquery.lukelutman.com/plugins/flash/index.html</a></p>
<p><a href="http://jquery.lukelutman.com/plugins/flash/example-text-replacement.html" target="_blank">http://jquery.lukelutman.com/plugins/flash/example-text-replacement.html</a></p>
<p><span style="color: #008080;"><strong>範例：</strong></span></p>
<p><span style="color: #008080;"><strong></strong></span><a href="http://jquery.lukelutman.com/plugins/flash/example-text-replacement.html" target="_blank">http://jquery.lukelutman.com/plugins/flash/example-text-replacement.html</a></p>
<p>優缺點同sIFR。</p>
<h2><span style="color: #008080;">4. cufon</span></h2>
<p>這是相當有趣的一項技術，它提供一個產生器(PHP寫的)，能將字型檔案TrueType (TTF), OpenType (OTF), Printer Font Binary (PFB)，轉換為一個Javascript格式的字型檔(或者可以說它是一個javascript的字型定義檔)，再即時的利用javascript透過canvas 與 VML，動態於網頁中繪出字體，並取代對應的網頁元素。</p>
<p><span style="color: #008080;"><strong>相關網址：</strong></span></p>
<p><a href="http://cufon.shoqolate.com/generate/" target="_blank">http://cufon.shoqolate.com/generate/</a></p>
<p><a href="http://wiki.github.com/sorccu/cufon" target="_blank">http://wiki.github.com/sorccu/cufon</a></p>
<p><span style="color: #008080;"><strong>範例：</strong></span></p>
<p><a href="http://www.acidsmile.co.uk/" target="_blank">http://www.acidsmile.co.uk/</a></p>
<p>更多範例：<a href="http://wiki.github.com/sorccu/cufon/demos" target="_blank">http://wiki.github.com/sorccu/cufon/demos</a></p>
<p><strong><span style="color: #008080;">優點：</span></strong></p>
<ul>
<li>預先轉換字型檔，把解讀的工作交給Client端，可節省Server的資源耗用。</li>
</ul>
<p><span style="color: #008080;"><strong>缺點：</strong></span></p>
<ul>
<li>中文字型產生的檔案太大了！字型檔是用MB計算的。</li>
<li>IE6與IE7這兩個市佔率最高的大老不支援，IE8才支援。</li>
</ul>
<h2><span style="color: #008080;">5. facelift</span></h2>
<p>使用PHP在Server端產生對應的圖片，並於前端用javascript替換對應的HTML元素。</p>
<p><a href="http://facelift.mawhorter.net/" target="_blank">http://facelift.mawhorter.net/</a></p>
<p><span style="color: #008080;"><strong>優點：</strong></span></p>
<ul>
<li>以圖片達成，因此沒有瀏覽器顯示支援的問題，也不需安裝任何Plugin(Flash是一種Plugin)。</li>
<li>訪客瀏覽時只需下載特換過的特殊字型圖片，沒有中文字型過大的問題。</li>
</ul>
<p><span style="color: #008080;"><strong>缺點：</strong></span></p>
<ul>
<li>Server端的loading比較重，但它具有cache可以抵消掉很多負擔。</li>
<li>Server必須能執行PHP。</li>
</ul>
<p><span style="color: #008080;"><strong>範例：</strong></span></p>
<p><span style="color: #008080;"><strong></strong></span><a href="http://facelift.mawhorter.net/examples/" target="_blank">http://facelift.mawhorter.net/examples/</a></p>
<blockquote><p>碎碎念一下：</p>
<p>中文的博大精深為我們奠定了深厚的文化基礎，但中文的繁雜在印刷術發明後已經吃過一次虧，現在又吃了一記悶棍，簡體字也仍然保留缺點，真可謂成也蕭何敗也蕭何啊！</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/651/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>CSS撰寫的新觀念</title>
		<link>http://blog.colorbase.tw/web-development/644</link>
		<comments>http://blog.colorbase.tw/web-development/644#comments</comments>
		<pubDate>Sun, 11 Oct 2009 15:55:18 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS Framework]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=644</guid>
		<description><![CDATA[CSS是一個令人又愛又恨的樣式定義語言，除了有跨瀏覽器的問題，寫起來也是又臭又長又麻煩，於是我曾經尋找過一些CSS的解決方案，找到過一些純CSS的Framework，這些都不太能夠被我接受，因為那些Framework僅僅是定義一些通用的語法，彈性並不是很高，寫起來也不是很符合CSS的概念及原則，但最近一連串發現一些還算新的CSS編寫觀念及Framework，以程式語言的概念多加入一個編譯層使CSS的撰寫更人性化。

不是CSS3
CSS3是目前最新的CSS版本，增加了許多原本CSS2沒有的樣式定義，儘管如此它仍然只是侷限在樣式定義、選擇器的增強，對於CSS撰寫邏輯並沒有改變，因為這也不是CSS本身應該做的工作。
簡單不重複
經常在老外的文章看到他們似乎很喜歡且倡導兩個觀念：
DRY (Don&#8217;t Repeat Yourself)
沒錯，這才符合懶人的原則嘛！但認真說起來也不盡然是懶惰，能夠透過方法達到的事情，為何要自己重複？能夠交給電腦做的重複工作，為何要自己做？
KISS (Keep It Simple and Stupid)
如果一件事情可以把它簡單化，為何要把它搞的很複雜？我可不希望為了證明自己不笨而把事情搞的複雜、難做、難理解，反過來說，能夠透過方法把複雜的事情簡單化，或許才是真正的聰明。
改變你的CSS撰寫方式
在以前我們使用以下的方式寫CSS，單純的寫CSS，單純的被瀏覽器解析、渲染，這很正常也沒有什麼不對。

但現在可以改用增強型或稱新的CSS語法撰寫CSS，再透過編譯器的解析產生出符合規範的CSS語法交給瀏覽器，而編譯的過程可能是即時的，透過這樣的方式將會減輕許多CSS編寫的麻煩，也會讓編寫出來的CSS更容易維護。

幾款擁有新CSS語言的Framework
之前發現了一款好用的CSS Framework &#8211; CSScaffold，後來又發現了另兩款類似的CSS Framework &#8211; xCSS 與 Compass，而且似乎都繼承自一個名為SASS的CSS語法觀念，看來CSS的撰寫應該已經進入了另一個世代了。
CSScaffold
這是一款非常值得推薦的CSS框架，詳細說明請參閱上一篇文章：CSScaffold &#8211; 幫助建構複雜CSS的「鷹架」 
特色：

強化標準CSS語法



讓CSS語法可以有常數(Constant)。
讓CSS語法可以有函數(Function)，當然也可以傳參數(Parameter)，官方稱之為Mixins。
讓CSS語法可以巢狀結構(Nested Structure)。
讓CSS語法可以有插件(Plugin)。
讓CSS屬性可以用表達式(Expressions)指派其值。
讓CSS屬性可以用條件式(Conditionals)指派其值。



重複利用
CSS本身有一個可加強網頁撰寫時重複利用的特性，而CSScaffold讓這個特性更加明顯。


CSS結構化
標準的CSS語法常常會讓我們的CSS內容雜亂不堪難以維護，而CSScaffold可以降低這個困擾。

CSSaffold官方：http://wiki.github.com/anthonyshort/csscaffold
xCSS
xCSS，它強調物件導向的功能，它的靈感來自SASS 及OO CSS，雖然xCSS看起來相當不錯，但目前我感覺仍是CSScaffold的功能較強大且完善，目前xCSS僅在v0.9.4 (beta)測試階段，希望將來它可以再進一步增強它的功能性。
xCSS官方：http://xcss.antpaw.org/
特色：

CSS選擇器繼承（這是一個利用物件導向繼承特性加強重複利用的好方法）
巢狀子物件(Nesting child objects)或稱巢狀結構(Nested Structure)
變數(Variables) 與 CSScaffold的常數很像。

Compass
這是一款以Ruby實現SASS的CSS Framework，不同xCSS、CSScaffold的即時編譯，它必須使用命令列執行預先編譯，除了功能強大之外，另一個好處應該是不侷限在PHP上。
Compass官方：http://compass-style.org/
特色：

使用命令列執行編譯。
語法與SASS相同。
語法結構、功能相當完善。
預先編譯減少即時編譯的效能損耗

以下有一部作者錄的教學影片，有興趣的話可以看一下作者親身示範說明，但影片很大建議先下載再觀看（362 MB&#8230;XD）

Compass: A Real Stylesheet Framework from Chris Eppstein on Vimeo.
相關資料：

SASS (Syntactically Awesome Stylesheets)
SassLang
Object-Oriented CSS

]]></description>
			<content:encoded><![CDATA[<p>CSS是一個令人又愛又恨的樣式定義語言，除了有跨瀏覽器的問題，寫起來也是又臭又長又麻煩，於是我曾經尋找過一些CSS的解決方案，找到過一些純CSS的Framework，這些都不太能夠被我接受，因為那些Framework僅僅是定義一些通用的語法，彈性並不是很高，寫起來也不是很符合CSS的概念及原則，但最近一連串發現一些還算新的CSS編寫觀念及Framework，以程式語言的概念多加入一個編譯層使CSS的撰寫更人性化。</p>
<p><span id="more-644"></span></p>
<h2><span style="color: #008080;">不是CSS3</span></h2>
<p>CSS3是目前最新的CSS版本，增加了許多原本CSS2沒有的樣式定義，儘管如此它仍然只是侷限在樣式定義、選擇器的增強，對於CSS撰寫邏輯並沒有改變，因為這也不是CSS本身應該做的工作。</p>
<h2><span style="color: #008080;">簡單不重複</span></h2>
<p>經常在老外的文章看到他們似乎很喜歡且倡導兩個觀念：</p>
<p><strong><span style="color: #000000;">DRY (Don&#8217;t Repeat Yourself)</span></strong></p>
<p>沒錯，這才符合懶人的原則嘛！但認真說起來也不盡然是懶惰，能夠透過方法達到的事情，為何要自己重複？能夠交給電腦做的重複工作，為何要自己做？</p>
<p><strong><span style="color: #000000;">KISS (Keep It Simple and Stupid)</span></strong></p>
<p>如果一件事情可以把它簡單化，為何要把它搞的很複雜？我可不希望為了證明自己不笨而把事情搞的複雜、難做、難理解，反過來說，能夠透過方法把複雜的事情簡單化，或許才是真正的聰明。</p>
<h2><span style="color: #008080;">改變你的CSS撰寫方式</span></h2>
<p>在以前我們使用以下的方式寫CSS，單純的寫CSS，單純的被瀏覽器解析、渲染，這很正常也沒有什麼不對。</p>
<p><span class="thickbox"><img class="alignnone size-medium wp-image-647" title="傳統CSS編寫及瀏覽過程" src="http://blog.colorbase.tw/wp-content/uploads/2009/10/tradition_css.png" alt="" width="500" height="199" /></span></p>
<p>但現在可以改用增強型或稱新的CSS語法撰寫CSS，再透過編譯器的解析產生出符合規範的CSS語法交給瀏覽器，而編譯的過程可能是即時的，透過這樣的方式將會減輕許多CSS編寫的麻煩，也會讓編寫出來的CSS更容易維護。</p>
<p><span class="thickbox"><img class="alignnone size-medium wp-image-648" title="新的CSS編寫及瀏覽過程" src="http://blog.colorbase.tw/wp-content/uploads/2009/10/new_css.png" alt="" width="500" height="308" /></span></p>
<h2><span style="color: #008080;">幾款擁有新CSS語言的Framework</span></h2>
<p>之前發現了一款好用的CSS Framework &#8211; <a href="http://blog.colorbase.tw/programming/639">CSScaffold</a>，後來又發現了另兩款類似的CSS Framework &#8211; xCSS 與 Compass，而且似乎都繼承自一個名為<a href="http://sass-lang.com" target="_blank">SASS</a>的CSS語法觀念，看來CSS的撰寫應該已經進入了另一個世代了。</p>
<h3><span style="color: #008080;">CSScaffold</span></h3>
<p>這是一款非常值得推薦的CSS框架，詳細說明請參閱上一篇文章：<a href="http://blog.colorbase.tw/programming/639" target="_blank">CSScaffold &#8211; 幫助建構複雜CSS的「鷹架」 </a></p>
<h3><span><span style="color: #000000;">特色：</span></span></h3>
<ul>
<li><strong>強化標準CSS語法</strong></li>
</ul>
<ol>
<blockquote>
<li>讓CSS語法可以有常數(Constant)。</li>
<li>讓CSS語法可以有函數(Function)，當然也可以傳參數(Parameter)，官方稱之為Mixins。</li>
<li>讓CSS語法可以巢狀結構(Nested Structure)。</li>
<li>讓CSS語法可以有插件(Plugin)。</li>
<li>讓CSS屬性可以用表達式(Expressions)指派其值。</li>
<li>讓CSS屬性可以用條件式(Conditionals)指派其值。</li>
</blockquote>
</ol>
<ul>
<li><strong>重複利用</strong><br />
CSS本身有一個可加強網頁撰寫時重複利用的特性，而CSScaffold讓這個特性更加明顯。</li>
</ul>
<ul>
<li><strong>CSS結構化</strong><br />
標準的CSS語法常常會讓我們的CSS內容雜亂不堪難以維護，而CSScaffold可以降低這個困擾。</li>
</ul>
<p>CSSaffold官方：<a href="http://wiki.github.com/anthonyshort/csscaffold" target="_blank">http://wiki.github.com/anthonyshort/csscaffold</a></p>
<h2><span style="color: #008080;"><span><span>xCSS</span></span></span></h2>
<p>xCSS，它強調物件導向的功能，它的靈感來自<a href="http://sass-lang.com/" target="_blank">SASS</a> 及<a href="http://www.slideshare.net/stubbornella/object-oriented-css" target="_blank">OO CSS</a>，雖然xCSS看起來相當不錯，但目前我感覺仍是<a href="http://blog.colorbase.tw/programming/639">CSScaffold</a>的功能較強大且完善，目前xCSS僅在v0.9.4 (beta)測試階段，希望將來它可以再進一步增強它的功能性。</p>
<p>xCSS官方：<a href="http://xcss.antpaw.org/">http://xcss.antpaw.org/</a></p>
<h3><span style="color: #000000;">特色：</span></h3>
<ul>
<li>CSS選擇器繼承（這是一個利用物件導向繼承特性加強重複利用的好方法）</li>
<li>巢狀子物件(Nesting child objects)或稱巢狀結構(Nested Structure)</li>
<li>變數(Variables) 與 CSScaffold的常數很像。</li>
</ul>
<h2><span style="color: #008080;">Compass</span></h2>
<p>這是一款以Ruby實現SASS的CSS Framework，不同xCSS、CSScaffold的即時編譯，它必須使用命令列執行預先編譯，除了功能強大之外，另一個好處應該是不侷限在PHP上。</p>
<p>Compass官方：<a href="http://compass-style.org/" target="_blank">http://compass-style.org/</a></p>
<h3><span style="color: #008080;">特色：</span></h3>
<ul>
<li>使用命令列執行編譯。</li>
<li>語法與SASS相同。</li>
<li>語法結構、功能相當完善。</li>
<li>預先編譯減少即時編譯的效能損耗</li>
</ul>
<p>以下有一部作者錄的教學影片，有興趣的話可以看一下作者親身示範說明，但影片很大建議先下載再觀看（362 MB&#8230;XD）</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="225" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=4335944&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="225" src="http://vimeo.com/moogaloop.swf?clip_id=4335944&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a href="http://vimeo.com/4335944">Compass: A Real Stylesheet Framework</a> from <a href="http://vimeo.com/user1651762">Chris Eppstein</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<h2><span style="color: #008080;">相關資料：</span></h2>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Sass_%28stylesheet_language%29" target="_blank"><strong>SASS</strong> (Syntactically Awesome Stylesheets)</a></li>
<li><a href="http://sass-lang.com/" target="_blank">SassLang</a></li>
<li><a href="http://www.slideshare.net/stubbornella/object-oriented-css" target="_blank">Object-Oriented CSS</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/644/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CSScaffold &#8211; 幫助建構複雜CSS的「鷹架」</title>
		<link>http://blog.colorbase.tw/web-development/639</link>
		<comments>http://blog.colorbase.tw/web-development/639#comments</comments>
		<pubDate>Fri, 09 Oct 2009 17:20:04 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS Framework]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=639</guid>
		<description><![CDATA[今天發現一個好用的CSS的開發框架 &#8211; CSScaffold，瞭解完這個東西之後，我的感覺就如同官方提到的一句話「Simple, but powerful」，它是一款幫助撰寫CSS的快速開發框架，不同於許多CSS框架，它必須依靠PHP與Apache的mod_rewrite來執行，但也因為需要這兩種東西，讓CSScaffold變得很神奇、很方便，寫起CSS來又快又輕鬆！

ps. Apache的mod_rewrite不一定需要。
CSScaffold 的神奇之處：
強化標準CSS語法

讓CSS語法可以有常數(Constant)。
讓CSS語法可以有函數(Function)，當然也可以傳參數(Parameter)，官方稱之為Mixins。
讓CSS語法可以巢狀結構(Nested Structure)。
讓CSS語法可以有插件(Plugin)。
讓CSS屬性可以用表達式(Expressions)指派其值。
讓CSS屬性可以用條件式(Conditionals)指派其值。

重複利用
CSS本身有一個可加強網頁撰寫時重複利用的特性，而CSScaffold讓這個特性更加明顯。
CSS結構化
標準的CSS語法常常會讓我們的CSS內容雜亂不堪難以維護，而CSScaffold可以降低這個困擾。
CSScaffold 如何讓CSS變神奇的？
其實技術上它一點都不神奇&#8230;XD，說穿了他與PHP中的Smarty等等樣板引擎很像，但真正令人激賞的是他的概念。
它的運作原理就是在開發時原本直接寫CSS，變成寫 CSS 的樣板，然後在執行階段透過CSScaffold來編譯及抓取已經編譯好的CSS內容回傳給瀏覽器，有快取(Cache)的功能，因此整個執行的流程很像PHP中許多有Cache功能的樣板引擎。
因為透過CSScaffold這層的解析編譯，所以當然就會如同樣板引擎一樣，它訂製出自己的CSS樣板語法，而這它的語法基本上跟CSS 沒什麼兩樣，只是多了一些原本CSS 不提供的語法，使用上只需瞭解多出來的部分而不是重新學習CSS語法，因此也可以簡單的把它看做是CSS語法的改良進階版。
以下是CSScaffold官方的概念圖：

image from csscaffold
直接看官方教學介紹，簡單又明瞭



CSScaffold語法
來看幾個官方提供的語法介紹，瞭解一下CSScaffold的好用之處
常數(Constants)
大部分的程式語言都有常數這種東西，因此很容易理解，下面的例子body的color屬性會被替換成#555，常數最大的功能就是在於重複利用，也保持CSS屬性的一致性，以這個例子來說，如果以常數的方式撰寫，當需要更改文字顏色時，只需要更改常數的定義即可


/* 定義常數 */
@constants
{
text_color:#555;
color_1:#999;
}

body
{
/* 把color屬性設定為text_color常數 */
color:!text_color;
}


因此結果會是：


body
{
color: #555;
}


引入(include)
直接引入其他CSS檔案，增加重複利用的特性


/* 例如：引入常數定義檔 */
@include '/scaffold/snippets/constants.css';


巢狀結構(Nested Structure)
HTML本來就是巢狀的東西，而這東西更可以讓CSS結構化，編寫時不再混亂不堪，除了方便撰寫也有利於日後維護


#id
{
border:1px;

h1,h2,h3
{
color:red;

a div, blockquote, mark
{
margin:10px;
}

&#38;.span
{
padding:10px;
}
}
}


結果：
如果手工寫這些東西是很煩很累的&#8230;


#id
{
border: 1px;
}

#id h1,
#id h2,
#id h3
{
color: red;
}

#id h1 a div,
#id h1  blockquote,
#id h1  mark,
#id h2 a div,
#id h2  blockquote,
#id h2  mark,
#id h3 a div,
#id h3  ...]]></description>
			<content:encoded><![CDATA[<p>今天發現一個好用的CSS的開發框架 &#8211; CSScaffold，瞭解完這個東西之後，我的感覺就如同官方提到的一句話「<strong>Simple, but powerful</strong>」，它是一款幫助撰寫CSS的快速開發框架，不同於許多CSS框架，它必須依靠PHP與Apache的mod_rewrite來執行，但也因為需要這兩種東西，讓CSScaffold變得很神奇、很方便，寫起CSS來又快又輕鬆！</p>
<p><span id="more-639"></span></p>
<blockquote><p>ps. Apache的mod_rewrite不一定需要。</p></blockquote>
<h2><span style="color: #008080;">CSScaffold 的神奇之處：</span></h2>
<p><strong>強化標準CSS語法</strong></p>
<ul>
<li>讓CSS語法可以有常數(Constant)。</li>
<li>讓CSS語法可以有函數(Function)，當然也可以傳參數(Parameter)，官方稱之為Mixins。</li>
<li>讓CSS語法可以巢狀結構(Nested Structure)。</li>
<li>讓CSS語法可以有插件(Plugin)。</li>
<li>讓CSS屬性可以用表達式(Expressions)指派其值。</li>
<li>讓CSS屬性可以用條件式(Conditionals)指派其值。</li>
</ul>
<p><strong>重複利用</strong><br />
CSS本身有一個可加強網頁撰寫時重複利用的特性，而CSScaffold讓這個特性更加明顯。</p>
<p><strong>CSS結構化</strong></p>
<p>標準的CSS語法常常會讓我們的CSS內容雜亂不堪難以維護，而CSScaffold可以降低這個困擾。</p>
<h2><span style="color: #008080;">CSScaffold 如何讓CSS變神奇的？</span></h2>
<p>其實技術上它一點都不神奇&#8230;XD，說穿了他與PHP中的Smarty等等樣板引擎很像，但真正令人激賞的是他的概念。</p>
<p>它的運作原理就是在開發時原本直接寫CSS，變成寫 CSS 的樣板，然後在執行階段透過CSScaffold來編譯及抓取已經編譯好的CSS內容回傳給瀏覽器，有快取(Cache)的功能，因此整個執行的流程很像PHP中許多有Cache功能的樣板引擎。</p>
<p>因為透過CSScaffold這層的解析編譯，所以當然就會如同樣板引擎一樣，它訂製出自己的CSS樣板語法，而這它的語法基本上跟CSS 沒什麼兩樣，只是多了一些原本CSS 不提供的語法，使用上只需瞭解多出來的部分而不是重新學習CSS語法，因此也可以簡單的把它看做是CSS語法的改良進階版。</p>
<p>以下是CSScaffold官方的概念圖：</p>
<p><span class="thickbox"><img class="alignnone" title="CSScaffold概念圖" src="/wp-content/uploads/2009/10/scaffold-diagram1.png" alt="" width="500" height="417" /></span></p>
<p><a href="http://wiki.github.com/anthonyshort/csscaffold" target="_blank">image from csscaffold</a></p>
<p><strong>直接看官方教學介紹，簡單又明瞭</strong></p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="281" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=6175674&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="500" height="281" src="http://vimeo.com/moogaloop.swf?clip_id=6175674&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a href="http://wiki.github.com/anthonyshort/csscaffold" target="_blank"><br />
</a></p>
<h2><span style="color: #008080;">CSScaffold語法</span></h2>
<p>來看幾個官方提供的語法介紹，瞭解一下CSScaffold的好用之處</p>
<p><strong>常數(Constants)</strong><br />
大部分的程式語言都有常數這種東西，因此很容易理解，下面的例子body的color屬性會被替換成#555，常數最大的功能就是在於重複利用，也保持CSS屬性的一致性，以這個例子來說，如果以常數的方式撰寫，當需要更改文字顏色時，只需要更改常數的定義即可</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
/* 定義常數 */
@constants
{
text_color:#555;
color_1:#999;
}

body
{
/* 把color屬性設定為text_color常數 */
color:!text_color;
}
</pre>
</div>
<p>因此結果會是：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
body
{
color: #555;
}
</pre>
</div>
<p><strong>引入(include)</strong><br />
直接引入其他CSS檔案，增加重複利用的特性</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="c:nogutter">
/* 例如：引入常數定義檔 */
@include '/scaffold/snippets/constants.css';
</pre>
</div>
<p><strong>巢狀結構(Nested Structure)</strong><br />
HTML本來就是巢狀的東西，而這東西更可以讓CSS結構化，編寫時不再混亂不堪，除了方便撰寫也有利於日後維護</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
#id
{
border:1px;

h1,h2,h3
{
color:red;

a div, blockquote, mark
{
margin:10px;
}

&amp;.span
{
padding:10px;
}
}
}
</pre>
</div>
<p>結果：<br />
如果手工寫這些東西是很煩很累的&#8230;</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
#id
{
border: 1px;
}

#id h1,
#id h2,
#id h3
{
color: red;
}

#id h1 a div,
#id h1  blockquote,
#id h1  mark,
#id h2 a div,
#id h2  blockquote,
#id h2  mark,
#id h3 a div,
#id h3  blockquote,
#id h3  mark
{
margin: 10px;
}

#id h1.span,
#id h2.span,
#id h3.span
{
padding: 10px;
}
</pre>
</div>
<p><strong>混合器(Mixins)</strong><br />
這東西的概念有點像函數，又有點像樣板，可以傳入變數替換值</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
/* 定義混合器 */
=mixin-name(!param)
{
color:!param;
border: !param2 solid #eee;
}

#content
{
/* 使用混合器 */
+mixin-name(#eee);
padding:10px;
border:1px solid #eee;
}
</pre>
</div>
<p>因此結果會是：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
#content
{
color: #eee;
border: #eee2 solid #eee;
padding: 10px;
border: 1px solid #eee;
}
</pre>
</div>
<p><strong>混合器的巢狀用法：</strong></p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
/* 定義混合器 */
=mixin-name(!param)
{
.test!param{
color:#555;
}
}

/* 使用混合器 */
+mixin-name(1);

#content
{
/* 使用混合器 */
+mixin-name(1);
padding:10px;
border:1px solid #eee;
}
</pre>
</div>
<p>巢狀Mixins結果：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
.test1
{
color: #555;
}

#content
{
padding: 10px;
border: 1px solid #eee;
}

#content .test1
{
color: #555;
}
</pre>
</div>
<p><strong>表達式(Expressions)：</strong></p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
#id
{
padding:#[10*4]px;
}
</pre>
</div>
<p>結果：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
#id
{
padding: 40px;
}
</pre>
</div>
<p><strong>條件式(Conditionals)：</strong></p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
=column(!n, !last = false)
{
width:#[!n * 10]px;
/* 依據參數的不同設定不同的值 */
@if(!last === false)
{
margin-right:0;
}
@else
{
margin-right:10px;
}
}

.box
{
+column(2, true);
}
</pre>
</div>
<p>結果：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">
.box
{
width: 20px;
margin-right: 10px;
}
</pre>
</div>
<blockquote><p>目前條件式的解析似乎有些Bug</p></blockquote>
<p><strong>插件(Plugin)</strong><br />
官方預設提供了多個插件，並提供了<a href="http://wiki.github.com/anthonyshort/csscaffold/layout-plugin" target="_blank">排版插件(Layout Plugin)</a>使用教學，如果使用網格設計(Grid Design)的方式來編排CSS網頁，這個插件可以很方便快速的產出所需的CSS，當然除了官方提供的插件之外，也可以<a href="http://wiki.github.com/anthonyshort/csscaffold/plugin-development" target="_blank">自行設計插件</a>。</p>
<p>至此，應該可以了解到這個東西真的是Simple, but powerful，更多語法介紹及教學請至 <a href="http://wiki.github.com/anthonyshort/csscaffold" target="_blank">CSScaffold</a> 觀看</p>
<h2><span style="color: #008080;">相關連結</span></h2>
<ul>
<li><a href="http://wiki.github.com/anthonyshort/csscaffold" target="_blank">CSScaffold官方網站</a></li>
<li><a href="http://github.com/anthonyshort/csscaffold/downloads" target="_blank">CSScaffold下載</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/639/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[翻譯]如何使用單例設計模式(Singleton design pattern) for PHP</title>
		<link>http://blog.colorbase.tw/programming/625</link>
		<comments>http://blog.colorbase.tw/programming/625#comments</comments>
		<pubDate>Sun, 06 Sep 2009 07:48:16 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[翻譯]]></category>
		<category><![CDATA[設計模式]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=625</guid>
		<description><![CDATA[今天在找單例設計模式(Singleton design pattern)或稱單例模式(Singleton Pattern)的名詞解釋資料時，找到了一篇「How to use the Singleton design pattern」。
該作者使用簡短的描述、簡潔的範例，清楚的闡明單例設計模式的概念與使用方式，我覺得這篇文章很容易懂，很值得參考，因此將其翻譯成中文，由於我的英文能力不好，翻譯上若有謬誤的地方，還請多多指教。

How to use the Singleton design pattern
作者：Karl
出處：How to use the Singleton design pattern
翻譯：阿育
單例模式(Singleton Pattern)是四人幫(GoF,Gang of Four)設計模式之一。這個模式提供了一個將物件實例(instances)限制為單一實例的方法。若你過去曾使用過陌生的語法，這是一個很容易掌握的設計模式。
思考一下以下的類別(Class)：


class Database
{
    public function __construct() { ... }
    public function connect() { ... }
    public function query() { ... }
   ...]]></description>
			<content:encoded><![CDATA[<p>今天在找單例設計模式(Singleton design pattern)或稱單例模式(Singleton Pattern)的名詞解釋資料時，找到了一篇「<a href="http://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html" target="_blank">How to use the Singleton design pattern</a>」。</p>
<p>該作者使用簡短的描述、簡潔的範例，清楚的闡明單例設計模式的概念與使用方式，我覺得這篇文章很容易懂，很值得參考，因此將其翻譯成中文，由於我的英文能力不好，翻譯上若有謬誤的地方，還請多多指教。</p>
<p><span id="more-625"></span></p>
<h2><span style="color: #008080;">How to use the Singleton design pattern</span></h2>
<p>作者：<a href="http://www.talkphp.com/members/karl.html" target="_blank">Karl</a></p>
<p>出處：<a href="http://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html" target="_blank">How to use the Singleton design pattern</a><a href="http://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html" target="_blank"></a></p>
<p>翻譯：<a href="http://blog.colorbase.tw/about" target="_blank">阿育</a></p>
<p>單例模式(Singleton Pattern)是四人幫(GoF,Gang of Four)設計模式之一。這個模式提供了一個將物件實例(instances)限制為單一實例的方法。若你過去曾使用過陌生的語法，這是一個很容易掌握的設計模式。</p>
<p>思考一下以下的類別(Class)：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
class Database
{
    public function __construct() { ... }
    public function connect() { ... }
    public function query() { ... }
    ...
}
</pre>
</div>
<p>每當我們需要一個連線時，這個類別建立了一個資料庫連線的類別實例，例如：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
$pDatabase = new Database();
$aResult = $pDatabase->query('...');
</pre>
</div>
<p>假設我們在一個腳本的生命週使用上面的方法許多次，每當我們建立一個實例，也建立了一個新的資料庫物件（我們還建立了一個新的資料庫連線，但是以這個例子來說，這是沒必要的），同時也將耗費更多記憶體。</p>
<p>有時您可能想刻意建立多個類別實例，但在這裡我們不這麼做。</p>
<p>單例模式提供的方法便是去解決這個常見的問題。為了讓資料庫類別單一實例化，我們首先需要為這個類別添加一個新的屬性，我們將其命名為$m_pInstance：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
class Database
{
    // Store the single instance of Database
    private static $m_pInstance;

    ...
}
</pre>
</div>
<p>此屬性將被用來存儲資料庫類別的單一實例。需注意，這個屬性必須是靜態(static)的。</p>
<p>接下來，我們需要將構造函數(constructor或稱建構函數、建構子)的存取範圍改為私有(private)。這是經常混淆視聽的陌生語法。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
class Database
{
    // Store the single instance of Database
    private static $m_pInstance;

    private function __construct() { ... }
}
</pre>
</div>
<p>透過使用私有的構造函數，我們已經禁止了外部將類別實例化。因此如下面的程式碼將不可以被執行於類別之外。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
$pDatabase = new Database();
</pre>
</div>
<p>為了建立單例模式，我們現在需要增加一個方法。增加下面的方法到資料庫類別中：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
public static function getInstance()
{
    if (!self::$m_pInstance)
    {
        self::$m_pInstance = new Database();
    }

    return self::$m_pInstance;
}
</pre>
</div>
<p>這個看起來有趣的方法，它的責任是處理物件類別實例。請核對我們的靜態屬性$ m_pInstance，相對於此基本上這就容易理解了，如果建立資料庫物件透過呼叫建構函數，這是不合法的。請記住，我們已經讓__construct()方法成為私有的，所以物件實例的建立只能透過物件的方法。</p>
<p>這個方法函數最終將傳回一個靜態屬性的參照(reference)。在隨後呼叫了getInstance()將會回傳一個有效的$ m_pInstance參照，不會有新的物件實例被建立。</p>
<p>所以，我們的資料庫類別看起來差不多像這樣：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
class Database
{
    // Store the single instance of Database
    private static $m_pInstance;

    private function __construct() { ... }

    public static function getInstance()
    {
        if (!self::$m_pInstance)
        {
            self::$m_pInstance = new Database();
        }

        return self::$m_pInstance;
    }
}
</pre>
</div>
<p>現在你可以在專案中的任何地方使用資料庫類別實例（不使用全域變數或函數的參數）。</p>
<p>(譯按：當然，你必須Include這個class啦 XD)</p>
<p>下面是範例與比較：</p>
<p>我們通常使用這種的方式建立物件：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
$pDatabase = new Database();
$aResult = $pDatabase->query('...');
</pre>
</div>
<p>這則是單例模式所使用的方式：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
$pDatabase = Database::getInstance();
$aResult = $pDatabase->query('...');
</pre>
</div>
<p>結論，單例模式是一種易於使用的設計模式，它限制了類別實例的數量。</p>
<p>範例檔詳見<a href="http://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html" target="_blank">原文</a>的附加檔案。</p>
<h3><span style="color: #008080;">翻譯後記</span></h3>
<p>如同作者所提，單例設計模式是一種很容易理解且容易使用的一種設計模式，目的在於確保一個類別只有一個實例，並提供對該實例的全域存取。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/625/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>解決 PHP4 需要使用 json_encode 的問題</title>
		<link>http://blog.colorbase.tw/programming/560</link>
		<comments>http://blog.colorbase.tw/programming/560#comments</comments>
		<pubDate>Fri, 15 May 2009 11:28:28 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=560</guid>
		<description><![CDATA[PHP 5.2 之後才支援 JSON functions，如果要在PHP4中直接使用PHP5的 json_encode 與 json_decode，可以使用以下方法：
1. 下載梨子的JSON class，壓縮檔裡面有個JSON.php，不用安裝，直接放到相對應目錄底下即可。
http://pear.php.net/package/Services_JSON/download

2.加入以下Code


if(!function_exists('json_encode'))
{
	include('JSON.php');
	function json_encode($val)
	{
		$json = new Services_JSON();
		return $json->encode($val);
	}

	function json_decode($val)
	{
		$json = new Services_JSON();
		return $json->decode($val);
	}
}


如此一來，就可以在PHP4中使用json_encode 與 json_decode這兩個函數了
]]></description>
			<content:encoded><![CDATA[<p>PHP 5.2 之後才支援 JSON functions，如果要在PHP4中直接使用PHP5的 json_encode 與 json_decode，可以使用以下方法：</p>
<p>1. 下載梨子的JSON class，壓縮檔裡面有個JSON.php，不用安裝，直接放到相對應目錄底下即可。</p>
<p><a target="_blank" href="http://pear.php.net/package/Services_JSON/download">http://pear.php.net/package/Services_JSON/download</a></p>
<p><span id="more-560"></span></p>
<p>2.加入以下Code</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
if(!function_exists('json_encode'))
{
	include('JSON.php');
	function json_encode($val)
	{
		$json = new Services_JSON();
		return $json->encode($val);
	}

	function json_decode($val)
	{
		$json = new Services_JSON();
		return $json->decode($val);
	}
}
</pre>
</div>
<p>如此一來，就可以在PHP4中使用json_encode 與 json_decode這兩個函數了</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/560/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

