2009年8月15日 星期六

PHP的物件

最近練習用PHP寫聊天室來當做練習  參考網路上的文章用MVC與物件來寫程式 這是第一次用物件寫程式
之前一直很想知道程序導向與物件導向的優異在哪  但是我程式寫的不夠多  即使查了很多資料但始終無法體會
這次用物件來寫程式 對於物件的優點還是沒有什麼體會 不過倒是學到了許多以前不知道的知識
以下做一些筆記:


magic method
PHP物件有許多 magic method 可以用 例如 __call method
例如 假設有個情況是我要把client傳來的字串直接當作method name去呼叫某物件的method
但是 client 輸入的資料是一定要檢查的 我可以用 method_exists 去檢查此 method 存不存在
但是如果用 __call 的話 直接將呼叫不存在的method時該做的動作寫在 __call 裡就可以了

此外 __get __set 也是很好用的 method
看到這兩個 method 我才知道 PHP 物件也可以像 javascript 一樣動態創建屬性
不過我一直很想知道 如果物件沒有覆寫這兩個method的話 動態創建屬性時的行為會是怎樣
PHP官網似乎沒有提到這個 自己實驗的結果 只知道物件會自動創造一個 public 屬性
這樣當然很方便 但是依賴這種寫法 感覺以後維護或是 debug 會很有問題
(因為動態創建的屬性與 class 中 define 的屬性的存取都是一樣寫法 會分不清楚)
在網路上也看到其他人自訂 setvar getvar 之類的method來動態存取屬性


XML的處理
我的資料有些是使用 xml 檔案來儲存 PHP 可以用 simplexml 系列的函式去處理 xml 檔案
一開始其實我是想用 DOMDocument 來處理的 因為這個物件對 xml 的存取與處理很完善
但是在試用的時候發現找不到 DOMDocument 物件 雖然官網說這個物件是 PHP5 core 的一部份(我server是PHP5)
查了資料才發現 這是 linux distribution dependent 的 有些 linux 版本PHP5就是沒有 DOMDocument
必須要多裝 php-xml 才行
所以我只好什麼事情都用 simplexml 來做 這個物件真的是夠 simple 連 removeChild 這種 method 都沒有
後來我發現可以用 unset 來直接刪掉節點 上網搜尋的結果也是通通都用 unset 去刪掉節點
因為 xml 是普通文字檔案 需要做同步的機制 我又用了 semaphore 去做存取控制
雖然有 flock 可以鎖住檔案 但是官網有人回報有問題 所以不太敢用


物件的使用
對於 PHP 物件的使用熟悉了一點 像是 $this 變數 static 關鍵字 還有 :: 運算子的用途都稍有瞭解
還發現 PHP5 支援 type hinting 這個機制
可以在 function prototype 指定接收參數是哪種物件或是陣列 例如:

function foo_arr(array $arr) {};

function foo_obj(some_class $obj) {};

則之後呼叫到這樣定義的函式時 只能傳物件(而且必須是 "some_class" 的物件) 或是陣列過去
這個機制感覺蠻好玩的 不過現在只支援物件與陣列

沒有留言:

張貼留言