在非对象上调用成员函数 - php

时间:2012-07-13 22:56:44

标签: symfony1 doctrine-orm php

以下是我的SessionManager.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());
}

我收到了这个错误:

  

致命错误:在非对象上调用成员函数getUsername()   在   /home/shwetanka/src/Practo/PvrBundle/Manager/SessionManager.php   第49行

当我在问题行之前做var_dump($user);时,我正在打印完整的用户对象。我无法理解这个错误的原因。该功能存在于User类中。即使我尝试调用该类的任何其他函数,我也会得到该函数的相同错误。我是php的新手,很难调试这个问题。

$ user也是User实体的对象。我正在使用symfony2,这个对象通过使用它返回给我:

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

3 个答案:

答案 0 :(得分:2)

让用户退出返回状态,如:

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

如果这不能解决问题,出于调试目的,您可以尝试:

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

您也可以将参数$ user转换为:

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

如果您获得不同的类实例或非对象

,则会抛出错误

答案 1 :(得分:2)

有时在隐式转换为字符串的上下文中,PHP不能很好地处理方法调用...我不知道为什么。试试这个:

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

编辑:

另外,我怀疑你实际上是在处理一个数组而不是一个对象。这一行:

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

可能旨在返回许多结果。使用current()获取第一个:

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

答案 2 :(得分:0)

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

<强> - &GT; findBy 返回对象数组,使用 - &gt; findOneBy