Вызов объекта внутри функции

Поэтому я не буду ООП на PHP.

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

$obj = new OBJ(); function go($url){ $array = $obj->grabArray($url); echo $array['hits']; } go('http://www.mysite.com/hello'); 

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

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

Это не проблема ООП, это проблема с областью. $ 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 (), если вы используете его в другом месте, то подход с параметрами является лучшим выбором.

Все дело в том, чтобы выбрать правильное решение для этой задачи!