2011-09-17 8 views
4

내 재사용 가능한 함수를 하나의 파일 (functions.php)로 corrals하는 파일이 있습니다. 그것을 필요로하는 모든 페이지에 include_once() '입니다. 내 사용자 지정 함수가 자신의 범위를 벗어난 MySQL 연결에 액세스하려고 할 때 오류가 발생합니다. 출처는 다음과 같습니다.PHP 함수의 범위

내 함수 액세스 변수가 범위 위에 선언 된 이유는 무엇입니까? 나는 $connect의 선언 안에 복사하여 성공적인 연결을 얻을 수있다.

내가 어떻게이 문제를 해결할 수 있는지, 또는 내가 여기서 잘못하고있는 것에 대한 통찰력이 있습니까?

답변

6

global 키워드를 사용하십시오.

function getmotd($user) { 
    global $connect; 
    $query = "SELECT cid FROM `users` 
    WHERE id = ".$user; 
    $query = mysql_query($query, $connect); // error occurs here, $connect is not a valid MySQL link-resource 
    /* ... */ 
} 

당신이, 당신은 아마 OOP 더 나을 것 재사용 가능한 코드를 확인하려면 당신이

function getmotd($user) { 
    $query = "SELECT cid FROM `users` 
    WHERE id = ".$user; 
    $query = mysql_query($query, $GLOBALS['connect']); // error occurs here, $connect is not a valid MySQL link-resource 
    /* ... */ 
} 

처럼 할 수도 있습니다. 데이터베이스에 대한 클래스를 만들고 데이터베이스 정보에 대한 일부 속성을 추가하고 키워드를 사용하여 함수에서 액세스 할 수 있습니다.

+0

Perfect! 고마워. 답은 8 분 안에 접수됩니다. – esqew

+0

+1 정확한 답. 'global '없이는 사용할 수 없다. –

5

$ connect가 함수 범위를 벗어나므로 액세스 할 수 없습니다. 즉, PHP는 함수 안에있는 변수 만 볼 수 있습니다. 글로벌 키워드를 사용하여 Kemal이 제안한 것처럼 변수가 함수의 범위를 벗어 났음을 PHP로 알릴 수는 있지만 더 좋은 방법은 함수를 연결에 전달하는 것입니다. 이것은 당신에게 더 나은 캡슐을 줄 것이다. 필요한 리소스와 데이터 ("의존성 삽입"이라고 알려진 방식)를 전달하면서 함수 (및 이후 클래스)를 작성하는 방법을 배우면보다 명확하고 유지 보수가 쉬운 코드를 찾을 수 있습니다. 예를 들면 다음과 같습니다.

function getmotd($db, $user) { 
    $query = "SELECT cid FROM users WHERE id = " . (int)$user; 
    $result = mysql_query($query, $db); 
    /.../ 
} 

$connect = mysql_connect(...); 
mysql_select_db(...); 
$motd = getmotd($connect, $user); 

희망이 있습니다.

+0

+1 처음에는이 방법을 생각해 봤어야했다. –