2013-11-26 26 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);

相關問題