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


Calling a member function on a non object - 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));

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

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

编辑:

此外,我怀疑您实际处理的是数组,而不是对象。线路:

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

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

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

让用户退出返回,如:

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

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

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

此外,您还可以投射您的参数$user-like:

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

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

,这将引发错误
$ur = $this->getDoctrine()->getRepository('PractoPvrBundle:User');
$user = $ur->findBy(array('email' => $email));

->findBy返回对象数组,使用->findOneBy