Php 调用函数内部的对象

Php 调用函数内部的对象,php,oop,function,Php,Oop,Function,所以我不会在PHP中进行OOP 这是我的问题,我有一个可以调用函数的对象,它提供了一个数组。这是代码 $obj = new OBJ(); function go($url){ $array = $obj->grabArray($url); echo $array['hits']; } go('http://www.mysite.com/hello'); 这给了我一个错误 致命错误:对非对象调用成员函数grabArray()这不是OOP问题,而是范围问题$obj在函数g

所以我不会在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'];
}
不推荐的方式

$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'];
}
还有另一种解决方案类似于面向对象的组合概念——让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实例的情况下才有用——如果在其他地方使用,那么参数方法是最佳选择

这一切都是关于为手头的任务选择正确的解决方案