2008年03月25日

關於分割程式功能以及 mix-in 和 include

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個缺點。


第一,因為 include 會進行檔案開啟動作,當你大量使用這技巧時,將會降低效能。

第二,一個小小的語法缺點,程式外觀不甚雅觀。例如:

當然,這不算什麼大缺點。但從動態性來說,卻可以一眼看出問題。稍後說明。

第三,也是最重要的一點:嚴格來說它不具動態性,不算混成(mix-in)。

混成(mix-in)的特點是「由外而內的重構」。你要混入新方法的程式碼寫在目標類別定義之外。但用 include 時,你要把它 (也就是 'include xxx' 的程式碼) 寫在目標類別定義中。而且不能在運行時變更。

使用混成(mix-in)添加新的行為時,我並不需要回頭修改目標類別的程式碼內容。而是在目標類別以外的地方做這件事。如下例,使用我之前實作的 MixableClass

A.php
others.php

透過混成,我不用回頭修改 A.php 這個源碼的內容,而是在別的地方做這件事。是「由外而內」的重構,所以說是 "mix-in"。


Posted by shirock at 樂多Roodo! │17:59 │回應(3)引用(0)PHP
樂多分類:學術/學習 工具:加入樂多書籤編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/5751881
回應文章
你的mix-in可以把外部的function加入類別內,可問題是,既然已經在外部定義了function,直接調用function不就好了嗎?

我所需要的是「擴充」該類別的功能,換言之,他必須能像繼承一般,可以調用類別內protected的方法(存取屬性的問題不考慮)。

在分割程式功能時,我是把一些不常用的方法移出核心類別,以插件的方式寫在另外一個類別中,藉由我設計的那個「插件」類別把核心與插件類別的非private方法用__call這個魔術方法掛入。

由於我不想手動寫函數表,所以利用反映的方式自動產生該函數表。

我知道那個算是奇技淫巧,不過我實在沒有比較好的方式來作~
Posted by tokimeki at 2008年03月25日 21:04
我在補充一點,我給出的範例,核心類別是「測試」,裡面有一個protected的「測試01」方法,我在插件類別「測試:test02」中的「測試02」方法中有呼叫$this->測試01()。

這樣子為何不會出現錯誤呢?這是因為那個「_插件」類別搞的鬼,他把「測試:test02」和「測試」類別的方法公開給這兩個類別來使用。
Posted by tokimeki at 2008年03月25日 21:23
回應見:

延續討論
Posted by 遊手好閒的石頭成 at 2008年03月27日 13:56