2013-11-26 46 views
1

有人可以显示,固定或告诉我为什么我收到此错误调用一个成员函数在非对象 - PHP

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。

+0

是什么'getByPerma'吗? –

+2

你正在用一个名为'$ movie'的数组覆盖你的'$ movie'对象,所以当你尝试可以调用'getRating()'时,你就在该数组上调用它,因此错误'在非对象”。所以只需将数组分配给不同的变量。 – Graham

+0

@格拉汉姆:评论应该是答案... – Thalaivar

回答

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

正在返回一些不是对象的东西。

所以我会

print_r($movie) 

第2行,看看我得到。

第二个奇怪的事情是:

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

在左侧使用了$影片作为数组,在右侧你使用它作为一个对象,然后再次哟发送的参数你使用$ movie ['id']作为数组。

所以:

如果你得到一个数组,数组不能具备的功能,该功能应该是一类外,将被称为像这样:

istead的

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

如果你正在得到一个物体,并且该物体实现了功能

getRating($movie_id) 

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

$movie->rating and $movie->id 

我asuming的属性声明为public。这不,虽然这样做的正确方法...的属性应该是私有的,你应该implemente为对象的属性这样的getter和setter方法:

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

在这种情况下得到的评价,使用

$movie->get_rating(); 

并以ASIGN值的评级,实施

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

而且ASIGN值是这样的:

$movie->set_rating($some_rating); 

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

+0

这是一个简单的问题最好的/详细的答案之一。来自我的同行程序员的+1 – Thalaivar

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

它看起来像

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

没有返回一个对象,所以后来在代码后面当你打电话

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

您正在调用非对象的函数。检查看什么电影$等于该行之前使用

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

不知道不过,好像$movie = $movie->getByPerma($perma,$language);没有返回一个对象。尝试做var_dump($movie);

相关问题