Вызовите объект внутри функции - PullRequest
6 голосов
/ 20 мая 2009

Так что я не ООП в PHP.

Вот моя проблема. У меня есть объект, из которого я могу вызвать функцию, и он возвращает обратно массив. Итак, вот код.

$obj = new OBJ();

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

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

Это дает мне ошибку

Неустранимая ошибка: вызов функции-члена grabArray () для необъекта

1 Ответ

35 голосов
/ 20 мая 2009

Это не проблема ООП, это проблема объема. $ 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'];
}

Есть еще одно решение, аналогичное концепции компоновки ООП - вы бы возложили на функцию go () ответственность за создание экземпляра OBJ.

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

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

Это, вероятно, не идеально, так как вы будете создавать новый экземпляр OBJ каждый раз, когда выполняете go (). Это можно исправить, "кэшировав" экземпляр OBJ внутри go () со статической переменной

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

Но подобный композиционный подход действительно полезен только в том случае, если вы не используете свой экземпляр OBJ где-либо еще, кроме как внутри функции go () - если вы используете его в другом месте, тогда подход с использованием параметров - лучший выбор.

Это все о выборе правильного решения для задачи под рукой!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...