2011-10-18 140 views
1

我一直在網站上工作,目前處於登錄/會話處理階段。PHP設計建議

我想知道你認爲什麼是更好的設計。 (這個網站將向公衆開放,所以它也應該是用戶友好的)。

P.S.對不起,如果這不是正確的PHP'約定',我習慣於C/C++編程。

設計#1:

define("LOGGED_IN", false); 
define("USERNAME", "Guest"); 
define("PASSWORD", ""); 
define("PLAYER_ID", -1); 

... 

if (!LOGGED_IN) { 
    header("Location: login.php"); 
} else { 
    ... 
} 

... 

if ({condition for successful login}) { 
    define("LOGGED_IN", true); 
    define("USERNAME", "AJ"); 
    define("PASSWORD", "nottellingu"); 
    define("PLAYER_ID", 1); 
} 

... 

printf("Hi, %s. Have a nice day.", USERNAME); 

設計#2:

class user { 
    private $id; 
    private $logged_in; 
    private $username; 
    private $password; 

    public function __construct($id, $username, $password, $logged_in = false) { 
     $this->id = $id; 
     ... blablabla 
    } 

    public function get_id() { 
     return $this->id; 
    } 

    ... blablabla (pretend i declared all needed functions) 
} 

... 

if ({condition for successful login}) { 
    $id = get_userid($_SESSION['USERNAME']]); 
    $user = new user($id, $_SESSION['USERNAME'], $_SESSION['PASSWORD'], true); 
} 

... 

printf("Hi, %s. Have a nice day.", $user->get_username()); 

你可以給我你的設計以及。

謝謝

+1

無論哪種方式,第一種方法不會太好。 define()方法用於設置全局常量。因此,如果您使用方法#1,它們將永遠不會成功登錄。 – Norguard

+1

我強烈建議閱讀文檔並查看CI的['Tank Auth'](http://konyukhov.com/soft/tank_auth/)的代碼。 –

+1

如果您應該使用過程式編程(第一個示例)或面向對象(第二個),您的要求是什麼。閱讀差異來找出你喜歡的東西。 OO有時難以讓你頭腦發熱,但它使得跟蹤大型節目變得更加容易。 –

回答

1

我覺得無論哪種方式都可以。這實際上取決於你想要完成什麼。如果你要一直拉用戶信息,一個班可能會更好。如果你只需要一些基本的東西,比如ID和名字,以及它們是否已經登錄,第一個選項就簡單了,並且可以很好地工作。

當你可以用簡單的方法做到這一點並且完成它時,就沒有必要過分地使事情複雜化。

1

IMO,設計方法#2更好。您不僅可以獲得與用戶相關的任何封裝,而且它也是模塊化的,因此您可以參考代碼庫中任何位置的任何屬性。

您可能還想做一些Google搜索,看看是否有可以使用的獨立用戶登錄系統,而不是重新發明車輪。