<?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 實踐 mix-in 概念 part 2 - MixableClass</title>
<link>http://blog.roodo.com/rocksaying/archives/2884871.html/</link>
<description><![CDATA[php mix-in delegate ruby

第一部份《PHP 實踐 mix-in 概念之可行性》一文中解釋了 PHP 的個體如何加入新的方法。但那僅針對個體而非類別，那些混成內容無法繼承再用。而 Ruby 的混成(mix-in)概念是針對類別，其混成結果是一個類別，這些混成內容可經繼承機制再用。所以我接下來就要為 PHP 實踐一個可以混成的類別 - MixableClass。


我的設計目標有二。第一、個體可以動態增刪方法，且不影嚮其他個體。第二、以抽象化方法混成新的類別。
]]>
	</description>
<language>zh-tw</language>
<generator>Roodo Blog System</generator>
<copyright>All Rights Reserved</copyright>
<atom:link href="http://blog.roodo.com/rocksaying/archives/2884871-comment.xml" rel="self" type="application/rss+xml" />
<item>
	<title>回應：PHP 實踐 mix-in 概念 part 2 - MixableClass</title>
	<description><![CDATA[嗯，看來應用還滿多的。以往如果要這樣實現的話，可能要多出好幾個類別。

也許還可以用在我目前發想的專案裡，這種方式實在是讓我學到了很多新想法 :)]]>
	</description>
	<link>http://blog.roodo.com/rocksaying/archives/2884871.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2884871.html#comment-4243489</guid>
		<category>文章回應</category>
	<pubDate>Thu, 22 Mar 2007 18:14:15 +0800</pubDate>
</item>
<item>
	<title>回應：PHP 實踐 mix-in 概念 part 2 - MixableClass</title>
	<description><![CDATA[「封絕」是一種自在式，可以實現一個與外部隔離的孤立空間，是紅世使徒... 停! 再講下去只有動漫狂聽得懂了。

其實像事件委派、序列化等動作都可以用混入的方式處理。例如，我要為一個類別加上可以將個體的公開內容序列化為 json 格式的方法時，就可以用混入而不是繼承方式處理。

例如:
User::delegate('User', 'jsonEncode', 'jsonEncode');
ProductOrder::delegate('ProductOrder', 'jsonEncode', 'jsonEncode');
Report::delegate('Report', 'json', 'jsonEncode');

這三個類別沒有親近的類別關係，若以繼承方式加上 json 序列化方法，可能要繼承好幾代。但以混成方式，只要直接委派就可以了。

另一種應用是和 Configuration-Driven Development 結合，自組態檔中讀出類別的schema後，即可動態混成新的類別，而不需要手動撰寫或產生程式碼。參見: <a href="http://blog.roodo.com/rocksaying/archives/2644922.html">Example of Configuration Driven Development with PHP</a>、<a href="http://blog.roodo.com/rocksaying/archives/2186914.html">從 XML 產生 JSON 資料及方法的封裝</a>。]]>
	</description>
	<link>http://blog.roodo.com/rocksaying/archives/2884871.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2884871.html#comment-4241137</guid>
		<category>文章回應</category>
	<pubDate>Thu, 22 Mar 2007 10:58:53 +0800</pubDate>
</item>
<item>
	<title>回應：PHP 實踐 mix-in 概念 part 2 - MixableClass</title>
	<description><![CDATA[看了mix-in這兩篇，第二篇覺得明確很多，這篇前段寫了目標，真的很棒。目標寫的好以及具體化，甚至比詳細的技術解決方案還重要，不過這是以應用來看就是了。

剛看的時候，其實還蠻不懂到底在玩什麼飛機，後來兩篇看完外加看了jaceju的那一篇和Prototype-based programming的解釋，才進入狀況，我實在是太蠢了。]]>
	</description>
	<link>http://blog.roodo.com/rocksaying/archives/2884871.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2884871.html#comment-4235025</guid>
		<category>文章回應</category>
	<pubDate>Wed, 21 Mar 2007 11:54:59 +0800</pubDate>
</item>
<item>
	<title>回應：PHP 實踐 mix-in 概念 part 2 - MixableClass</title>
	<description><![CDATA[「封絕」...有點放武俠大絕的味道 XD

其實沒有實際用上也沒關係，我覺得這樣討論 PHP 可以做到什麼境界還滿有趣的。 :)

我已經想到一些可能的寫法了，這兩天有空來試試看。]]>
	</description>
	<link>http://blog.roodo.com/rocksaying/archives/2884871.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2884871.html#comment-4231255</guid>
		<category>文章回應</category>
	<pubDate>Tue, 20 Mar 2007 22:07:50 +0800</pubDate>
