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

时间:2013-11-26 20:58:25

标签: php mysql

有人可以展示,修复或告诉我为什么会收到此错误

Call to a member function getRating() on a non-object

这是函数

public function getRating($movieid){
    $movieid = mysql_real_escape_string($movieid);
    $average = 0;
    $e = mysql_query("SELECT AVG(`rating`) as average FROM movie_ratings WHERE movieid='$movieid'") or die(mysql_error());
    if (mysql_num_rows($e)>0){
      extract(mysql_fetch_array($e));
    }
    return $average;
}

这就是我调用函数的方式

$movie = $movie->getByPerma($perma,$language);

if (empty($movie)){
    $movie = '';
} else {

    $movie['rating'] = $movie->getRating($movie['id']);
    $tags = $movie->getMovieCategoryDetails($movie['id'],$language);
    if (count($tags)){
        $smarty->assign("tags",$tags);
    } else {
        $smarty->assign("tags","");
    }

}

有人可以帮助我,因为我是php的新手。

4 个答案:

答案 0 :(得分:1)

在没有看到其余代码的情况下,不清楚问题是什么,但似乎您正在为一个类实例化$movie,然后将$movie指定为数组。这可能不太好,因为数组$movie赋值只会消除类$movie赋值。

我建议重命名类变量或数组。这是重命名为$movie_array的数组:

$movie_array = $movie->getByPerma($perma,$language);

if (empty($movie_array)){
    $movie_array = '';
} else {
    $movie_array['rating'] = $movie->getRating($movie_array['id']);
    $tags = $movie->getMovieCategoryDetails($movie_array['id'], $language);
    if (count($tags)){
        $smarty->assign("tags", $tags);
    } else {
        $smarty->assign("tags","");
    }
}

这里重命名的是$movie_class

$movie = $movie_class->getByPerma($perma,$language);

if (empty($movie)){
    $movie = '';
} else {
    $movie['rating'] = $movie_class->getRating($movie['id']);
    $tags = $movie_class->getMovieCategoryDetails($movie['id'], $language);
    if (count($tags)){
        $smarty->assign("tags", $tags);
    } else {
        $smarty->assign("tags","");
    }
}

答案 1 :(得分:1)

看起来像是

$movie = $movie->getByPerma($perma,$language);

没有返回一个对象,因此稍后在代码中调用

$movie['rating'] = $movie->getRating($movie['id']);

您正在调用非对象上的函数。使用

检查此行之前$ movie等于什么
var_dump($movie);
$movie=['rating'] = $movie->getRating($movie['id']);

答案 2 :(得分:1)

$movie->getByPerma($perma,$language); 

返回的东西不是对象。

所以我会

print_r($movie)

在第2行,看看我得到了什么。

第二个奇怪的事情是:

$movie['rating'] = $movie->getRating($movie['id']);

在左侧,您使用$ movie作为数组,在右侧,您将其用作对象,然后再次将您使用$ movie ['id']的参数作为数组发送。

所以:

如果你得到一个数组,数组不能有函数,那么函数应该在一个类之外,并且会像这样被调用:

getRating($movie['id']) 

而不是

$movie->getRating($movie['id']).

如果您正在获取对象,并且该对象实现了该功能

getRating($movie_id)

然后访问对象属性的方法是:

$movie->rating and $movie->id

我认为这些属性是公开的。这不是正确的方法...虽然属性应该是私有的,你应该为对象属性实现getter和setter,如下所示:

 private $rating;
 public function get_rating()
{
  return $this->rating; 
}

在这种情况下,要获得评级,请使用

 $movie->get_rating();

要将值赋予评级,请执行

  public function set_rating($r)
  {
     $this->rating=$r; 
  }

像这样的asign值:

$movie->set_rating($some_rating);

Dunno,如果我帮助或使一切更令人困惑:S但随时问我问题:)

答案 3 :(得分:0)

不确定,好像$movie = $movie->getByPerma($perma,$language);似乎没有返回一个对象。尝试var_dump($movie);