ユーザーが自分のサイトにログインすると、User
クラスのインスタンスを作成し、ユーザー関連のデータを取得して、オブジェクトをに保存しますSESSION
。
データベースからフェッチするデータの一部は、セッション全体で一定である必要があり、他のオブジェクトからデータにアクセスできるようにする必要があります。別のオブジェクト内から値を使用User::$static_value_in_class
する場合は、を使用する方が好きですが、説得力はあります。$_SESSION['static_value_in_session']
User
問題は、インスタンスをにシリアル化してSESSION
から別のページをロードすると、値が記憶されないことです。
クラス定義:
class User {
public $name;
public static $allowed_actions;
public function __construct($username, $password) {
// Validate credentials, etc.
self::$allowed_actions = get_allowed_actions_for_this_user($this);
}
}
class Blog {
public static function write($text) {
if (in_array(USER_MAY_WRITE_BLOG, User::$allowed_actions)) {
// Write blog entry
}
}
}
login.php:
$user = new User($_POST['username'], $_POST['password']);
if (successful_login($user)) {
$_SESSION['user'] = $user;
header('Location: index.php');
}
index.php:
if (!isset($_SESSION['user'])) {
header('Location: login.php');
}
Blog::write("I'm in index.php! Hooray!")
// Won't work, because Blog requires User::$allowed_actions
静的データSerializable
の独自のバージョンを実装して書き込む必要がserialize()
ありますか?unserialize()
唇を噛んでクラス$_SESSION
内から変数にアクセスする必要がありますか?Blog
メソッドUser
に送信される有効なインスタンスを要求する必要がありますか?Blog
write()
または多分インターネットはより良い考えを持っています...
編集:私の実際のユースケースを書く(完全なコードではありませんが、要点を理解するのに十分です)。
私のサイトは、共有予算アカウントを持つユーザーのグループを処理します。ユーザーは、グループが合意した特定のことにグループのお金を費やすことができ、クラスのインスタンスを作成してデータベースストレージのためTransaction
にクラスに送信することにより、トランザクションを報告します。Bank
Bank
クラス:
class Bank {
// Group-agreed reasons to spend money
public static $valid_transaction_reasons;
public function __construct(User $user) {
Bank::$valid_transaction_reasons = load_reasons_for_this_group($user->bank_id);
}
}
User
クラス:
class User {
public $bank_id;
public function __construct($username, $password) {
$query = "SELECT bank_id FROM users WHERE username=$username AND password=$password";
$result = mysql_fetch_array(mysql_query($query));
$this->bank_id = $result['bank_id'];
}
}
Transaction
クラス:
class Transaction {
public function __construct($reason, $amount) {
if (!in_array($reason, Bank::$valid_transaction_reasons)) {
// Error! Users can't spend money on this, the group doesn't cover it
}
else {
// Build a Transaction object
}
}
}
実際のコード(login.phpなど):
$user = new User($_GET['uname'], $_GET['pword']);
$_SESSION['bank'] = new Bank($user);
// Some shit happens, user navigates to submit_transaction.php
$trans = new Transaction(REASON_BEER, 5.65);
// Error! Bank::$valid_transaction_reasons is empty!