<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>石頭閒語-PHP</title>
<link>http://blog.roodo.com/rocksaying/archives/cat_242543.html</link>
<description>[Licensed by GNU FDL]
Rock&#039;s Saying 
遊手好閒的石頭成的部落格 
Open Your Mind, Use the Source! 
//
</description>
<language>zh-tw</language>
<generator>Roodo Blog System</generator>
<copyright>All Rights Reserved</copyright>
<atom:link href="http://blog.roodo.com/rocksaying/archives/cat_242543.xml" rel="self" type="application/rss+xml" />
<item>
	<title>PHPUnit 自定 TestSuite 輸出樣式，輸出為 HTML 網頁</title>
	<description><![CDATA[
	Tags: phpunit tdd

PHPUnit 預置了一個純文字型式的 TextUI Runner，在大多數情形下，它足夠應付我們的需求。不過，當我想要把 TestSuite 放到專案網頁上，讓小組成員 - 特別是 PM - 可以上網查看立即的測試結果時，那個文字型式的 TextUI Runner 就顯得太簡略了。至少要把測試工作及結果輸出成 HTML 的條列式清單，最好還加上顏色區別成功或失敗。


所幸 PHPUnit 提供了良好的擴充性，要自定一個可以將測試內容輸出為 HTML 網頁的 HTML Runner 相當簡單。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: phpunit tdd</div>
<p>
PHPUnit 預置了一個純文字型式的 TextUI Runner，在大多數情形下，它足夠應付我們的需求。不過，當我想要把 TestSuite 放到專案網頁上，讓小組成員 - 特別是 PM - 可以上網查看立即的測試結果時，那個文字型式的 TextUI Runner 就顯得太簡略了。至少要把測試工作及結果輸出成 HTML 的條列式清單，最好還加上顏色區別成功或失敗。
</p>
<p>
所幸 PHPUnit 提供了良好的擴充性，要自定一個可以將測試內容輸出為 HTML 網頁的 HTML Runner 相當簡單。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/5829661.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/5829661.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/5829661.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 08 Apr 2008 10:37:24 +0800</pubDate>
</item>
<item>
	<title>延續《分割程式功能以及 mix-in 和 include》的討論</title>
	<description><![CDATA[
	Tags: php mix_in

延續《分割程式功能以及 mix-in 和 include》的討論。tokimeki 說: 既然已經在外部定義了function，直接調用function不就好了嗎？ 

我直接委派函數的原因是 PHP 語法限制。用函數比用靜態成員函數(類別方法)或一般成員函數(個體行為)要容易寫。請看我在另一篇的回應: 這牽涉到 PHP 的動態能力限制。。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php mix_in</div>

<p>延續《<a href="http://blog.roodo.com/rocksaying/archives/5751881.html#comment-16075849">分割程式功能以及 mix-in 和 include</a>》的討論。tokimeki 說: <q>既然已經在外部定義了function，直接調用function不就好了嗎？</q></p> 
<p>
我直接委派函數的原因是 PHP 語法限制。用函數比用靜態成員函數(類別方法)或一般成員函數(個體行為)要容易寫。請看我在另一篇的回應: <a href="http://blog.roodo.com/rocksaying/archives/2884871.html#comment-4229555">這牽涉到 PHP 的動態能力限制。</a>。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/5763473.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/5763473.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/5763473.html</guid>
	<category>PHP</category>
	<pubDate>Thu, 27 Mar 2008 13:51:28 +0800</pubDate>
</item>
<item>
	<title>如何替使用 CodeIgniter framework 開發的程式進行 PHPUnit3 的單元測試</title>
	<description><![CDATA[
	Tags: CodeIgniter phpunit

先說一下 PHP framework 的事，我個人很想用 Zend Framework 。但我服務的公司的軟體是用 PHP4 開發的，所以主機也是跑 PHP4。由於遲遲不見有更新到 PHP5 的計劃，所以我現階是用 CodeIgniter framework 在寫新功能。


另一方面，我又習慣用 PHPUnit 進行測試工作。為此，我必須要弄一個簡單的測試框架出來，才能以 PHPUnit 去測試我用 CodeIgniter framework 寫的功能單元。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: CodeIgniter phpunit</div>
<p>
先說一下 PHP framework 的事，我個人很想用 Zend Framework 。但我服務的公司的軟體是用 PHP4 開發的，所以主機也是跑 PHP4。由於遲遲不見有更新到 PHP5 的計劃，所以我現階是用 CodeIgniter framework 在寫新功能。
</p>
<p>
另一方面，我又習慣用 PHPUnit 進行測試工作。為此，我必須要弄一個簡單的測試框架出來，才能以 PHPUnit 去測試我用 CodeIgniter framework 寫的功能單元。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/5751939.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/5751939.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/5751939.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 25 Mar 2008 18:27:39 +0800</pubDate>
</item>
<item>
	<title>關於分割程式功能以及 mix-in 和 include</title>
	<description><![CDATA[
	Tags: php reflection mix-in include

最近碰到一個分割程式功能的問題，不得已必須用到反映的功能，寫了一個簡單的抽象插件類別
http://blog.pixnet.net/HACGIS/post/15612808。
不知道你有沒有更好的解法？
tokimeki



關於這個問題，我是用所謂「混成(mix-in)」的概念實踐。先前我寫過2篇:
PHP 實踐 mix-in 概念、PHP 實踐 mix-in 概念 part 2。



另外一位網友是用 include ，參考:
mix-in?。嚴格來說那不是 mix-n ，稍後說明。這有3個缺點。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php reflection mix-in include</div>
<blockquote>
最近碰到一個分割程式功能的問題，不得已必須用到反映的功能，寫了一個簡單的抽象插件類別
http://blog.pixnet.net/HACGIS/post/15612808。
不知道你有沒有更好的解法？
<cite><a href="http://blog.roodo.com/rocksaying/archives/2728221.html#comment-16043575">tokimeki</a></cite>
</blockquote>

<p>
關於這個問題，我是用所謂「混成(mix-in)」的概念實踐。先前我寫過2篇:
<a href="http://blog.roodo.com/rocksaying/archives/2817003.html">PHP 實踐 mix-in 概念</a>、<a href="http://blog.roodo.com/rocksaying/archives/2884871.html">PHP 實踐 mix-in 概念 part 2</a>。
</p>

<p>
另外一位網友是用 <code>include</code> ，參考:
<a href="http://lp81sam.spaces.live.com/blog/cns!FE9AB5CD84013FC2!324.entry">mix-in?</a>。嚴格來說那不是 mix-n ，稍後說明。這有3個缺點。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/5751881.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/5751881.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/5751881.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 25 Mar 2008 17:59:23 +0800</pubDate>
</item>
<item>
	<title>Extend core libraries of CodeIgniter to detect the request file type and load applicable view</title>
	<description><![CDATA[
	Tags: CodeIgniter  

I extend core libraries of CodeIgniter to detect the request file type and load applicable view.
The other way is use URI Route, see '文件格式之 URI Route Rule 與 CodeIgniter 之實作示範'.


What I want to do is that if user request 'http://localhost/ci/blogs/index.xml',  it will try to load a view for XML. In other cases:


    If request 'blogs/index', load 'views/index.php' to render HTML document (default type).
    If request 'blogs/index.xml', load 'views/index.xml.php' to render XML document.
    If request 'blogs/index.pdf', load 'views/index.pdf.php' to render PDF document.
    and so on.
      

	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: CodeIgniter</div>  
<p>
I extend core libraries of <a href="http://codeigniter.com/">CodeIgniter</a> to detect the request file type and load applicable view.
The other way is use URI Route, see '<a href="http://blog.roodo.com/rocksaying/archives/5569813.html">文件格式之 URI Route Rule 與 CodeIgniter 之實作示範</a>'.
</p>
<p>
What I want to do is that if user request 'http://localhost/ci/blogs/index.xml',  it will try to load a view for XML. In other cases:
</p>
<ul>
    <li>If request 'blogs/index', load 'views/index.php' to render HTML document (default type).</li>
    <li>If request 'blogs/index.xml', load 'views/index.xml.php' to render XML document.</li>
    <li>If request 'blogs/index.pdf', load 'views/index.pdf.php' to render PDF document.</li>
    <li>and so on.</li>
</ul>      
		<a href="http://blog.roodo.com/rocksaying/archives/5573545.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/5573545.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/5573545.html</guid>
	<category>PHP</category>
	<pubDate>Thu, 21 Feb 2008 15:33:19 +0800</pubDate>
</item>
<item>
	<title>文件格式之 URI Route Rule 與 CodeIgniter 之實作示範</title>
	<description><![CDATA[
	Tags: php CodeIgniter

我習慣將控制元件行為的最後一個參數，設為文件(呈現內容)的"格式"，如使用者想要 XML 格式的回傳內容，則傳入 'xml'。例如:


程式定義:
  class Controller {
    function method( docType ) {
      // return result as a XML document.
    }
  }
  var controller = new Controller;

調用控制項時的 URI:
  controller/method/xml
  # invoke  controller->method('xml');

不過，我更喜歡將"文件格式"這個參數放在 URI 的副檔名部份。這部份我放在文章後段。
	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php CodeIgniter</div>
<p>
我習慣將控制元件行為的最後一個參數，設為文件(呈現內容)的"格式"，如使用者想要 XML 格式的回傳內容，則傳入 'xml'。例如:
</p>
<pre>
程式定義:
  class Controller {
    function method( docType ) {
      // return result as a XML document.
    }
  }
  var controller = new Controller;

調用控制項時的 URI:
  controller/method/xml
  # invoke  controller->method('xml');
</pre>
<p><em>不過，我更喜歡將"文件格式"這個參數放在 URI 的副檔名部份。這部份我放在文章後段。</em></p>		<a href="http://blog.roodo.com/rocksaying/archives/5569813.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/5569813.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/5569813.html</guid>
	<category>PHP</category>
	<pubDate>Wed, 20 Feb 2008 16:49:15 +0800</pubDate>
</item>
<item>
	<title>PHP如何取得虛擬主機名稱及瀏覽器適用的地區語文資訊</title>
	<description><![CDATA[
	
 在 HTTP 協定(RFC2612) 中提到， Host 可用於得知使用者存取主機資源時會使用的主機名稱，供 HTTP Server 判斷虛擬主機設置。Accept-Language 可用於得知使用者的地區語文清單。服務者可根據此清單內容，呈現最適用於使用者的地區語文內容。


在 PHP 中，可藉由全域變數 $_SERVER['HTTP_HOST'] 、 $_SERVER['SERVER_NAME'] 取得 Host 內容。$_SERVER['HTTP_ACCEPT_LANGUAGE'] 取得瀏覽器適用的語文清單。


HTTP_HOST, SERVER_NAME should be the same. However, SERVER_NAME looks like only available in Apache2.


	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
 在 HTTP 協定(RFC2612) 中提到， <var>Host</var> 可用於得知使用者存取主機資源時會使用的主機名稱，供 HTTP Server 判斷虛擬主機設置。<var>Accept-Language</var> 可用於得知使用者的地區語文清單。服務者可根據此清單內容，呈現最適用於使用者的地區語文內容。
</p>
<p>
在 PHP 中，可藉由全域變數 <var>$_SERVER['HTTP_HOST']</var> 、 <var>$_SERVER['SERVER_NAME']</var> 取得 Host 內容。<var>$_SERVER['HTTP_ACCEPT_LANGUAGE']</var> 取得瀏覽器適用的語文清單。
</p>
<p>
HTTP_HOST, SERVER_NAME should be the same. However, SERVER_NAME looks like only available in Apache2.
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/5540807.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/5540807.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/5540807.html</guid>
	<category>PHP</category>
	<pubDate>Thu, 14 Feb 2008 16:32:55 +0800</pubDate>
</item>
<item>
	<title>使用 CodeIgniter 作為開發框架並預期以 GPL 散佈應用軟體的作法</title>
	<description><![CDATA[
	Tags: php CodeIgniter gpl

CodeIgniter 使用自定的授權書, CodeIgniter License Agreement。基於授權內容， CodeIgniter 不能被 GPL 傳染 copyleft 特性。(因為 GPL 的授權方式使其他使用 GPL 源碼的軟體也必須採 GPL 散佈，故人們戲稱這是一種病毒傳染行為)。基於此種限制，我個人認為不能將 CodeIgniter 包裝為我們應用軟體的一部份。CodeIgniter 和我們的應用軟體應該分開散佈。亦即，使用者必須另外下載取得 CodeIgniter 源碼。


故我寫下這份記錄，以說明如何將採用 GPL 授權書的源碼與 CodeIgniter 的源碼隔離散佈。


有些人認為不必如此做。 CodeIgniter 的作者就認為沒有問題。不過我還是傾向於將兩者分開散佈，不將 CodeIgniter 包裝在一起。

	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php CodeIgniter gpl</div>
<p>
CodeIgniter 使用自定的授權書, <a href="http://codeigniter.com/user_guide/license.html">CodeIgniter License Agreement</a>。基於授權內容， CodeIgniter 不能被 GPL 傳染 copyleft 特性。(因為 GPL 的授權方式使其他使用 GPL 源碼的軟體也必須採 GPL 散佈，故人們戲稱這是一種病毒傳染行為)。基於此種限制，我個人認為不能將 CodeIgniter 包裝為我們應用軟體的一部份。CodeIgniter 和我們的應用軟體應該分開散佈。亦即，使用者必須另外下載取得 CodeIgniter 源碼。
</p>
<p>
故我寫下這份記錄，以說明如何將採用 GPL 授權書的源碼與 CodeIgniter 的源碼隔離散佈。
</p>
<p>
有些人認為不必如此做。 CodeIgniter 的作者就認為沒有問題。不過我還是傾向於將兩者分開散佈，不將 CodeIgniter 包裝在一起。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/4991789.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/4991789.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/4991789.html</guid>
	<category>PHP</category>
	<pubDate>Wed, 16 Jan 2008 17:32:21 +0800</pubDate>
</item>
<item>
	<title>TWPUG - cakephp換頁效能與架構回應之二</title>
	<description><![CDATA[
	Tags: php5 spl sql cakephp 記憶體管理
於 TWPUG 之回應內容，點擊連結參閱: 原文章串之回應內容。


本文內容主要討論 PHP 資料查詢函數的記憶體管理機制。


FIEND:

如果 我的 db 有 一千萬筆資料
我全部都要入 變數 再 count ...
應該會 error ....

1. count 陣列變數太誇張了..
我在 db 而且 findall 我己經下 limit 了說
塞入 變數 的想法 真的很酷 不敢用會被打死 .



FIEND 不了解查詢結果的記憶體管理機制。當 PHP 向 DB 查詢資料後，資料內容就已經被儲存在 PHP 這方的記憶體內容了。說的更明白些，例如: 
$resource = mysql_query($query);。此時 $resource 已經是一個儲存了查詢結果的變數(但型態不是陣列)。如果查詢結果有一千萬筆資料，那麼 $resource 就會配置那麼多的記憶體空間儲存那一千萬筆資料。接著再使用 mysql_fetch_array() 等方法取出個別資料記錄。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php5 spl sql cakephp 記憶體管理</div>
<p>於 TWPUG 之回應內容，點擊連結參閱: <a href="http://twpug.net/modules/newbb/viewtopic.php?topic_id=3094&post_id=11654#forumpost11653">原文章串之回應內容</a>。
</p>
<p>
本文內容主要討論 PHP 資料查詢函數的記憶體管理機制。
</p>
<blockquote>
FIEND:<br/><br/>

如果 我的 db 有 一千萬筆資料
我全部都要入 變數 再 count ...
應該會 error ....
<br/><br/>
1. count 陣列變數太誇張了..<br/>
我在 db 而且 findall 我己經下 limit 了說<br/>
塞入 變數 的想法 真的很酷 不敢用會被打死 .
</blockquote>

<p>
FIEND 不了解查詢結果的記憶體管理機制。當 PHP 向 DB 查詢資料後，資料內容就已經被儲存在 PHP 這方的記憶體內容了。說的更明白些，例如: 
<code>$resource = mysql_query($query);</code>。此時 <var>$resource</var> 已經是一個儲存了查詢結果的變數(但型態不是陣列)。如果查詢結果有一千萬筆資料，那麼 <var>$resource</var> 就會配置那麼多的記憶體空間儲存那一千萬筆資料。接著再使用 mysql_fetch_array() 等方法取出個別資料記錄。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/4903965.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/4903965.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/4903965.html</guid>
	<category>PHP</category>
	<pubDate>Thu, 10 Jan 2008 12:15:43 +0800</pubDate>
</item>
<item>
	<title>TWPUG - cakephp換頁效能與架構</title>
	<description><![CDATA[
	
本文起於 FIEND 於 TWPUG 上發表之《小弟寫的 cakephp 換頁 排序 功能》。


FIEND 寫道：

而 CAKEPHP 的架構 是很漂亮的 畢竟也是抄 ruby 的架構 .
雖然只做到三層式架構 將 : 
資料邏輯層 和 頁面邏輯層 清礎的切開運用 .


這說法挺奇怪的，基本上 "三層式" 只是概念性的說法，以有別於主從式架構明顯的二層結構，並不是 "只有三層"。所以後來更常見的說法是 n-Tier 或 "分散式架構"。"層數"並不是愈多愈好，因此它"雖然"只有三層，並不表示它做的比較差。


還有一點，三層式並不等於 MVC ，雖然同樣是分三塊。


	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
本文起於 FIEND 於 TWPUG 上發表之《<a href="http://twpug.net/modules/newbb/viewtopic.php?viewmode=flat&type=&topic_id=3094&forum=35">小弟寫的 cakephp 換頁 排序 功能</a>》。
</p>
<blockquote>
FIEND 寫道：

而 CAKEPHP 的架構 是很漂亮的 畢竟也是抄 ruby 的架構 .
雖然只做到三層式架構 將 : 
資料邏輯層 和 頁面邏輯層 清礎的切開運用 .
</blockquote>
<p>
這說法挺奇怪的，基本上 "三層式" 只是概念性的說法，以有別於主從式架構明顯的二層結構，並不是 "只有三層"。所以後來更常見的說法是 n-Tier 或 "分散式架構"。"層數"並不是愈多愈好，因此它"雖然"只有三層，並不表示它做的比較差。
</p>
<p>
還有一點，三層式並不等於 MVC ，雖然同樣是分三塊。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/4784725.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/4784725.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/4784725.html</guid>
	<category>PHP</category>
	<pubDate>Mon, 07 Jan 2008 16:19:29 +0800</pubDate>
</item>
<item>
	<title>PHP 可用命名慣例避免名稱衝突</title>
	<description><![CDATA[
	Tags: php5 namespace name_convention coding_standard

PHP5 目前不提供名稱空間(Namespace)功能，但普遍藉由命名慣例 (Name convention) 避免名稱衝突。名稱空間是語法功能；命名慣例則是編程技巧或準則(coding standard)。最常用的慣例是，把你的名號、公司名號或專案名號加在類別名稱前。例如 john 寫了一套 DB 層，那麼類別名稱當為 John_Db ；Xos 專案有一套 DB 層，那麼類別名稱當為 Xos_Db 。甚至於，要學 Java 以 domain name 為命名慣例 (Java 把這套命名慣例應用於 package) 也無不可，例如把類別名稱取作 Tw_Com_ABC_Db 。


在實際撰寫程式碼時，用命名空間和命名慣例的效果是差不多的。如下所示:


$o = new John::Db; //namespace:

$o = new John_Db; //name convention:


名稱空間只得一項好處，就是可以用關鍵字(using or import) 宣告預設名稱空間，讓程序員少打一些字。然而，即便語法支援名稱空間，老練的程序員仍然會採用上述的命名慣例為名稱空間命名，以避免名稱空間的名稱衝突(真拗口...)。

	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php5 namespace name_convention coding_standard</div>
<p>
PHP5 目前不提供名稱空間(Namespace)功能，但普遍藉由命名慣例 (Name convention) 避免名稱衝突。名稱空間是語法功能；命名慣例則是編程技巧或準則(coding standard)。最常用的慣例是，把你的名號、公司名號或專案名號加在類別名稱前。例如 john 寫了一套 DB 層，那麼類別名稱當為 John_Db ；Xos 專案有一套 DB 層，那麼類別名稱當為 Xos_Db 。甚至於，要學 Java 以 domain name 為命名慣例 (Java 把這套命名慣例應用於 package) 也無不可，例如把類別名稱取作 Tw_Com_ABC_Db 。
</p>
<p>
在實際撰寫程式碼時，用命名空間和命名慣例的效果是差不多的。如下所示:
</p>
<pre>
$o = new John::Db; //namespace:

$o = new John_Db; //name convention:
</pre>
<p>
名稱空間只得一項好處，就是可以用關鍵字(using or import) 宣告預設名稱空間，讓程序員少打一些字。然而，即便語法支援名稱空間，老練的程序員仍然會採用上述的命名慣例為名稱空間命名，以避免名稱空間的名稱衝突(真拗口...)。
</p>		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3855669.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3855669.html</guid>
	<category>PHP</category>
	<pubDate>Fri, 03 Aug 2007 02:59:57 +0800</pubDate>
</item>
<item>
	<title>TWPUG問答 - PHP5 個體指派動作的陷阱</title>
	<description><![CDATA[
	Tags: php reference object

前幾天在 TWPUG 上，有位網友提了一個問題。大意是如何以一個個體為正本，透過指派動作複製多次到陣列中，每個陣列元素的內容應該不相同。我看出他碰到了一個語言陷阱，我也回答了。可惜，我當時的答案是錯的... 我重新思索了一下，本文才是正解。


在 PHP5 之後，個體(object)的指派動作皆是使用參照。換言之，當指派來源的資料型態是object時， PHP5 就會用參照；故 $a = $o 的動作實際上等於 $a =&$o。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php reference object</div>
<p>
前幾天在 TWPUG 上，有位網友提了一個<a href="http://twpug.net/modules/newbb/viewtopic.php?viewmode=flat&type=&topic_id=2706&forum=13">問題</a>。大意是如何以一個個體為正本，透過指派動作複製多次到陣列中，每個陣列元素的內容應該不相同。我看出他碰到了一個語言陷阱，我也回答了。可惜，我當時的答案是錯的... 我重新思索了一下，本文才是正解。
</p>
<p>
在 PHP5 之後，個體(object)的指派動作皆是使用參照。換言之，當指派來源的資料型態是<dfn>object</dfn>時， PHP5 就會用參照；故 <code>$a = $o</code> 的動作實際上等於 <code>$a =&$o</code>。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/3686877.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3686877.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3686877.html</guid>
	<category>PHP</category>
	<pubDate>Thu, 19 Jul 2007 22:23:24 +0800</pubDate>
</item>
<item>
	<title>foreach 時使用 reference 的陷阱</title>
	<description><![CDATA[
	Tags: php foreach reference

前幾天在重構一段 PHP 程式碼時，不小心踩到 foreach 使用「參照(reference)」的陷阱。上網查了一下，似乎踩到的人還不少。我想了一下，把原因換成另一段程式碼形式說明，再說明解法。基本上，這是個 trick ，而不是 bug 。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php foreach reference</div>
<p>
前幾天在重構一段 PHP 程式碼時，不小心踩到 <code>foreach</code> 使用「參照(reference)」的陷阱。上網查了一下，似乎踩到的人還不少。我想了一下，把原因換成另一段程式碼形式說明，再說明解法。基本上，這是個 trick ，而不是 bug 。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/3669955.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3669955.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3669955.html</guid>
	<category>PHP</category>
	<pubDate>Mon, 16 Jul 2007 16:44:19 +0800</pubDate>
</item>
<item>
	<title>PHPUnit3 和 Makefile</title>
	<description><![CDATA[
	Tags: TDD phpunit make

在測試驅動開發的方式下，一個源碼 .php 搭一個測試案例碼 Test.php 的情形愈來愈常見了。而隨著軟體規模的擴大，源碼及對應的測試碼數量也愈來愈多。如果每次 commit 前都要一個不漏地跑完每個單元測試，未免太浪費時間了。畢竟沒有修改過的源碼，並不需要再跑一次單元測試。這時候就要藉助自動建置工具來幫我們簡化測試動作和時間。


本文利用 Make 這個傳統的軟體建置工具，提供一個簡單的 Makefile ，用於自動測試專案中相關項目。搭配的單元測試工具是 PHPUnit3 。

	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: TDD phpunit make</div>
<p>
在測試驅動開發的方式下，一個源碼 .php 搭一個測試案例碼 Test.php 的情形愈來愈常見了。而隨著軟體規模的擴大，源碼及對應的測試碼數量也愈來愈多。如果每次 commit 前都要一個不漏地跑完每個單元測試，未免太浪費時間了。畢竟沒有修改過的源碼，並不需要再跑一次單元測試。這時候就要藉助自動建置工具來幫我們簡化測試動作和時間。
</p>
<p>
本文利用 <a href="http://blog.roodo.com/rocksaying/archives/2145750.html">Make</a> 這個傳統的軟體建置工具，提供一個簡單的 Makefile ，用於自動測試專案中相關項目。搭配的單元測試工具是 <a href="http://www.phpunit.de/">PHPUnit3</a> 。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/3652965.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3652965.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3652965.html</guid>
	<category>PHP</category>
	<pubDate>Fri, 13 Jul 2007 16:17:47 +0800</pubDate>
</item>
<item>
	<title>PHP5 的個體導向能力問題 - magic methods 和 interface</title>
	<description><![CDATA[
	Tags: php spl interface magic_method

我這兩天和 racklin 討論 PHP 和 SPL 的內容。經過這兩天的討論，我覺得我們愈來愈了解現在 PHP 語言的特性與未來發展方向的議題了。


我們的討論重點圍繞在 PHP5 的 magic method 與 interface 兩方面的內容。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php spl interface magic_method</div>
<p>
我這兩天和 racklin <a href="http://blog.roodo.com/rocksaying/archives/3526951.html#comment-11071499">討論 PHP 和 SPL 的內容</a>。經過這兩天的討論，我覺得我們愈來愈了解現在 PHP 語言的特性與未來發展方向的議題了。
</p>
<p>
我們的討論重點圍繞在 PHP5 的 magic method 與 interface 兩方面的內容。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/3547207.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3547207.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3547207.html</guid>
	<category>PHP</category>
	<pubDate>Thu, 28 Jun 2007 16:14:29 +0800</pubDate>
</item>
<item>
	<title>Stack - Example for Operators of Array Overload</title>
	<description><![CDATA[
	Tags: php spl iterator overloading

實作一個 Stack 。具備下列特性:


  後進先出。
  順序走訪時，同樣按後進先出原則走訪。亦即由後往前走訪。
  可用索引運算子[]窺探 Stack 的內容。
  不允許用索引運算子改變 Stack 的內容。


本文之示範直接實作 Iterator, ArrayAccess, Countable 三個介面，而不繼承 ArrayIterator 等類別。ArrayIterator 類具有 sort() 等方法，但我並不打算對 Stack 進行排序，故我不繼承。若我繼承 ArrayIterator ，則我必須覆寫 sort 等方法，無此必要。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php spl iterator overloading</div>
<p>
實作一個 Stack 。具備下列特性:
</p>
<ol>
  <li>後進先出。</li>
  <li>順序走訪時，同樣按後進先出原則走訪。亦即由後往前走訪。</li>
  <li>可用索引運算子<code>[]</code>窺探 Stack 的內容。</li>
  <li>不允許用索引運算子改變 Stack 的內容。</li>
</ol>
<p>
本文之示範直接實作 Iterator, ArrayAccess, Countable 三個介面，而不繼承 <code>ArrayIterator</code> 等類別。ArrayIterator 類具有 sort() 等方法，但我並不打算對 Stack 進行排序，故我不繼承。若我繼承 ArrayIterator ，則我必須覆寫 sort 等方法，無此必要。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/3542135.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3542135.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3542135.html</guid>
	<category>PHP</category>
	<pubDate>Wed, 27 Jun 2007 10:41:14 +0800</pubDate>
</item>
<item>
	<title>SPL:Use ArrayObject and ArrayIterator to Overload Operators of Array</title>
	<description><![CDATA[
	Tags: php spl arrayobject iterator overloading magic_method

If you want to design a class and make it's behavior as an array, you may extend ArrayObject. Also this new class probably need to use an instance of class which extends ArrayIterator (Note: ArrayIterator is a class, not an interface).


This feature requires PHP 5. 

	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php spl arrayobject iterator overloading magic_method</div>
<p>
If you want to design a class and make it's behavior as an array, you may extend ArrayObject. Also this new class probably need to use an instance of class which extends ArrayIterator (<span class="Onote">Note: ArrayIterator is a class, not an interface</span>).
</p>
<p>
This feature requires PHP 5. 
</p>		<a href="http://blog.roodo.com/rocksaying/archives/3532653.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3532653.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3532653.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 26 Jun 2007 11:37:30 +0800</pubDate>
</item>
<item>
	<title>為什麼還不升級PHP5</title>
	<description><![CDATA[
	
jaceju 於《PHP5 將滿 4 歲》一文中說了一些他碰到的原因。


我的經驗，應用軟體的問題還好，大部份 PHP4 的軟體在 PHP5 的環境上一樣可以跑，只是語法 notice 多了點。再者，在 PHP4 的軟體中混雜 PHP5 的語法也不會影嚮程式運作。


	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
jaceju 於《<a href="http://blog.roodo.com/jaceju/archives/3517185.html">PHP5 將滿 4 歲</a>》一文中說了一些他碰到的原因。
</p>
<p>
我的經驗，應用軟體的問題還好，大部份 PHP4 的軟體在 PHP5 的環境上一樣可以跑，只是語法 notice 多了點。再者，在 PHP4 的軟體中混雜 PHP5 的語法也不會影嚮程式運作。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/3526951.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3526951.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3526951.html</guid>
	<category>PHP</category>
	<pubDate>Mon, 25 Jun 2007 11:54:30 +0800</pubDate>
</item>
<item>
	<title>TWPUG問答 - 如何反覆計時執行</title>
	<description><![CDATA[
	Tags: php
she96965 問: 我想要過三秒後執行一次函數，再過三秒在執行一次，一直反覆一直反覆。


答: 用 sleep() 。另一方面， PHP 有一個最大執行時間的限制，故尚須配合 set_time_limit() 重置最大執行時間的計時。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php</div>
<p><a href="http://twpug.net/modules/newbb/viewtopic.php?topic_id=2652&forum=13">she96965 問</a>: <q>我想要過三秒後執行一次函數，再過三秒在執行一次，一直反覆一直反覆</q>。
</p>
<p>
答: 用 <a href="http://tw.php.net/manual/en/function.sleep.php">sleep()</a> 。另一方面， PHP 有一個最大執行時間的限制，故尚須配合 <a href="http://tw.php.net/manual/en/function.set-time-limit.php">set_time_limit()</a> 重置最大執行時間的計時。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/3407615.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3407615.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3407615.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 05 Jun 2007 13:57:29 +0800</pubDate>
</item>
<item>
	<title>以 PHP-GTK + Glade 設計桌面應用程式 - 混合 Web 應用程式的 MVC 架構敏捷途徑</title>
	<description><![CDATA[
	Tags: php gtk mvc framework 標籤語言 delphi

我們一般對 PHP 的印象是：寫 Web 應用程式的工具。其實它也可以作為單純的解譯器運行一般的本地程式， PHP 稱此運行模式為 CLI mode。若進一步結合 PHP-GTK 擴充模組 (關於 PHP-GTK 的安裝，請參考《Glade/GTK2 for Windows with PHP5 and Ruby 快速安裝指南》) ，我們仍然可以使用 PHP 設計具有圖形使用者介面的桌面應用程式。


本文不只單純地說明如何利用 PHP-GTK + Glade 設計桌面應用程式，更要混合現成的 Web 應用程式，一併為各位展示 MVC 架構所帶來的高度彈性與可用性。

	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php gtk mvc framework 標籤語言 delphi</div>
<p>
我們一般對 PHP 的印象是：寫 Web 應用程式的工具。其實它也可以作為單純的解譯器運行一般的本地程式， PHP 稱此運行模式為 <a href="http://tw.php.net/manual/en/features.commandline.php">CLI mode</a>。若進一步結合 <a href="http://gtk.php.net/">PHP-GTK</a> 擴充模組 (<span class="Onote">關於 PHP-GTK 的安裝，請參考《<a href="http://blog.roodo.com/rocksaying/archives/3328847.html">Glade/GTK2 for Windows with PHP5 and Ruby 快速安裝指南</a>》</span>) ，我們仍然可以使用 PHP 設計具有圖形使用者介面的桌面應用程式。
</p>
<p>
本文不只單純地說明如何利用 PHP-GTK + Glade 設計桌面應用程式，更要混合現成的 Web 應用程式，一併為各位展示 MVC 架構所帶來的高度彈性與可用性。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/3400303.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3400303.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3400303.html</guid>
	<category>PHP</category>
	<pubDate>Mon, 04 Jun 2007 22:28:01 +0800</pubDate>
</item>
<item>
	<title>TWPUG問答 - 如何清除SESSION資料</title>
	<description><![CDATA[
	Tags: php session reference

原問題見: SESSION怎麼釋放不掉。在 PHP 中使用 Session 前，請務必閱讀: PHP Manual::Session Handling Functions。


1. Session and global variable

PHP Manual::session_register: 
If you are using $_SESSION (or $HTTP_SESSION_VARS), do not use session_register(), session_is_registered(), and session_unregister().


$_SESSION 已經是一個 superglobal variable (全系統域變數)，使用  $_SESSION['yourKey'] 的寫法就可以了。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php session reference</div>
<p>
原問題見: <a href="http://twpug.net/modules/newbb/viewtopic.php?topic_id=2641&forum=13">SESSION怎麼釋放不掉</a>。在 PHP 中使用 Session 前，請務必閱讀: PHP Manual::<a href="http://tw.php.net/manual/en/ref.session.php">Session Handling Functions</a>。
</p>

<h5>1. Session and global variable</h5>
<p>
PHP Manual::<a href="http://tw.php.net/manual/en/function.session-register.php">session_register</a>: <q>
If you are using $_SESSION (or $HTTP_SESSION_VARS), do not use session_register(), session_is_registered(), and session_unregister()</q>.
</p>
<p>
<var>$_SESSION</var> 已經是一個 superglobal variable (全系統域變數)，使用  <var>$_SESSION['yourKey']</var> 的寫法就可以了。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/3387201.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3387201.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3387201.html</guid>
	<category>PHP</category>
	<pubDate>Sat, 02 Jun 2007 13:55:19 +0800</pubDate>
</item>
<item>
	<title>PHP推蔫書目</title>
	<description><![CDATA[
	
工商服務時間。有人問我哪一本 PHP 的書最好？這個問題很容易回答：PHP 最好的書是 PHP Manual online edition；第二好的書還是 PHP Manual (下載版，建議 CHM 格式)。囧，這好像不是大家想聽的答案。耶，那邊那個別急著拾磚頭；這位大嬸，手上的雞蛋拿回家做菜比較好...


咳。我雖然從 PHP3 就開始寫 PHP 程式，但拜優秀的 PHP Manual 之賜，我從沒買過半本 PHP 書籍。不過今天到順發3C閒逛時，看到有一本厚厚的 PHP 書籍正在特賣，書名是《真‧PHP 5技術手札》。厚厚一本八百頁只要 199 元。就算自已去圖書館借出來影印都沒這麼便宜。書名很屌，還加個「真」字。有影嘸影？拿起來看看。嗯... 很好，基礎語法講的很詳細。進階功能講的很清楚，連 GD 和 PDF 函數庫都提到了。從初學到進階，就靠這本了。推蔫各位入手。我石頭成掛保證啦。

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
工商服務時間。有人問我哪一本 PHP 的書最好？這個問題很容易回答：PHP 最好的書是 <a href="http://tw.php.net/manual/en/">PHP Manual online edition</a>；第二好的書還是 PHP Manual (下載版，建議 CHM 格式)。囧，這好像不是大家想聽的答案。耶，那邊那個別急著拾磚頭；這位大嬸，手上的雞蛋拿回家做菜比較好...
</p>
<p>
咳。我雖然從 PHP3 就開始寫 PHP 程式，但拜優秀的 PHP Manual 之賜，我從沒買過半本 PHP 書籍。不過今天到順發3C閒逛時，看到有一本厚厚的 PHP 書籍正在特賣，書名是《<a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010309674">真‧PHP 5技術手札</a>》。厚厚一本八百頁只要 199 元。就算自已去圖書館借出來影印都沒這麼便宜。書名很屌，還加個「真」字。有影嘸影？拿起來看看。嗯... 很好，基礎語法講的很詳細。進階功能講的很清楚，連 GD 和 PDF 函數庫都提到了。從初學到進階，就靠這本了。推蔫各位入手。我石頭成掛保證啦。
</p>		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3344973.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3344973.html</guid>
	<category>PHP</category>
	<pubDate>Fri, 25 May 2007 12:05:38 +0800</pubDate>
</item>
<item>
	<title>To Prepare SQL Statements and Read Data</title>
	<description><![CDATA[
	Tags: php sql phpunit


試作一個 PHP 程式，可以從用戶端取得使用者輸入的資料，接著讀入一份外部的 SQL 指令稿。
將 PHP 中的變數值代入 SQL 指令之中 (prepares SQL statements)，以之查詢資料庫取回查詢結果。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php sql phpunit</div>

<p>
試作一個 PHP 程式，可以從用戶端取得使用者輸入的資料，接著讀入一份外部的 SQL 指令稿。
將 PHP 中的變數值代入 SQL 指令之中 (prepares SQL statements)，以之查詢資料庫取回查詢結果。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/3321763.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3321763.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3321763.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 22 May 2007 17:11:13 +0800</pubDate>
</item>
<item>
	<title>TWPUG問答 - 如何偵測URL資源是否存在</title>
	<description><![CDATA[
	Tags: 偵測URL http socket
問: 如何偵測網路圖片是否存在?如http://www.example.com/xxx.png。並回傳結果。

如果僅需偵測是否存在，而不要下載整份文件。僅需要透過 HTTP 協定 (RFC2616)的 HEAD method 即可達成目的。依 HTTP 協定之狀態定義，文件存在時回應代碼 200 ，不存在時回應 404 。我們可以此作為回傳值。

	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: 偵測URL http socket</div>
<p>問: <q>如何偵測網路圖片是否存在?如http://www.example.com/xxx.png。並回傳結果。</q></p>
<p>
如果僅需偵測是否存在，而不要下載整份文件。僅需要透過 <a href="http://www.ietf.org/rfc/rfc2616.txt">HTTP 協定 (RFC2616)</a>的 <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4">HEAD method</a> 即可達成目的。依 HTTP 協定之<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10">狀態定義</a>，文件存在時回應代碼 200 ，不存在時回應 404 。我們可以此作為回傳值。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/3215473.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3215473.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3215473.html</guid>
	<category>PHP</category>
	<pubDate>Thu, 10 May 2007 09:28:51 +0800</pubDate>
</item>
<item>
	<title>Delphi for PHP 發表會感想 - Show Me The Delphi for Ajax</title>
	<description><![CDATA[
	codegear delphi php ajax

今天參加了 CodeGear 在高雄辦的 Delphi 2007 發表會，參加者大概有30~40人左右吧。我主要關注的產品是 Delphi for PHP 。我其實已經在《Delphi for PHP is Not on Rails》談過我的第一印象。不過那是根據 CodeGear 網站提供的 Demo 內容所發表的感想。這次則是近距離接觸 Delphi for PHP 。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">codegear delphi php ajax</div>
<p>
今天參加了 <a href="http://www.codegear.com/">CodeGear</a> 在高雄辦的 Delphi 2007 發表會，參加者大概有30~40人左右吧。我主要關注的產品是 <a href="http://www.codegear.com/Products/Delphi/DelphiforPHP/tabid/237/Default.aspx">Delphi for PHP</a> 。我其實已經在《<a href="http://blog.roodo.com/rocksaying/archives/3016263.html">Delphi for PHP is Not on Rails</a>》談過我的第一印象。不過那是根據 CodeGear 網站提供的 Demo 內容所發表的感想。這次則是近距離接觸 Delphi for PHP 。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/3074173.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3074173.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3074173.html</guid>
	<category>PHP</category>
	<pubDate>Thu, 26 Apr 2007 23:43:09 +0800</pubDate>
</item>
<item>
	<title>Reflection 於設計 Framework 時之安全性作用</title>
	<description><![CDATA[
	framework reflection 自識能力 動態語言 資安
Kuon 於《PHP5 的動態函數/行為調用效率測試》回應：不論是 Reflection 或是 Function Handling Functions, 其實都已經實作在某些 Framework 中, 像這種類的函數可怕在於其具有eval()的語意, 須特別注意安全性的議題。


說實話，我抓不到這回覆內容的重點。依我的認知，於 PHP 中使用 Reflection 是為了增加安全性，而非帶來安全性議題(增加安全漏洞)。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">framework reflection 自識能力 動態語言 資安</div>
<p>Kuon 於《<a href="http://blog.roodo.com/rocksaying/archives/2633503.html#comment-9555837">PHP5 的動態函數/行為調用效率測試</a>》回應：<q>不論是 Reflection 或是 Function Handling Functions, 其實都已經實作在某些 Framework 中, 像這種類的函數可怕在於其具有eval()的語意, 須特別注意安全性的議題</q>。
</p>
<p>
說實話，我抓不到這回覆內容的重點。依我的認知，於 PHP 中使用 Reflection 是為了增加安全性，而非帶來安全性議題(增加安全漏洞)。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/3058219.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3058219.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3058219.html</guid>
	<category>PHP</category>
	<pubDate>Wed, 25 Apr 2007 11:34:24 +0800</pubDate>
</item>
<item>
	<title>以 SimpleXML 將 CSV 文件轉換成 MS Excel 2k/XP XML 文件</title>
	<description><![CDATA[
	Tags: php xml spreadsheet

本文示範以 PHP SimpleXML 實踐 MS Excel 2k/XP XML 文件之匯出工作。首先讀取一個 CSV 文件 test.csv，再建立一份 SimpleXML 文件實例，接著按 MS Excel 2k/XP 之 XML 文件結構，將自 CSV 讀取之資料存入 SimpleXML 文件實例，最後儲存為 test.xml 。該文件可以 MS Excel 2k/XP 讀取。


關於 MS Excel 2k/XP XML 文件之相關訊息，請見《A note of creating XML document by SimpleXML》。 

	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">Tags: php xml spreadsheet</div>
<p>
本文示範以 PHP <a href="http://tw.php.net/manual/en/ref.simplexml.php">SimpleXML</a> 實踐 MS Excel 2k/XP XML 文件之匯出工作。首先讀取一個 CSV 文件 <var>test.csv</var>，再建立一份 SimpleXML 文件實例，接著按 MS Excel 2k/XP 之 XML 文件結構，將自 CSV 讀取之資料存入 SimpleXML 文件實例，最後儲存為 <var>test.xml</var> 。該文件可以 MS Excel 2k/XP 讀取。
</p>
<p>
關於 MS Excel 2k/XP XML 文件之相關訊息，請見《<a href="http://blog.roodo.com/rocksaying/archives/2981347.html">A note of creating XML document by SimpleXML</a>》。 
</p>		<a href="http://blog.roodo.com/rocksaying/archives/3021213.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3021213.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3021213.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 17 Apr 2007 17:05:46 +0800</pubDate>
</item>
<item>
	<title>Delphi for PHP is Not on Rails</title>
	<description><![CDATA[
	Tags: php ruby framework webdev 標籤語言

If today, the tool which CodeGear released is "Delphi for Ruby", the title will be an equivoque.


CodeGear (前身 Borland 公司 IDE 部門) 日前發表了 Delphi for PHP 。於是我很快的觀看了一遍操作 Demo 。很遺憾，我必須說它並未發揮 PHP 的特色，程式碼寫作方式充滿了 Java/C# 風格，而不是 PHP 風格。

	]]>
	</description>
	<content:encoded><![CDATA[
	<div name="tags" class="tags">Tags: php ruby framework webdev 標籤語言</div>
<p>
If today, the tool which CodeGear released is "Delphi for Ruby", the title will be an equivoque.
</p>
<p>
CodeGear (前身 Borland 公司 IDE 部門) 日前發表了 <a href="http://www.codegear.com/Products/Delphi/DelphiforPHP/tabid/237/Default.aspx">Delphi for PHP</a> 。於是我很快的觀看了一遍操作 Demo 。很遺憾，我必須說它並未發揮 PHP 的特色，程式碼寫作方式充滿了 Java/C# 風格，而不是 PHP 風格。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/3016263.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/3016263.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/3016263.html</guid>
	<category>PHP</category>
	<pubDate>Mon, 16 Apr 2007 18:25:45 +0800</pubDate>
</item>
<item>
	<title>PHP mail() and charset encoding question, part2 - mbstring</title>
	<description><![CDATA[
	php mail mbstring

在 part1 中提到 mail() 會固定對信件內容進行編碼，而解決之道是改用 PHPMailer, PEAR::Mail 寄送信件。而本文則要繼續探索 mail() 對信件內容編碼之原因。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">php mail mbstring</div>
<p>
在 <a href="http://blog.roodo.com/rocksaying/archives/2950655.html">part1</a> 中提到 <code>mail()</code> 會固定對信件內容進行編碼，而解決之道是改用 PHPMailer, PEAR::Mail 寄送信件。而本文則要繼續探索 <code>mail()</code> 對信件內容編碼之原因。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/2998451.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2998451.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2998451.html</guid>
	<category>PHP</category>
	<pubDate>Fri, 13 Apr 2007 09:13:58 +0800</pubDate>
</item>
<item>
	<title>A note of creating XML document by SimpleXML </title>
	<description><![CDATA[
	php xml spreadsheet simplexml

本文嚐試利用 PHP5 提供的 SimpleXML 函數組 ，建立一份可供 MS Excel 2000/XP 版本使用的 XML 文件。


需求起因於資料庫之資料匯出需求。以往大都採用 CSV 格式匯出，然而 CSV 文件用於保存 Big5 內碼編碼之資料時水土不服，容易發生分欄錯誤之情況。儘管我們將字元編碼改為 UTF-8 後便可避免此問題，但是卻又面臨 MS Excel 2000/XP 無法以正確之字元編碼讀取 CSV 文件的窘境。因此我需要一個可為 OpenOffice 以及 MS Excel 2000/XP 兩者共同辨識的資料格式。經我測試後，確認 MS Excel 2000/XP 之 XML 試算表格式符合此需求。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">php xml spreadsheet simplexml</div>
<p>
本文嚐試利用 PHP5 提供的 <a href="http://tw.php.net/manual/en/ref.simplexml.php">SimpleXML 函數組</a> ，建立一份可供 MS Excel 2000/XP 版本使用的 XML 文件。
</p>
<p>
需求起因於資料庫之資料匯出需求。以往大都採用 CSV 格式匯出，然而 CSV 文件用於保存 Big5 內碼編碼之資料時水土不服，容易發生分欄錯誤之情況。儘管我們將字元編碼改為 UTF-8 後便可避免此問題，但是卻又面臨 MS Excel 2000/XP 無法以正確之字元編碼讀取 CSV 文件的窘境。因此我需要一個可為 OpenOffice 以及 MS Excel 2000/XP 兩者共同辨識的資料格式。經我測試後，確認 MS Excel 2000/XP 之 XML 試算表格式符合此需求。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/2981347.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2981347.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2981347.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 10 Apr 2007 15:58:03 +0800</pubDate>
</item>
<item>
	<title>PHP mail() and charset encoding question</title>
	<description><![CDATA[
	php mail phpmailer

不知從何時開始， PHP 內建的 mail() 行為改變了，使用 mail() 寄發電子郵件時，似乎會固定將內文之字元編碼轉為 iso-8859-1 字元集。於是用 mail() 寄中文郵件時變亂碼、寄東歐文字郵件時變亂碼、寄日文郵件時變亂碼等等問題一一出現。如何寄非英文語系郵件幾乎成了 FAQ 級問題。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">php mail phpmailer</div>
<p>
不知從何時開始， PHP 內建的 <code>mail()</code> 行為改變了，使用 <code>mail()</code> 寄發電子郵件時，似乎會固定將內文之字元編碼轉為 iso-8859-1 字元集。於是用 <code>mail()</code> 寄中文郵件時變亂碼、寄東歐文字郵件時變亂碼、寄日文郵件時變亂碼等等問題一一出現。如何寄非英文語系郵件幾乎成了 FAQ 級問題。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/2950655.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2950655.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2950655.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 03 Apr 2007 15:50:09 +0800</pubDate>
</item>
<item>
	<title>TWPUG問答 - 如何不將 PDF 回傳給瀏覽器後列印，而直接由印表機印出</title>
	<description><![CDATA[
	php pdf print

請問 PDF 可以不要顯示在瀏覽器上面，而是直接按下列印鈕(列印)後，直接由印表機印出嗎？
于Taiwan PHP User Group所見問題


可以，但不要忘了 PHP 是在 server 端執行，所以 PHP 將使用 server 端設定的印表機輸出列印資料。請把設計思維整個切換到 client-server 架構，然後想想你的軟體運作環境是否方便從 server 端的印表機輸出資料。如果是公司內部那就可以，因為公司內部大部份是將資料集中到網路印表機輸出，當然也可以讓 PHP 直接把 PDF 輸出到網路印表機。如果是公開環境，例如使用者坐在自己家裡上網，那就不行了。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">php pdf print</div>
<blockquote>
請問 PDF 可以不要顯示在瀏覽器上面，而是直接按下列印鈕(列印)後，直接由印表機印出嗎？<br/>
<cite>于<a href="http://twpug.net/">Taiwan PHP User Group</a>所見問題</cite>
</blockquote>
<p>
可以，但不要忘了 PHP 是在 server 端執行，所以 PHP 將使用 server 端設定的印表機輸出列印資料。請把設計思維整個切換到 client-server 架構，然後想想你的軟體運作環境是否方便從 server 端的印表機輸出資料。如果是公司內部那就可以，因為公司內部大部份是將資料集中到網路印表機輸出，當然也可以讓 PHP 直接把 PDF 輸出到網路印表機。如果是公開環境，例如使用者坐在自己家裡上網，那就不行了。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/2927395.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2927395.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2927395.html</guid>
	<category>PHP</category>
	<pubDate>Thu, 29 Mar 2007 12:35:27 +0800</pubDate>
</item>
<item>
	<title>TWPUG問答 - 按了重新整理後又新增一筆相同資料?</title>
	<description><![CDATA[
	php webdev

當使用者按下瀏覽器的「重新整理」按鈕後，又再次新增一筆相同的資料，要如何避免這種情形？
于Taiwan PHP User Group所見問題


使用者按「重新整理」時，瀏覽器會再次送出表單資料 (現在的瀏覽器應該都會警告使用者將再次送出)。說白了，這等於問使用者是不是要再新增一筆同樣的資料。


解決方式不難，處理表單的 PHP 程式輸出一個要求瀏覽器重導向到檢視頁面的動作即可，「重導向」動作就是引導瀏覽器轉向其他頁面。當頁面重導向後，瀏覽器就不會於重整時再次送出表單。


例如使用者於 input.php 填入表單，表單送交 save.php 處理， save.php 處理之後引導瀏覽器至 list.php 。根據 HTTP 協定，引導瀏覽器轉向新網頁的導向動作為 header('Location: 新網頁之URL');。See also: header()

	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">php webdev</div>
<blockquote>
當使用者按下瀏覽器的「重新整理」按鈕後，又再次新增一筆相同的資料，要如何避免這種情形？
<cite>于<a href="http://twpug.net">Taiwan PHP User Group</a>所見問題</cite>
</blockquote>
<p>
使用者按「重新整理」時，瀏覽器會再次送出表單資料 (現在的瀏覽器應該都會警告使用者將再次送出)。說白了，這等於問使用者是不是要再新增一筆同樣的資料。
</p>
<p>
解決方式不難，處理表單的 PHP 程式輸出一個要求瀏覽器重導向到檢視頁面的動作即可，「重導向」動作就是引導瀏覽器轉向其他頁面。當頁面重導向後，瀏覽器就不會於重整時再次送出表單。
</p>
<p>
例如使用者於 input.php 填入表單，表單送交 save.php 處理， save.php 處理之後引導瀏覽器至 list.php 。根據 HTTP 協定，引導瀏覽器轉向新網頁的導向動作為 <code>header('Location: <var>新網頁之URL</var>');</code>。See also: <a href="http://tw.php.net/manual/en/function.header.php">header()</a>
</p>		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2911887.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2911887.html</guid>
	<category>PHP</category>
	<pubDate>Mon, 26 Mar 2007 11:24:15 +0800</pubDate>
</item>
<item>
	<title>PHP 實踐 mix-in 概念 part 2 - MixableClass</title>
	<description><![CDATA[
	php mix-in delegate ruby

第一部份《PHP 實踐 mix-in 概念之可行性》一文中解釋了 PHP 的個體如何加入新的方法。但那僅針對個體而非類別，那些混成內容無法繼承再用。而 Ruby 的混成(mix-in)概念是針對類別，其混成結果是一個類別，這些混成內容可經繼承機制再用。所以我接下來就要為 PHP 實踐一個可以混成的類別 - MixableClass。


我的設計目標有二。第一、個體可以動態增刪方法，且不影嚮其他個體。第二、以抽象化方法混成新的類別。

	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">php mix-in delegate ruby</div>
<p>
第一部份《<a href="http://blog.roodo.com/rocksaying/archives/2817003.html">PHP 實踐 mix-in 概念之可行性</a>》一文中解釋了 PHP 的個體如何加入新的方法。但那僅針對個體而非類別，那些混成內容無法繼承再用。而 Ruby 的混成(mix-in)概念是針對類別，其混成結果是一個類別，這些混成內容可經繼承機制再用。所以我接下來就要為 PHP 實踐一個可以混成的類別 - <code>MixableClass</code>。
</p>
<p>
我的設計目標有二。第一、個體可以動態增刪方法，且不影嚮其他個體。第二、以抽象化方法混成新的類別。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/2884871.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2884871.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2884871.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 20 Mar 2007 14:48:59 +0800</pubDate>
</item>
<item>
	<title>Read an uploaded spreadsheet document by php-SpreadsheetReader</title>
	<description><![CDATA[
	php library

In PHP, the global array $_FILES will contain all the uploaded file information. However, the temporary filename of the file in which the uploaded file was stored on the server is not the same as source filename. If you pass the temporary filename to SpreadsheetReaderFactory, it could not detect which reader to suit.

	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">php library</div>
<p>
In PHP, the global array <a href="http://tw.php.net/manual/en/features.file-upload.php">$_FILES</a> will contain all the uploaded file information. However, the temporary filename of the file in which the uploaded file was stored on the server is not the same as source filename. If you pass the temporary filename to <a href="http://blog.roodo.com/rocksaying/archives/2864529.html">SpreadsheetReaderFactory</a>, it could not detect which reader to suit.
</p>		<a href="http://blog.roodo.com/rocksaying/archives/2878923.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2878923.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2878923.html</guid>
	<category>PHP</category>
	<pubDate>Mon, 19 Mar 2007 11:32:56 +0800</pubDate>
</item>
<item>
	<title>php-SpreadsheetReader</title>
	<description><![CDATA[
	php library 自由軟體
Update: 2007/07/02

A PHP library for read spreadsheet files

PHP library for read data of spreadsheet files. It supports OpenDocument Spreadsheet (.ods), Microsoft Excel 97/2000 (.xls), CSV (.csv), and Text with tab-separated or patterns (.txt).


Use this command to anonymously check out the latest project source code:


 svn checkout http://php-spreadsheetreader.googlecode.com/svn/ php-spreadsheetreader

Current download link: SpreadsheetReader_rev-25.zip。


This proejct is hosted in php-spreadsheetreader - Google Code. It is issued on under the GNU Lesser General Public License. For further information click here.

	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">php library 自由軟體</div>
<div class="note">Update: 2007/07/02</div>

<h4>A PHP library for read spreadsheet files</h4>
<p>
PHP library for read data of spreadsheet files. It supports OpenDocument Spreadsheet (.ods), Microsoft Excel 97/2000 (.xls), CSV (.csv), and Text with tab-separated or patterns (.txt).
</p>
<p>
Use this command to anonymously check out the latest project source code:
</p>
<pre>
 svn checkout http://php-spreadsheetreader.googlecode.com/svn/ php-spreadsheetreader
</pre>
<p>Current download link: <a href="http://php-spreadsheetreader.googlecode.com/files/SpreadsheetReader_rev-25.zip">SpreadsheetReader_rev-25.zip</a>。
</p>
<p>
This proejct is hosted in <a href="http://code.google.com/p/php-spreadsheetreader/">php-spreadsheetreader - Google Code</a>. <strong>It is issued on under the GNU Lesser General Public License</strong>. For further information click <a href="http://www.gnu.org/licenses/lgpl.html">here</a>.
</p>		<a href="http://blog.roodo.com/rocksaying/archives/2864529.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2864529.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2864529.html</guid>
	<category>PHP</category>
	<pubDate>Sat, 17 Mar 2007 10:41:05 +0800</pubDate>
</item>
<item>
	<title>以 PHP 實踐 HEMiDEMi JSONP - 誰收藏/迴響討論本文</title>
	<description><![CDATA[
	php json ajax

不久前，我寫了《網路服務與純 JavaScript 應用之 JSON 資料包裹解決方案：基礎概念、Google的方式》，其中就以HEMiDEMi 書籤服務為主要案例討論如何可以增加查詢服務之使用彈性。我前兩篇談的 JSON 資料包裹，又稱 JSON with Padding (JSONP)。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">php json ajax</div>
<p>
不久前，我寫了《網路服務與純 JavaScript 應用之 JSON 資料包裹解決方案：<a href="http://blog.roodo.com/rocksaying/archives/2749975.html">基礎概念</a>、<a href="http://blog.roodo.com/rocksaying/archives/2760853.html">Google的方式</a>》，其中就以<a href="http://www.hemidemi.com/">HEMiDEMi</a> 書籤服務為主要案例討論如何可以增加查詢服務之使用彈性。我前兩篇談的 JSON 資料包裹，又稱 <a href="http://ajaxian.com/archives/jsonp-json-with-padding">JSON with Padding (JSONP)</a>。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/2820611.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2820611.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2820611.html</guid>
	<category>PHP</category>
	<pubDate>Thu, 08 Mar 2007 10:09:00 +0800</pubDate>
</item>
<item>
	<title>PHP 實踐 mix-in 概念之可行性</title>
	<description><![CDATA[
	動態語言 php ruby

最近在學習 Ruby 的過程中，接觸到'Mix-in' (混成) 這個新名詞。雖然是個新名詞，但其概念嚴格說來並非 Ruby 所獨有。


Mix-in (混成) 之基本概念在令行為抽象化，使其與特定類別或實例無關。我們再將這些抽象行為組成新的類別或個體。早期的模組化編程概念，其實就已經建立了這種概念， Ruby 則是聰明而有效結合模組與類別，增加許多設計彈性。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">動態語言 php ruby</div>
<p>
最近在學習 Ruby 的過程中，接觸到<a href="http://zh.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#.E9.A1.9E.E5.88.A5.E6.B7.B7.E6.88.90.28Mix-in.29">'Mix-in' (混成)</a> 這個新名詞。雖然是個新名詞，但其概念嚴格說來並非 Ruby 所獨有。
</p>
<p>
Mix-in (混成) 之基本概念在令行為抽象化，使其與特定類別或實例無關。我們再將這些抽象行為組成新的類別或個體。早期的模組化編程概念，其實就已經建立了這種概念， Ruby 則是聰明而有效結合模組與類別，增加許多設計彈性。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/2817003.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2817003.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2817003.html</guid>
	<category>PHP</category>
	<pubDate>Wed, 07 Mar 2007 22:56:00 +0800</pubDate>
</item>
<item>
	<title>PHP 臭蟲月開跑，快去查看自己的 PHP 程式是否有漏洞</title>
	<description><![CDATA[
	Tags: php 資訊安全

由 PHP 資安團隊 Hardened-PHP Project 支持的 month of PHP Bugs 開始了，不到一週已經公布了十筆以上的 PHP 安全漏洞。 PHP 的使用者快去查看自己的 PHP 程式是有否漏洞。


我大略看了一下，去掉那些罕用功能之漏洞，到目前為止有不少一般性的安全漏洞集中在 PHP4 。想想目前多數虛擬主機供應商仍只提供 PHP4 服務，真要為其中運作的 PHP 網站系統之安全性捏一把冷汗。


有兩個結構性的 crash bug: PHP Executor Deep Recursion Stack Overflow、PHP Variable Destructor Deep Recursion Stack Overflow。前者是遞迴深度、後者是巢狀陣列深度，這兩個安全漏洞與函數調用層數過深導致堆疊溢位有關。這是 PHP 解譯器的結構性問題 (其實每種程式語言都會有這類問題與相應限制) ，照 month of PHP Bugs 中透露的消息來看，短時間內 PHP 開發團隊還不會做出相關修正。

	]]>
	</description>
	<content:encoded><![CDATA[
	<div name="tags" class="tags">Tags: php 資訊安全</div>
<p>
由 PHP 資安團隊 <a href="http://www.hardened-php.net/">Hardened-PHP Project</a> 支持的 <a href="http://www.php-security.org/">month of PHP Bugs</a> 開始了，不到一週已經公布了十筆以上的 PHP 安全漏洞。 PHP 的使用者快去查看自己的 PHP 程式是有否漏洞。
</p>
<p>
我大略看了一下，去掉那些罕用功能之漏洞，到目前為止有不少一般性的安全漏洞集中在 PHP4 。想想目前多數虛擬主機供應商仍只提供 PHP4 服務，真要為其中運作的 PHP 網站系統之安全性捏一把冷汗。
</p>
<p>
有兩個結構性的 crash bug: <a href="http://www.php-security.org/MOPB/MOPB-02-2007.html">PHP Executor Deep Recursion Stack Overflow</a>、<a href="http://www.php-security.org/MOPB/MOPB-03-2007.html">PHP Variable Destructor Deep Recursion Stack Overflow</a>。前者是遞迴深度、後者是巢狀陣列深度，這兩個安全漏洞與函數調用層數過深導致堆疊溢位有關。這是 PHP 解譯器的結構性問題 (其實每種程式語言都會有這類問題與相應限制) ，照 <a href="http://www.php-security.org/">month of PHP Bugs</a> 中透露的消息來看，短時間內 PHP 開發團隊還不會做出相關修正。
</p>		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2810789.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2810789.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 06 Mar 2007 10:20:43 +0800</pubDate>
</item>
<item>
	<title>CDD 式的 Framework - Andromeda</title>
	<description><![CDATA[
	
TWPUG.net (以定義為基礎的程式架構 - Andromeda) 提到一個 Configuration Driven Development 的 Framework: Andromeda。
Andromeda 開發流程像是在塑模，然後自動產生應用程式。讓我覺得像在 Eclipse 上用 UML 塑模然後產生程式碼一樣。所以我覺得它像是 application platform ，而不像是 framework 。而它在處理 Object/Relationship Mapping 時用自創的語法，不是中介資料格式、不是 UML 、不是 SQL 也不是 PHP 。這麼做有沒有好處呢？目前我還看不出來。

	]]>
	</description>
	<content:encoded><![CDATA[
	<p>
TWPUG.net (<a href="http://twpug.net/modules/newbb/viewtopic.php?viewmode=flat&type=&topic_id=2446&forum=12">以定義為基礎的程式架構 - Andromeda</a>) 提到一個 <a href="http://blog.roodo.com/rocksaying/archives/2644922.html">Configuration Driven Development</a> 的 Framework: <a href="http://www.andromeda-project.org/">Andromeda</a>。
Andromeda 開發流程像是在塑模，然後自動產生應用程式。讓我覺得像在 Eclipse 上用 UML 塑模然後產生程式碼一樣。所以我覺得它像是 application platform ，而不像是 framework 。而它在處理 Object/Relationship Mapping 時用自創的語法，不是中介資料格式、不是 UML 、不是 SQL 也不是 PHP 。這麼做有沒有好處呢？目前我還看不出來。
</p>		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2777493.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2777493.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 27 Feb 2007 11:19:11 +0800</pubDate>
</item>
<item>
	<title>To Ruby From PHP, 中譯</title>
	<description><![CDATA[
	php ruby

PHP 普遍應用於 web 應用軟體環境中，但若你想用 Ruby on Rails 或只是想找一個更適於處理廣泛用途的語言， Ruby 值得看看。



	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">php ruby</div>
<p>
PHP 普遍應用於 web 應用軟體環境中，但若你想用 Ruby on Rails 或只是想找一個更適於處理廣泛用途的語言， Ruby 值得看看。
</p>

		<a href="http://blog.roodo.com/rocksaying/archives/2726947.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2726947.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2726947.html</guid>
	<category>PHP</category>
	<pubDate>Wed, 14 Feb 2007 21:01:09 +0800</pubDate>
</item>
<item>
	<title>Development within Eclipse PHP IDE (PDT)</title>
	<description><![CDATA[
	php eclipse pdt ide debugger

今天在 IBM developerWorks 的 Open Source 專區中看到《PHP development within Eclipse》這一篇文章。看了一下，原來在介紹 Eclipse 中的 PHP IDE project  。文章中使用的版本和我現在用的版本一樣 (去年12月釋出) 。我使用 PHP IDE project 後，覺得跟 Java/CDT 比起來功能還是很陽春，編輯功能也不算順手。所以目前我仍然使用 PSPad 作為程式編輯器。


順道看了一下 PHP IDE project 的網站，發現計劃名稱改為 PDT (PHP Development Tool) 了。以下就用 PDT 稱呼 PHP IDE 。

	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">php eclipse pdt ide debugger</div>
<p>
今天在 IBM developerWorks 的 Open Source 專區中看到《<a href="http://www-128.ibm.com/developerworks/library/i-osource13/index.html">PHP development within Eclipse</a>》這一篇文章。看了一下，原來在介紹 Eclipse 中的 <a href="http://www.eclipse.org/php/">PHP IDE project</a>  。文章中使用的版本和我現在用的版本一樣 (去年12月釋出) 。我使用 PHP IDE project 後，覺得跟 Java/CDT 比起來功能還是很陽春，編輯功能也不算順手。所以目前我仍然使用 PSPad 作為程式編輯器。
</p>
<div class="Note">
順道看了一下 <a href="http://www.eclipse.org/php/">PHP IDE project</a> 的網站，發現計劃名稱改為 PDT (PHP Development Tool) 了。以下就用 PDT 稱呼 PHP IDE 。
</div>		<a href="http://blog.roodo.com/rocksaying/archives/2711065.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2711065.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2711065.html</guid>
	<category>PHP</category>
	<pubDate>Fri, 09 Feb 2007 09:46:46 +0800</pubDate>
</item>
<item>
	<title>活用 PHP5 的 magic methods - __set(), __get() and __call()</title>
	<description><![CDATA[
	php5 refactoring overloading magic_method

PHP5 在動態性及個體導向兩方面都做了大幅度的加強。其中 Magic methods 概念的引用，更為 PHP5 帶來許多靈活性。


本文說明如何活用 Magic methods 重整 (refactoring) 程式碼。讓 PHP 的程式碼更易於使用。主要重點在 __set(), __get() ，同時也示範了 __toString(), __isset(), __call() 的用途。

	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">php5 refactoring overloading magic_method</div>
<p>
PHP5 在動態性及個體導向兩方面都做了大幅度的加強。其中 <a href="http://tw.php.net/manual/en/language.oop5.magic.php">Magic methods</a> 概念的引用，更為 PHP5 帶來許多靈活性。
</p>
<p>
本文說明如何活用 Magic methods 重整 (refactoring) 程式碼。讓 PHP 的程式碼更易於使用。主要重點在 <code>__set(), __get()</code> ，同時也示範了 <code>__toString(), __isset(), __call()</code> 的用途。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/2683180.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2683180.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2683180.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 30 Jan 2007 23:20:34 +0800</pubDate>
</item>
<item>
	<title>PHP 不需要另一個樣版引擎, part 2 - 補充與回應</title>
	<description><![CDATA[
	php template 樣版

繼《PHP 不需要另一個樣版引擎》，我再補充一些內容。


PHP 本身就是一個 SGML,XML,HTML 等 markup language document 用的解析器 (parser) ，所以就像一份 XML 文件必須標示 &lt;?xml ?&gt; 一樣， PHP 要求自己包含在 &lt;?php ?&gt; 標籤中。上文說了，這是 SGML 規範內容。儘管我們可以把 PHP 當一個純粹的程式語言，但還是要把 code 放在標籤中。這個怪僻在 Perl, Python, Ruby 中可看不到。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">php template 樣版</div>
<p>
繼《<a href="http://blog.roodo.com/rocksaying/archives/2680742.html">PHP 不需要另一個樣版引擎</a>》，我再補充一些內容。
</p>
<p>
PHP 本身就是一個 SGML,XML,HTML 等 markup language document 用的解析器 (parser) ，所以就像一份 XML 文件必須標示 &lt;?xml ?&gt; 一樣， PHP 要求自己包含在 &lt;?php ?&gt; 標籤中。上文說了，這是 SGML 規範內容。儘管我們可以把 PHP 當一個純粹的程式語言，但還是要把 code 放在標籤中。這個怪僻在 Perl, Python, Ruby 中可看不到。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/2681202.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2681202.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2681202.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 30 Jan 2007 09:58:24 +0800</pubDate>
</item>
<item>
	<title>PHP 不需要另一個樣版引擎 (Smarty, PHPLib, etc)</title>
	<description><![CDATA[
	php template 樣版

前幾天我看到 phpPatterns 的《PHP and Templates》，作者舉了很多例子說明 PHP 不需要使用樣版引擎。我個人的經驗與該作者一樣， PHP 確實不需要使用樣版引擎。因為 PHP 本身就是一種樣版引擎，在樣版引擎上再加一個樣版引擎是多此一舉。

	]]>
	</description>
	<content:encoded><![CDATA[
	<div class="tags">php template 樣版</div>
<p>
前幾天我看到 phpPatterns 的《<a href="http://www.phppatterns.com/docs/design/templates_and_template_engines">PHP and Templates</a>》，作者舉了很多例子說明 PHP 不需要使用樣版引擎。我個人的經驗與該作者一樣， PHP 確實不需要使用樣版引擎。因為 PHP 本身就是一種樣版引擎，在樣版引擎上再加一個樣版引擎是多此一舉。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/2680742.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2680742.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2680742.html</guid>
	<category>PHP</category>
	<pubDate>Mon, 29 Jan 2007 23:18:34 +0800</pubDate>
</item>
<item>
	<title>PHP 的參照及唯讀參照之實作</title>
	<description><![CDATA[
	Tags: magic_method 動態語言

這幾天我和 HACGIS (トキメキ) 在討論 PHP 的參照 (reference) 特性。對於參照的功用，我想我們都很清楚了，還不了解的讀者可以先參閱《PHP Manual::Chapter 21. References Explained》以及 HACGIS 的《使用參照的幾個原則》，HACGIS 的文章是本文討論內容的起點。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div name="tags" class="tags">Tags: magic_method 動態語言</div>
<p>
這幾天我和 HACGIS (トキメキ) 在討論 PHP 的參照 (reference) 特性。對於參照的功用，我想我們都很清楚了，還不了解的讀者可以先參閱《PHP Manual::<a href="http://tw.php.net/manual/en/language.references.php">Chapter 21. References Explained</a>》以及 HACGIS 的《<a href="http://blog.pixnet.net/HACGIS/post/1880532">使用參照的幾個原則</a>》，HACGIS 的文章是本文討論內容的起點。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/2659001.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2659001.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2659001.html</guid>
	<category>PHP</category>
	<pubDate>Fri, 19 Jan 2007 23:30:30 +0800</pubDate>
</item>
<item>
	<title>Working with PHPUnit3, part 2 - 撰寫測試案例</title>
	<description><![CDATA[
	標籤: agile-method tdd unit_test phpunit

繼第一部份《Working with PHPUnit3, part 1 - 安裝備忘錄》後，接下來舉例說明操作 PHPUnit 之過程。


PHPUnit3 指令工具與測試案例源碼檔
撰寫測試案例源碼內容
從測試對象產生測試案例源碼骨架
完成測試案例與產生測試項目清單

	]]>
	</description>
	<content:encoded><![CDATA[
	<div name="tags" class="tags">標籤: agile-method tdd unit_test phpunit</div>
<p>
繼第一部份《<a href="http://blog.roodo.com/rocksaying/archives/2599757.html">Working with PHPUnit3, part 1 - 安裝備忘錄</a>》後，接下來舉例說明操作 PHPUnit 之過程。
</p>
<ol>
<li><a href="http://blog.roodo.com/rocksaying/archives/2653972.html#PHPUnit3 指令工具與測試案例源碼檔">PHPUnit3 指令工具與測試案例源碼檔</li>
<li><a href="http://blog.roodo.com/rocksaying/archives/2653972.html#撰寫測試案例源碼內容">撰寫測試案例源碼內容</a></li>
<li><a href="http://blog.roodo.com/rocksaying/archives/2653972.html#從測試對象產生測試案例源碼骨架">從測試對象產生測試案例源碼骨架</a></li>
<li><a href="http://blog.roodo.com/rocksaying/archives/2653972.html#完成測試案例與產生測試項目清單">完成測試案例與產生測試項目清單</a></li>
</ol>		<a href="http://blog.roodo.com/rocksaying/archives/2653972.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2653972.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2653972.html</guid>
	<category>PHP</category>
	<pubDate>Thu, 18 Jan 2007 00:29:40 +0800</pubDate>
</item>
<item>
	<title>在 PHP 中以「中文字」為符號名稱之事項</title>
	<description><![CDATA[
	php_syntax

在 PHP 中能否以「中文字」作為變數、常數、函數的符號名稱呢？當然可以，但現階段有些注意事項與使用障礙。本文是個人經驗，供各位參考 (對了，我個人不將程式語言視為「英文」。而那些以 a-z0-9 等字母組成的符號，我僅將其視為視覺識別符號。嘿嘿，畢竟我英語發音很差，那些字大多數是以字形識別其意的)。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div name="tags" class="tags">php_syntax</div>
<p>
在 PHP 中能否以「中文字」作為變數、常數、函數的符號名稱呢？當然可以，但現階段有些注意事項與使用障礙。本文是個人經驗，供各位參考 (<span class="Onote">對了，我個人不將程式語言視為「英文」。而那些以 a-z0-9 等字母組成的符號，我僅將其視為視覺識別符號。嘿嘿，畢竟我英語發音很差，那些字大多數是以字形識別其意的</span>)。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/2650736.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2650736.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2650736.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 16 Jan 2007 21:15:18 +0800</pubDate>
</item>
<item>
	<title>PHP5 的動態函數/行為調用效率測試</title>
	<description><![CDATA[
	Tags: variable_function magic_method reflection

我先前為了測試 PHP5 的 reflection 能力，找到《Benchmarking dynamic function/method calls》為參考文章，寫了一段效率測試碼。剛好今天看到 HACGIS 也做了《各種呼叫方式的比較》。因為 HACGIS 沒測到 reflection 的部份，所以把我的效率測試碼也放上來供各位參考。

	]]>
	</description>
	<content:encoded><![CDATA[
	<div name="tags" class="tags">Tags: variable_function magic_method reflection</div>
<p>
我先前為了測試 PHP5 的 <a href="http://tw.php.net/manual/en/language.oop5.reflection.php">reflection</a> 能力，找到《<a href="http://weierophinney.net/matthew/archives/121-Benchmarking-dynamic-functionmethod-calls.html">Benchmarking dynamic function/method calls</a>》為參考文章，寫了一段效率測試碼。剛好今天看到 HACGIS 也做了《<a href="http://blog.pixnet.net/HACGIS/post/1844145">各種呼叫方式的比較</a>》。因為 HACGIS 沒測到 reflection 的部份，所以把我的效率測試碼也放上來供各位參考。
</p>		<a href="http://blog.roodo.com/rocksaying/archives/2633503.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2633503.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2633503.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 09 Jan 2007 18:12:44 +0800</pubDate>
</item>
<item>
	<title>處理表單複選項目, 於表單中使用陣列</title>
	<description><![CDATA[
	php_syntax

HTML 表單傳送給 PHP 的資料， PHP 會自動儲存在全域陣列中，例如以 POST method 送出的表單資料便儲存在 $_POST 全域陣列，以 GET method 送出的表單資料儲存在 $_GET 全域陣列。如果我們為表單元件命名 (指派了 name 屬性) ，則可以表單元件名稱為陣列鍵值。例如表單有一個名稱為 "userAddress" 的文字輸入欄位 &lt;input name="userAddress" type="text"/&gt; ，且此表單以 POST method 送出，則 PHP 中可以 $_POST['userAddress'] 取得使用者在此欄位中輸入的資料。上述是 PHP 處理表單資料的基本概念。


	]]>
	</description>
	<content:encoded><![CDATA[
	<div name="tags" class="tags">php_syntax</div>
<p>
HTML 表單傳送給 PHP 的資料， PHP 會自動儲存在全域陣列中，例如以 POST method 送出的表單資料便儲存在 <code>$_POST</code> 全域陣列，以 GET method 送出的表單資料儲存在 <code>$_GET</code> 全域陣列。如果我們為表單元件命名 (指派了 <code>name</code> 屬性) ，則可以表單元件名稱為陣列鍵值。例如表單有一個名稱為 "userAddress" 的文字輸入欄位 <code>&lt;input name="userAddress" type="text"/&gt;</code> ，且此表單以 POST method 送出，則 PHP 中可以 <code>$_POST['userAddress']</code> 取得使用者在此欄位中輸入的資料。上述是 PHP 處理表單資料的基本概念。
</p>
		<a href="http://blog.roodo.com/rocksaying/archives/2600683.html">(繼續閱讀...)</a>;
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/rocksaying/archives/2600683.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2600683.html</guid>
	<category>PHP</category>
	<pubDate>Tue, 26 Dec 2006 14:25:49 +0800</pubDate>
</item>
</channel>
</rss>