</item>
<item>
	<title>回應：PHP 實踐 mix-in 概念 part 2 - MixableClass</title>
	<description><![CDATA[哈哈， 我都叫 closure 「封絕」或「閉鎖空間」的。XD

我目前有些功能直接用 Variable function 的方式，我在想如果能用 MixableClass 應該更方便。

目前還沒動手應用 MixableClass 於工作上。讓我想想要怎麼弄個實用的例子說明。]]>
	</description>
	<link>http://blog.roodo.com/rocksaying/archives/2884871.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2884871.html#comment-4229975</guid>
		<category>文章回應</category>
	<pubDate>Tue, 20 Mar 2007 18:15:30 +0800</pubDate>
</item>
<item>
	<title>回應：PHP 實踐 mix-in 概念 part 2 - MixableClass</title>
	<description><![CDATA[抱歉，上面的 closure 本來要寫的是「核心語法」。]]>
	</description>
	<link>http://blog.roodo.com/rocksaying/archives/2884871.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2884871.html#comment-4229813</guid>
		<category>文章回應</category>
	<pubDate>Tue, 20 Mar 2007 17:45:16 +0800</pubDate>
</item>
<item>
	<title>回應：PHP 實踐 mix-in 概念 part 2 - MixableClass</title>
	<description><![CDATA[瞭解，如何儲存方法的確是 PHP 的弱項。沒有 closure 的支援， PHP 的動態性還是相當不足。這個問題有時間的話，我再來研究看看。

不過很我很有興趣的一點是，目前我所看過的 PHP 應用項目也很少使用這樣的方法；不曉得石頭成老大你所開發的項目是什麼，為什麼會有用到這種概念的想法？]]>
	</description>
	<link>http://blog.roodo.com/rocksaying/archives/2884871.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2884871.html#comment-4229805</guid>
		<category>文章回應</category>
	<pubDate>Tue, 20 Mar 2007 17:44:11 +0800</pubDate>
</item>
<item>
	<title>回應：PHP 實踐 mix-in 概念 part 2 - MixableClass</title>
	<description><![CDATA[這牽涉到 PHP 的動態能力限制。
請看 MixableClass.php 的第31行，然後想想如何完成指派動作。
PHP 有三種呼叫方式: 一般函數、類別靜態方法、實例方法。基本上把第21行的 function_exists($fn) 改成 is_callable($fn) 就可以判定這是可呼叫的。但到第31行就麻煩了，如何儲存？

如果這三種方式都要考慮，這程式要增加不少程式碼。

現在的方式可以應付我的需求了，所以我目前只寫到這裡。更多內容要等到我有這需求時才會再去改了。

事實上，上面的作法無法同時兼顧效能與彈性。我覺得要改用 <a href="http://tw.php.net/manual/en/ref.runkit.php">runkit</a> extension 實現較佳。但 runkit 仍是新近加入的實驗性功能，還不是很穩固。]]>
	</description>
	<link>http://blog.roodo.com/rocksaying/archives/2884871.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2884871.html#comment-4229555</guid>
		<category>文章回應</category>
	<pubDate>Tue, 20 Mar 2007 16:52:18 +0800</pubDate>
</item>
<item>
	<title>回應：PHP 實踐 mix-in 概念 part 2 - MixableClass</title>
	<description><![CDATA[石頭成老大，看了你的程式後，我又想到一個有趣的實作方式，有時間我再來試看看。

不過我個人覺得上面的 delegate 方法如果改以接受 <a href="http://blog.roodo.com/jaceju/archives/409709.html">callback 虛擬型態</a>的參數會不會比較 PHP 一點？類似 <a href="http://blog.roodo.com/jaceju/archives/2853761.html">我也來實作 PHP mix-in 的概念 - Part 2</a>裡的做法 (不過我倒是沒把一般函式考慮進去) 。

但是到現在還是沒想通 mix-in 在繼承以後能做些什麼事，只能感嘆自己實務經驗還不足，也許要再多看看 RoR 的設計概念了。]]>
	</description>
	<link>http://blog.roodo.com/rocksaying/archives/2884871.html</link>
	<guid>http://blog.roodo.com/rocksaying/archives/2884871.html#comment-4229167</guid>
		<category>文章回應</category>
	<pubDate>Tue, 20 Mar 2007 15:15:58 +0800</pubDate>
</item>
</channel>
</rss>