2009-05-20 116 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

相关问题