因此,我不打算在PHP中使用OOP。

这是我的问题,我有一个可以从中调用函数的对象,它可以提供反馈。所以这是代码。

$obj = new OBJ();

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

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

这给了我错误

致命错误:调用非对象上的成员函数grabArray()

最佳答案

这不是一个OOP问题,而是一个范围问题。 $ obj在函数go()中不可见。您要么需要将其作为参数传递,要么使用global关键字将其带入函数的作用域(不推荐)

推荐方式

$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实例。您可以通过使用静态变量在go()中“缓存” OBJ实例来解决此问题
function go( $url )
{
    static $obj;
    if ( is_null( $obj ) )
    {
        $obj = new OBJ();
    }
    $array = $obj->grabArray($url);
    echo $array['hits'];
}

但是,仅当您在go()函数内部未在其他任何地方使用OBJ实例时,这种类似于组合的方法才真正有用-如果在其他地方使用OBJ实例,则参数方法是最佳选择。

所有这些都是为手头的任务选择正确的解决方案!

09-10 04:23
查看更多