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