讓我們以下面的類了片刻:開關類()
class member { public $id; public function __construct($id) { $this->id = $id; // Check user level if ($this->check_user_level() == moderator) { $this = new moderator($this->id); } } private function check_user_level() { // Return user level from system based on user ID } } class moderator extends member { public function show_moderator_tools() { // etc. } } ================== $user = new member($user_id);
期望的行爲是有$user
檢測用戶是否被授權有主持人的訪問,如果是使用重鑄用戶moderator
類而不是member
。
PHP禁止只需重新分配$this
,所以這似乎是最好的解決辦法是執行下列操作之一:
運行check_user_level($id)
作爲常規功能,並使用if語句
$user_level = check_user_level($id); if ($user_level == "moderator") { $user = new moderator($id); } else { $user = new member($id); }
在初始化後可在基類中設置一個標誌,用於檢查/重新定義$user
$user = new member($id); if ($user->flag = TRUE) { $user = new moderator($id); }
後者覺得它引入了一個安全漏洞,尤其是因爲國旗(我猜可能很容易就是$user->user_level
,或者類似的話)必須公開才能在之後檢查。
我會像要做的只是打一個電話給new member($id)
,讓它從那裏自動處理事情,而不需要if語句後的事實。有沒有辦法做到這一點?
剛剛測試過它,它的工作非常好!我不太確定具體如何,但我想我已經開始瞭解它。實質上,每個對象實際上都是'user'的一個實例,它具有嵌入在$ this-> obj中的適當用戶級別類的另一個對象。如果不是'user'的一部分被調用,那麼__call()會指示它在嵌套對象中運行相應的函數。這是關於標誌嗎? – Kaji
@Kaji是的,這就是整個想法:) – Kamehameha
太棒了!是否可以設置屬性以同樣的方式工作? – Kaji