2012-07-13 46 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

相关问题