Namespace 是 PHP5.3 面向大型專案開發所新增的一項重要功能。並不是說有了 Namespace 就萬事大吉,但至少在結合來自各路好漢的函數庫與功能框架時,不必太擔心名稱衝突的問題了。
PHP 以 namespace 關鍵字指示名稱空間,此指令兼具定義與切換空間的意義。名稱空間的命令方式與一般符號相同,並以 \
(斜線) 作為名稱空間(namespace)的分節符號。它借用檔案系統的目錄樹觀念劃分常數(const)、函數(function)與類別(class)等定義的存在空間 (注意,名稱空間並不支援變數。所有的變數都存在於同一個空間)。
There are two new magic methods, __callStatic and __invoke.
PHP5.3 起新增了魔術方法 __invoke()。
簡單說,就是 C++/C# 中的 operator()
運算子重載。
還新增了魔術方法 __callStatic(),專門負責調用靜態方法。
PHP5.3/6.0 新增延後靜態繫結(late static bindings)功能。
此功能由關鍵字 static 實現,係對照 self 之功能而出現。
self 關鍵字採用儘早靜態繫結策略,PHP 在解譯語法時,就直接將 self
繫結到它所在的類別。static 關鍵字採用延後靜態繫結(late static bindings)策略,要等到執行到那一段敘述時, PHP 才會根據調用者所屬類別來設定 static
所代表的類別。
公司這個月開始一件專案,我分配到用 Java 開發 web service 那一塊。
於是我親身體驗到一本書說的故事。
找一個很聰明,但是沒有 Java 經驗的開發者,讓他去學學 Java web 企業應用的那一堆技術,然後再問問他的想法。問題是兩方面的,首先,它很難;再者,失敗的後果很悲慘。
對我來說,或許這意味者程式碼應該在較高等級的抽象中,而我們無法在 Java 中做到這一點。
《超越 Java》(Beyond Java),Bruce Tate,O'Reilly出版
我不算聰明的開發者,但十幾年基本功練下來,功底還算紥實。OOP, ORM, Design pattern 這些概念都懂。Web 架構更是熟悉。儘管如此,當我試圖使用 Spring, Hibernate 等框架時,我完全無法理解為什麼 Java 語言可以把一件簡單的事搞成這麼複雜。這件事促成我寫出《不同程式語言的中介編程與反射能力系列文章》。
我來說個關於函數指標(在 C 語言中,function 就是一個 function pointer)與函數個體(function object)的小故事。這個故事還有一個 Java 版的,在本文的最後一節。只對 Java 語言有興趣的,可以先看後面的 Java 版,再回頭看前面。
有一天,"偉大的"架構設計師交代甲和乙兩位程序員共同負責撰寫一個小程式。這個程式配置了兩個陣列,一個是傳統的整數陣列,一個是整數vector
。這個程式要將這兩個陣列的內容傾印出來。
工商服務時間。PHP程序員學了Ruby語言後,如果想開始動手寫程式,很快就會發現許多在PHP用慣了的函數,在 Ruby 中並沒有同名的函數。然後初學Ruby的滿腔熱血,就在翻找 Ruby 手冊的過程中降溫。這實在是令人遺憾的事。如何避免這種事情發生呢?
就讓我來介紹一個很好的參考網站,那就是「Rails for PHP Developers」。幾乎八成常用的PHP函數,都可以在那找到對應的Ruby API。你只要在該網站的搜尋欄中輸入你想查的 PHP 函數名稱,若該網站有整理,它就會告訴你這個 PHP 函數對應的 Ruby API 是什麼,還附帶程式範例。如下圖所示。
我前陣子將我以前寫的一些PHP工具程式用Ruby改寫時,靠這個網站省下許多翻手冊的時間。我相信有了它之後,PHP程序員開始寫Ruby程式時,會感到相當愉快。
PS. 我仍然很喜歡PHP。只是身為一個程序員,擁抱三四種程式語言是很正常也很合理的。
我在試探不同程式語言的中介編程與反射能力系列文章的第三篇PHP的中介編程與反射能力示範中提到 JavaScript 也可以透過 prototype 的操作實現直接擴充類別定義的能力,這種能力在 Ruby 中稱為 open class。本文是為了示範 JavaScript 此能力所做的補充。
本文是我試探不同程式語言的中介編程與反射能力系列文章中的第二部份,關於 PHP 的內容。
基本上,我指的是 PHP5 。
PHP 雖然被認為是動態語言,但語法上卻又具有許多靜態語言的性質,這使得它被認為「不那麼動態」。
尤其它在引入 OOP 能力時,學了不少 Java 語言的方式,因此限制了 PHP 的表達能力。
例如 PHP 也將型別分成原始型別(primitive types)與個體型別,套用 Java 的 class 與 interface 語法,
功能相似的反射類別等等。儘管如此,PHP 還是具有一些 Java 語言沒有的能力,故能達到比 Java 語言更高的靈活度。所以在實作本文所需範例時,仍比 Java 語言簡單。
網友 WanCW 在 JavaScript的中介編程與反射能力示範 一文中回應 文章中的 foreach() 並未產生新的程式或是修改現有的程式,好像不太能算是 metaprogramming?
並非如此,其實 foreach 在中介編程(metaprogramming)的領域是經典樣式。只是我上文的例子太精簡,以至於看不出它的威力。嗯,如果不來個複雜點的程式碼,確實不容易看出 foreach 到底可以幫我們省下多少程式碼。我就來個複雜點的示範吧。
基於某些原因,我這幾天嘗試分別以 JavaScript, PHP, Ruby (排名按字母順序) 實現同一個簡單的功能,這個功能用了簡單的反射與中介編程技巧。
主要目的是看這些語言在動態型別、中介編程、迭代與反射語法方面的表現。
最後,我會用 Java 語言來實現這個需求,「展現Java語言的特點」。
這篇構想中的文章,愈寫愈長。我想了想,還是按程式語言拆成幾篇,先把要示範的源碼與說明發佈上來。
這是第一篇發佈的,內容是 JavaScript 的實作,示範了兩個基本的中介編程技巧: foreach 和 accessor。
大家好,我又來談 REST 了。雖然我早已在過去的實務工作中採用 RESTful 概念,但似乎在國內大多數人眼中, RESTful 還是個陌生的內容。因為我新任職的公司,才剛在專案中採用 RESTful 工作,還要大家去 survey 一下。也就在這過程中,我才發覺大伙兒對 RESTful 的認知還有不少偏差。最主要的一點還是把過去的 REST 作法混進來了。忽略了 RESTful 字尾的 -ful 所代表的意義。
雖然我一年多前在 REST and RESTful web service 就提過 RESTful 的內容了,不過當時主要放在 REST 和 RESTful 的差異上,假設讀者已經很熟悉 Web 架構與設計模式了。在當時的文章最後,附上的範例程式也僅僅是示範如何把舊的 REST 程式重構支援 RESTful 。沒有示範 RESTful 到底如何與客戶端互動。這篇文章就是在填這個坑。
我用 VirtualBox 安裝 Ubuntu 作為 Guest OS 時,使用客端額外功能 (Guest Additionals) 碰到了一些狀況,留個解決方法的筆記。
軟體版本:
-
Host OS: Ubuntu 9.04
-
VirtualBox 2.14 OSE - 我安裝的是 Ubuntu 9.04 內建的開源碼版本。
-
Guest OS: Ubuntu 9.04
另外,我透過 VirtualBox 使用介面的 [裝置] => [安裝額外功能] 下載客端額外功能的 ISO 檔時總是失敗。
我建議用支援續傳的下載軟體,例如 wget 或 flashget ,直接到 VirtualBox 官方網站下載。
下載網址是: http://download.virtualbox.org/virtualbox/ 。
按 VirtualBox 的版本,到符合的目錄下找 VBoxGuestAdditions_?.?.?.iso ,例如我用的是 2.14 版,那就找
VBoxGuestAdditions_2.1.4.iso。
目錄下也有使用手冊(UserManual.pdf),有興趣多了解的可順便下載。
幾年前,談到 SOA 架構必然伴隨著 ESB 。然而這兩年來,我們雖然依然在談 SOA ,但 SOA 身邊伴著的角色卻已悄悄換成了 Web 2.0 、Mashups 。儘管 ESB 還沒走下舞台,但已經不在舞台中心了。
在 SOA 的舞台上,ESB走向邊緣,而 Mashups 走向中心,顯示了 SOA 正在輕量化的趨勢。
OpenID 是一種去中心化的身份認證系統,建置簡便,甚至不需要一個帳號管理中心伺服器。
在 OpenID 中的使用案例中,參與者分成三種,即:
- End-user - 最終使用者,即服務的一般用戶,每一個用戶都使用一個 URL 來代表
自己。
- Identity provider - 身份提供者。身份登錄與驗證的服務提供者。
- Relying party - 委託者,向 Identity provider 請求驗證身份的參與者。
通常是其他的服務提供者。
關於 Google MapReduce, Apache Hadoop 分散式文件系統的簡述。
MapReduce 的概念源自於並行運算的領域中很普遍的資料處理策略。
Map 在 MapReduce 中的詞性是一個動詞,取其 “劃分地圖“之義。
它的內涵是將一整塊資料儘可能按照不相關聯的地方劃分成好幾片。就好像是在一張大地圖中劃分區域分界線般,故稱此動作為 Map。
被 Map 成好幾片的資料,分別被儲存在不同的 host 中。當使用者需要處理該份資料時,
再將運算程序再複製到那些 host 上,開始處理那些資料。最後將散佈在不同 host 上
的程序所運算的結果化簡歸納成使用者要的最終結果,就是 Reduce。
將 MapReduce 結合分散式文件系統後,就是 Google 得以高效率處理網頁文件搜尋的核心系統。
全文
基於雲端運算的服務內容,常以 Web Service 的方式供應。Single Sign-on 則是為了
節省使用者在不同的 Web 服務之間重複進行帳號登入動作的時間。
隨著網路普及,文學作品上漸漸出現一股「網路小說」的潮流,大多數作者是大陸那邊的,而且有七、八成的內容是現代人的主角穿越時空回到古代中國或是異世界。這種作品就稱穿越小說。瞧,維基還有條目說明咧,牛B啊。
我失業很閒,無聊之餘看了一堆穿越小說,在那些穿越到古代中國的網路小說中,我看到三件跟中華語文有關的問題:
- 主角不識繁體字
- 主角不慣閱讀豎排文書
- 大家都會說官話
自由遭襲現象絕對是廿一世紀人類社會最嚴重的大問題。一般人無法容忍有人闖進住宅,在他們的書桌前東翻西找,卻可以默默忍受政府及一些機構在網路上截取他們的私人資料。
歐洲新一代自由主義者,聯合報,民國98年9月7日A16
日前參加國內某大學與資策會合辦的「雲端運算(Cloud computing)培訓班」。雲端運算和網格運算的共同點在於,文件與運算程序都散佈在網路上的許多端點中。為了進行資料運算,人們需要將自己的文件傳送到網路端點上。既然我們必須將文件上傳到網路端點上,那麼我就要考慮到隱私權的問題。隱私權問題若以資訊管理的用語,則是資訊安全問題。
莫拉克颱風過去一週了,救災報導接連不斷。在新聞報導中,我只看到某某新聞記者奮勇挺進災區傳回的新聞,但是沒看到災害應變中心發佈的災情整合資訊。我不禁懷疑,或許報社編輯部中彙整的災區資訊也比災害應變中心完整。
服兵役期間,我是無線電通信兵。在當年受訓時,曾多次聽聞教官述說當年九二一地震後,民間通訊幾乎中斷,只剩下軍方的無線電報務、話務系統還能用。透過軍方的無線電通訊網,將災情傳出,藉以調度救災工作的事。基於此一背景,我特別關注了此次救災行動中,軍方無線電通訊網路的事。然而,一週過去了,似乎沒見到類似的通訊網路出現。國軍弟兄挺進了,在某某處發現受困災民,回報消息、留下乾糧後繼續挺進。之後,就沒有後續消息了。受困災民只能被動地等待,而無法主動聯絡外界。因此缺食物卻送來屍袋,急著脫困卻無人聞問之事屢屢傳出。我每次都想,若是國軍弟兄在挺進過程中,留下一具無線電通訊設備給等待中的災民,或許整個狀況就會完全改觀了。
我對資訊的傳遞與彙整動作很敏感。在這次災情造成的通訊斷絕狀況中,我感覺到人們似乎遺忘如何彙整資訊了。在這個點對點通訊方式泛濫的時代,人們都習慣於直接撥打手機和對方聯絡事情。但是當手機基地台失去作用後,大伙就成了無頭蒼蠅了。特別是救災官員更是如此。有人 callin 電視台、有人貼上網路、有人到處發簡訊,馬路消息滿天飛,謠言誤傳也不少。但就是不見政府災害應變中心做出任何災情資訊彙整的動作。缺乏有效正確的災情資訊,奢談救災資源指揮調度。
我個人並不要求一個大有為的萬能政府。但至少,災害應變中心要能發揮統一彙整各地災情資訊的功能吧。看看今天的災害應變中心,比報社編輯部還不如。媒體批評政府官員看電視新聞救災,真是一點也沒錯。