在函数内部调用Object

Tim*_*Tim 6 php oop function

所以我不是在PHP中使用OOP.

这是我的问题我有一个对象,我可以调用一个函数,它提供了一个arrary.所以这是代码.

$obj = new OBJ();

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

go('http://www.mysite.com/hello');
Run Code Online (Sandbox Code Playgroud)

这给了我错误

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

Pet*_*ley 36

这不是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'];
}
Run Code Online (Sandbox Code Playgroud)

不推荐的方式

$obj = new OBJ();

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

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

还有另一个类似于OOP组合概念的解决方案 - 你可以让go()函数负责创建一个OBJ实例.

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

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

但这可能并不理想,因为每次执行go()时都会创建一个全新的OBJ实例.您可以通过使用静态变量"缓存"go()中的OBJ实例来解决此问题

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

但是这种类似组合的方法实际上只有在除go_()函数之外的其他地方不使用OBJ实例时才有用 - 如果你在其他地方使用它,那么参数方法是最好的选择.

这就是为手头的任务选择正确的解决方案!