2012-07-13 83 views
1

這裏是我的SessionManager.php代碼:調用非對象的成員函數 - PHP

private function generateAuthToken($user) 
{ 
    $bits = ''; 

    $fp = @fopen('/dev/urandom', 'rb'); 
    if ($fp !== false) { 
     $bits .= @fread($fp, 128); 
     @fclose($fp); 
    } 

    return sha1($bits . time() . microtime() . $user->getUsername()); 
} 

我得到這個錯誤:

Fatal error: Call to a member function getUsername() on a non-object in /home/shwetanka/src/Practo/PvrBundle/Manager/SessionManager.php on line 49

當我做var_dump($user);權前問題行我正在打印完整的用戶對象。我無法理解這個錯誤的原因。該功能存在於用戶類中。即使我嘗試調用該類的任何其他函數,即使那樣我也會得到該函數的相同錯誤。我是新來的PHP和難以調試這個問題。

另外$ user是用戶實體的對象。我使用Symfony2的這個對象是通過使用該還給我:

$ur = $this->getDoctrine()->getRepository('PractoPvrBundle:User'); 
$user = $ur->findBy(array('email' => $email)); 
+0

如果$用戶不是一個對象,我敢打賭,這是一個數組(基於該findBy()方法名稱的語義)。試試我的答案,並讓我們知道如果不是這樣。 – 2012-07-13 23:19:12

回答

2

有時在隱式轉換爲字符串的上下文中,PHP不能很好地處理方法調用......我不確定爲什麼。試試這個:

$username = $user->getUsername(); 
return sha1($bits . time() . microtime() . $username); 

編輯:

而且,我懷疑你實際上處理的是一個數組,而不是一個對象。行:

$user = $ur->findBy(array('email' => $email)); 

可能打算返回了許多成果。使用電流()來獲得的第一個:

$user = current($ur->findBy(array('email' => $email))); 
+0

謝謝。我確實得到了一個數組。 – Shwetanka 2012-07-13 23:26:44

+0

我的建議是使用** findOneBy(...)**而不是**當前(...)** – 2012-07-18 17:49:02

2

用戶退出喜歡的收益:

$username = $user->getUsername(); 
return sha1($bits . time() . microtime() . $username); 

如果仍不能解決問題,用於調試的目的你可以嘗試:

$username = 'N/A'; 
if(is_object($user) && method_exists($user, 'getUsername')) 
{ 
    $username = $user->getUsername(); 
} 

您也可以投你的參數$用戶,如:

private function generateAuthToken(User $user) {... 

如果您獲得不同的類實例或非對象,這將引發錯誤

+0

我也試過這個,但仍然得到相同的錯誤 – Shwetanka 2012-07-13 23:00:21

+1

哇...我會已經打賭我的房子是這個答案。PHP充滿了「你必須這樣做之前,你可以做到這一點」的特點在conv ersion /脅迫。 – Utkanos 2012-07-13 23:01:32

+0

是的,當我檢查is_object($用戶)我得到錯誤。但是我得到這個用戶對象,正如我在下面在使用symfony存儲庫的問題中提到的那樣。這怎麼可能不是一個對象? – Shwetanka 2012-07-13 23:10:26

0
$ur = $this->getDoctrine()->getRepository('PractoPvrBundle:User'); 
$user = $ur->findBy(array('email' => $email)); 

- > findBy返回一個對象數組,使用- > findOneBy

相關問題