用命名空間解決brophp中的重複調用model類的bug
第一個項目完成了,雖然說自己很不滿意這個項目,但是無論如何,還是結束了。
因為自己小有基礎,而且不想用純面向過程和oop來做項目,所以第一個項目打算用架構來做
於是在項目前研究brophp代碼,在brophp基礎上做了一個“自己”的架構
說是自己的,其實只是自己看懂了brophp,對照這brophp重寫了一遍而已。
這個bug就是自己在項目中偶然發現的。
當時我在前台的common.class.php調用了D(‘user','admin‘)對使用者權限進行了驗證,然後在另外一個控制器裡面又使用D(‘user')對使用者資料進行更新
這樣就出錯了 提示不能重複定義UserModel類,這是調用了2個相同名字的類產生的問題
正如我們給類命名不能用memcache,mysqli一樣
當時趕項目,時間緊,沒敢深想,只是考慮了下比較容易解決辦法:對這兩個類都進行改名 加上項目名。
項目完,墮落了兩天,今天晚上又想起了這個問題,仔細思考了一下,突然想起來php5.3新加的命名空間就是為解決此類問題而增加的
翻了下手冊,研究了下這個新東西,確實解決了這個問題
在產生對於model編譯檔案的時候頭部加上命名空間定義
如home的UserModel.php
- namespace home;
- class UserModel extends \Dpdo {
- }
admin的Usermodel.php
- namespace admin;
- class UserModel extends \Dpdo {
- }
注意Dpdo前面的\ ,因為其他檔案沒有定義命名空間,所以屬於全域空間“如果沒有定義任何命名空間,所有的類與函數的定義都是在全域空間,與 PHP 引入命名空間概念前一樣。在名稱前加上首碼
\ 表示該名稱是全域空間中的名稱,即使該名稱位於其它的命名空間中時也是如此。 ”
再修改D方法 使模型執行個體化的的時候用以下的形式
- $h = new home\UserModel();
- $a = new admin\UserModel();
這樣就解決了這個重複調用類的問題。
具體代碼就不發了,有興趣的童鞋可以試下
其實最簡單的方法就是執行個體化的時候統一,比如都用D(‘user','admin‘),就不會出現這個問題
但是這是逃避問題,而不是解決問題。