2009-05-20 113 views
6

所以我不想在PHP中使用OOP。調用一個函數內部的對象

這是我的問題我有一個對象,我可以調用一個函數,它提供了一個arrary。所以這裏是代碼。

$obj = new OBJ(); 

function go($url){ 
    $array = $obj->grabArray($url); 
    echo $array['hits']; 
} 

go('http://www.mysite.com/hello'); 

這給我的錯誤

致命錯誤:調用一個成員函數grabArray()非對象

回答

35

這不是一個OOP的問題上,這是一個範圍的問題。 $ obj在函數go()中不可見。您可能需要在把它作爲一個參數,或與全球關鍵字(不推薦)

推薦方式

$obj = new OBJ(); 

go('http://www.mysite.com/hello', $obj); 

function go($url, $object) 
{ 
    $array = $object->grabArray($url); 
    echo $array['hits']; 
} 

不推薦這種

$obj = new OBJ(); 

go('http://www.mysite.com/hello'); 

function go($url) 
{ 
    global $obj; 
    $array = $object->grabArray($url); 
    echo $array['hits']; 
} 

有把它納入功能的範圍另一種類似於組合OOP概念的解決方案 - 您將使go()函數負責創建OBJ實例。

go('http://www.mysite.com/hello'); 

function go($url) 
{ 
    $obj = new OBJ(); 
    $array = $obj->grabArray($url); 
    echo $array['hits']; 
} 

雖然這可能並不理想,因爲每次執行go()時都會創建一個全新的OBJ實例。您可以通過「緩存」 OBJ的往裏走的實例()用一個靜態變量

function go($url) 
{ 
    static $obj; 
    if (is_null($obj)) 
    { 
     $obj = new OBJ(); 
    } 
    $array = $obj->grabArray($url); 
    echo $array['hits']; 
} 

解決這個問題,但這種成分類似的做法真的是唯一有用的,如果你不使用你的OBJ的情況下其他任何地方,除了在go()函數內部 - 如果你確實在其他地方使用它,那麼參數方法是最好的選擇。

這是關於爲手頭的任務選擇正確的解決方案!

+0

工程很棒。謝謝! – Tim 2009-05-20 21:39:49

相關問題