【问题标题】:Call an Object inside of a function在函数内部调用对象
【发布时间】:2010-10-27 18:03:53
【问题描述】:

所以我不会在 PHP 中进行 OOP。

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

$obj = new OBJ();

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

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

这给了我错误

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

【问题讨论】:

    标签: php oop function


    【解决方案1】:

    这不是 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 实例时才真正有用 - 如果你确实在其他地方使用它,那么参数方法是最佳选择。

    关键在于为手头的任务选择正确的解决方案!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2021-03-11
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多