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" 的物件) 或是陣列過去
這個機制感覺蠻好玩的 不過現在只支援物件與陣列

2009年8月7日 星期五

apache mod rewrite

要使用 apache 的 mod rewrite 功能 在設定檔中必須要設定 Options FollowSymLinks
apache官方文件中就有描述
如果不是網站管理員的話  只要在http.conf有設定AllowOverride All
則可以將 Options FollowSymLinks 放到網頁資料夾底下的.htaccess檔案中
這樣也可以使用 mod rewrite 的功能

此外 修改.htaccess的設定後 不需要重新啟動apache即可立即生效
因為apache會在每次http request發生時去掃瞄資料夾下的.htaccess檔案
這提供了相當方便的功能 (修改完立即見效)
但也犧牲了一些效能 (每次都要掃瞄.htaccess檔案)

2009年8月6日 星期四

linux linker and dynamic linker

在linux下面的linker是ld
這是在編譯時 將各個object file連結成一個executable的程式

而linux下面的dynamic linker是ld.so/ld-linux.so
這是在一個程式要執行時 將程式與它所用到的dynamic share libraries連結起來並載入記憶體的程式
ld.so是用來處理a.out格式的二進位檔 ld-linux.so是用來處理ELF格式的二進位檔

從檔名可以看出來 dynamic linker是以share object的形式存在
當一個executable要開始執行時 dynamic linker 連結完executable與它用到的dynamic share libraries後 還會被map到該executable的address space中
因為ELF程式的PLT GOT機制 在程式執行中 還必須要用到dynamic linker

在Windows中的dynamic linker與linux不同 是以kernel的一部分存在
這樣做的好處是速度會快一點(不需要每個程式執行時都要將dynamic linker map到process address space中) 但是會缺少一點彈性