2009-05-20 4 views
6

그래서 저는 PHP에서 OOP하지 않을 것입니다.함수 내부에서 객체 호출

여기에 내 문제가 있습니다. 저는 함수에서 호출 할 수있는 객체가 있습니다. 여기 코드가 있습니다. 이것은 나에게

치명적인 오류가 오류 제공

$obj = new OBJ(); 

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

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

: 개체가 아닌

답변

35

이는 OOP의 문제가되지 않습니다에 멤버 함수 grabArray() 호출에, 그것은 범위의 문제입니다. $ obj는 go() 함수 내에서 보이지 않습니다. 당신은 매개 변수로에 전달할 필요가, 또는있다 (권장하지 않음) 글로벌 키워드

권장되는 방법

$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 인스턴스를 만들므로 이상적인 것은 아닙니다. 당신은 정적 변수

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

에 "캐시"이동 내부 OBJ의 인스턴스()에 의해이 문제를 해결할 수 그러나 당신이 다른 외에 어디 OBJ의 인스턴스를 사용하지 않는 경우이 구성 같은 접근 방식은 정말에만 유용 go() 함수 내부 - 다른 곳에서 사용하는 경우 매개 변수 방식이 최선의 선택입니다.

모든 작업에 적합한 솔루션을 선택하는 것이 중요합니다.

+0

위대한 작품입니다. 고맙습니다! – Tim

+0

세 번째 방법을 사용해 주셔서 감사합니다. – doflamingo

관련 문제