2011-08-18 79 views
0

我第二次調用My()函數時出現此錯誤。第一次(當我打電話是爲了USER_ID)似乎一切都很好..精簡代碼:致命錯誤:調用未定義的方法stdClass :: My()

class User { 
    function My($field) { 
     global $user; 
     global $db; 
     global $sessions; 

     if ($sessions == 2) { 
      $user = $db->Row("SELECT * FROM users WHERE username='".$_SESSION['username']."'"); 
      return $user->$field; 
     } 
    } 
} 

$user = new User; 

class Index { 
    function Startup() { 
     global $user; 

     $user_id = $user->My("user_id"); 
     $name = $user->My("firstname")." ".$user->My("surname"); 
    } 
} 

任何建議,將不勝感激。

+2

請停止。不要繼續這樣寫。我很抱歉地說,但這不是你應該如何使用PHP中的類(或者實際上任何OO語言)。請編輯你的問題告訴我們,你想達到什麼目標,我相信我們可以爲你找到更好的解決方案。 – Mchl

+0

感謝Mchl,我意識到我沒有遵循常規的OOP方式,而且我正在閱讀一篇文章,以便使用更好的替代方法來處理全局變量,但是我不明白爲什麼它如此糟糕以至於我在做什麼。 – dandoen

+0

你剛剛有你的第一次經歷。因爲'$ user'是一個全局對象,所以你不能在你的代碼中將它用作'$ user'。與'$ db'和'$ sessions'類似。相反,如果您將這些變量作爲參數傳遞給構造函數,並將它們存儲爲User類的實例變量,則可以避免此風險。這只是一件事。請查找題目,如'封裝''關注分離''多態性' – Mchl

回答

1

對不起,我的第一個回答是不正確的!

因爲您在My()和Startup()中都定義了$ user global,所以在這兩種情況下您都要接受相同的數據。

第一次一切都很好,因爲$ user已經初始化爲代碼中某處的用戶對象。但是My()函數中的$ db-> Row()方法會將全局$用戶更改爲不具有My()運算的stdClass。

解決方案:刪除My用戶中的$ user之前的全局單詞

+0

蒂姆,謝謝。我通過這樣做來解決它: $ user_id = User :: My(「user_id」); $ name = User :: My(「firstname」)。「」.User :: My(「surname」); – dandoen

+0

下次請編輯您的第一個答案 – Mchl

0

你必須initalize變量第一像

$user = new User(); 
$user->my(); 

除非你知道自己在做什麼,也請千萬不要用全球性的。

相關問題