正在嘗試自己寫一個部落格系統,想當瀏覽文章的時候,有些操作是只有作者才有權限進行,例如刪除,編輯更新文章。 想到了繼承來解決,前面發表過一個會話類,這下簡單多了,透過登入來設定使用者的級別,$session->get_status()的回傳 值如果是0,則表示目前使用者並不是博主,因此不具有刪除,編輯文章的權限。如果是回傳值是1,表示是博主本人。好
了,廢話少扯。先上程式碼
class operationLimit // operating limit. When no user login or is not this user { /* for limit the user operat at post. * @author:xiaoai 8.12 2011 */ static $limitObject; public function construct() {} // when call the function but does not exist public static function getObject() { if( !(self::$limitObject instanceof self)) self::$limitObject = new self; return self::$limitObject ; } protected function setLimit() {} public function getReadA($postName) { return '<a herf=\'http://foodstory.me/post/'.$postname. '.php\' class=\'readmoreLink\'>readmore</a>'; } } class operationUnlimit extends operationLimit // when is this user { public static function getObject() { if( !(self::$limitObject instanceof self)) self::$limitObject = new self; return self::$limitObject ; } public function getUpdateA($name) { return '<a href=\'http://foodstory.me/post/'.$name. '.php?do=update\' id=\''.$name.'\' >update</a>'; } public function getDelectA($name) { return '<a href=\' javascript :delectPOST('.$name .');\' id=\'delectPOST\' >delect</a>'; } } class LimitFactory { public static function getLimitObject($userStatus) // $userStatus = $session->get_status(); { switch ( $userStatus ) { case 0: return operationLimit::getObject(); case 1: return operationUnlimit::getObject(); default: return limit::getObject(); } } }
LimitFactory是一個工廠類,兼靜態類。 即不需要建構對象,它的職責只是根據傳入的使用者權限值,來判斷該返回 operationLimit類別 還是 operationUnlimit類別 的實例。
有一些共用的操作,例如閱讀更多,operationUnlimit類別繼承了這個方法,而後又創造了一些新方法,例如返回刪除,更新連結的方法。
用法範例
$limitObj = LimitFactory::getLimitObject($session->get_status()); echo $limitObj->getReadA('hi'); echo $limitObj->getDelectA('hah');
下面談點無關的,剛開始當我沒有在operationUnlimit類別中寫getObject() 靜態方法,發現呼叫
return operationUnlimit::getObject();
返回的卻是超類別的對象,感覺奇怪,我在getObject();方法中用的是self來表示當前的類,沒有指明一定要返回超類的對像啊。當在子
類別中重寫了這個靜態方法才OK。後來查了下google,依稀理解,編譯器在剛開始的時候就把getObject方法和超類別綁定在一起,因此
在子類別中的呼叫依然是傳回超類別物件。
還有,是否覺得字串中那麼多轉義符很難分辨,那麼改用
echo 47a50357de5e4ef51aae22a5342320cfread more5db79b134e9f6b82c0b36e0489ee08ed
Eeeeeee;
這樣清爽了很多。
以上是php如何繼承一個應用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!