2013-05-17 5 views
-1

다른 PHP 파일에서 몇 가지 다른 클래스로 작업하고 있습니다. 어떤 이유로, 처음으로 함수를 호출하면 제대로 작동하지만 두 번째 호출은 오류가 발생합니다. 기존 개체의 "개체가 아닌 개체의 함수 호출"

class something{ 
    private $db; 
    function myfunction($sql){ 
     $db = new db(); 
     $results = $db->select("sql query using $sql"); 
     return(empty($results[0]['name'])?0:1); 
    } 
} 

는 "DB가"나는 문제가에있다 믿지 않는 등 데이터베이스 쿼리를 처리하기 위해 사용하고 다른 클래스 내 "뭔가"클래스 (공개보기 위해 편집)입니다 첫 번째 호출 이후이 파일이 올바르게 작동합니다.

다음은 테스트를 위해 사용하는 코드입니다. 이것은 "무언가"클래스와 다른 PHP 파일에 있습니다.

$something = new something(); 
echo($something->myfunction('string')); 
echo($something->myfunction('string2')); 

앞에서 언급했듯이 첫 번째 호출 ("string")은 올바르게 작동하지만 두 번째 호출 ("string2")은 실패합니다. 이것은 내가 얻는 오류입니다.

Call to a member function select() on a non-object 

첫 번째 호출이 올바르게 작동 한 이후로 select 함수 (또는 db 클래스)에 문제가 있다고 생각하지 않습니다. 문제는 "myfunction"에 $ db를 선언하는 것과 관련이 있다고 생각합니다. 그러나 이유는 확실하지 않습니다.

+0

이것은 적어도 나를위한 bizzar입니다. 두 번째 결과물 만 단독으로 사용해 보았습니까? – samayo

+0

'$ something-> myfunction' 또는'$ db-> select'로 에러가 발생합니까? – silkfire

+0

예. 두 번째 호출은 첫 번째 호출이 주석 처리 된 경우 올바르게 작동합니다. 즉, 함수를 두 번 이상 호출하면 오류가 발생합니다. 그리고 오류가 "myfunction"내에 있다고 생각합니다. "db"를 선언하는 방식 때문이라고 생각하지만 해결 방법을 모르겠습니다. – Justin

답변

0

먼저 함수 호출이 끝날 때 명시 적으로 파기하지 않으면 함수를 호출 할 때마다 새 $ db를 만드는 것을 꺼려합니다. 둘째, 클래스 변수 private $ db를 만들지 만 db 개체를 할당하지 않습니다. 다음 시도해야합니다 : 그것은 더 잘 작동해야처럼

class something{ 
    private $db; 
    function myfunction($sql){ 
     if(!isset($this->db)){ 
      $this->db = new db(); 
     } 
     $results = $db->select("sql query using $sql"); 
     return(empty($results[0]['name'])?0:1); 
    } 
} 

내 기분이. 알려줘!


편집 :

마우스 오른쪽 버 그렇게 하나 쇼 위의 내 코드로 수행하거나 수행 할 클래스 생성자를 사용합니다. PHP에서는 생성자 객체가 클래스 이름이 아니며 __construct()로 정의됩니다. 내 접근법은 위의 주석에서 언급 한대로 DB 클래스를 확장하거나 생성자에서 수행하는 것입니다. 그 이유는 내가 그것을 피할 수 있다면 메소드 내부에 클래스 인스턴스를 생성하는 것을 좋아하지 않기 때문입니다. 객체가 생성 될 때 클래스 인스턴스를 한 번만 만들 수 있습니다. SOoooooOOOoOOoOOo :

class something{ 
    private $db; 
    public function __construct(){ 
     $this->db = new db(); 
    } 

    function myfunction($sql){ 
     $results = $this->db->select("sql query using $sql"); 
     return(empty($results[0]['name'])?0:1); 
    } 
} 

공지하는 PHP 일이 $ this-> 의 사용. 그렇지 않다면 익숙해 지세요. 당신은 그것을 한꺼번에 사용하게 될 것입니다. :) 행운을 빌어 요!

+0

또한 DB 기능이 something() 함수의 중요한 부분 인 경우 something() 클래스를 사용하여 DB 객체를 확장하는 것을 고려할 수 있습니까? – dudewad

+0

그밖에 내가 어떻게 선언 할 수 있습니까? Java에서 나는 바뀔 것이다 'private $ db; to 'private $ db = new db(); 하지만 PHP에서는 작동하지 않는 것 같다. 함수 밖에서 선언 할 수있는 방법이 있습니까? – Justin

+0

코드를 추가 할 수 있도록 내 응답 편집 ... – dudewad

0

어떤 유형의 DB 랩퍼를 사용하고 있습니까? 데이터베이스 지속성이 켜져 있습니까? 연결이 끊어지고 두 번째 시간이 다시 연결되지 않으므로 빈 DB 객체가 반환됩니다.

0

코드의 짧은 버전이라고 가정하고 $db을 한 번만 인스턴스화 할 논리가 있습니까? 이 경우에는 전화의 끝에서 사라질 것

$this->db = new db(); 

그렇지 않으면 DB 객체에

$db = new db(); 

에서 해당 라인을 변경해야합니다.

관련 문제