2013-05-12 7 views
0

내 문제는 매우 간단하지만 해결할 수는 없습니다.PHP 클래스의 가변 범위

내 index.php에 두 개의 PHP 파일이 포함되어 있습니다. 설정 파일에서

require_once("/lib/config.php"); 
    require_once("/lib/connect.php"); 

은 내가 싱글 톤 클래스 연결이 connect.php에서 변수 #config에게

$config = array( 
    "db" => array( 
     "www_db" => array( 
      "username" => "user1", 
      "password" => "pass1", 
      "conn_string" => "blabla" 
     ) 
    ), 
    "paths" => array("images" => $_SERVER["DOCUMENT_ROOT"] . "/images") 
); 

을 선언합니다.

class Connection 
    { 

private static $instance = NULL; 

public static function getInstance() 
{ 
    if (!self::$instance) 
     self::$instance = new Connection(); 
    return self::$instance; 
} 


private $conn; 

// Create connection to Oracle 
public function getConnection() 
{ 
    //if (INCLUDE_CHECK == true) 
// { 
     $conn = oci_connect($this -> $config["db"]["www_db"]["username"], 
          $this -> $config["db"]["www_db"]["password"], 
          $this -> $config["db"]["www_db"]["conn_string"]); 

내 문제는 내 Connection 클래스에 config.php에 선언 된 $ config 변수가 표시되지 않는다는 것입니다. 또한 $ config를 전역으로 선언하려고했습니다. "Undefined variable : config ..." "... in connect.php"오류가 나타납니다. 도와주세요.

+1

, 당신은 $를 사용할 수 없습니다. – JorgeeFG

답변

3

외부에서 선언 된 변수를 클래스 내부에서 볼 수 없습니다. 클래스에 전달하십시오. 종속성 주입 (either setter or constructor injection)과 $config을 연결 클래스로 사용할 수 있습니다.

+0

안녕하세요, Shaun, 네, DB 정보를 필요로하는 메소드를 제외하고는 모두 작동합니다 (본질적으로 대체 생성자). 이들에 대한 인수로 DB 정보를 전달할 수 있지만, 단순성을 위해 global 키워드를 사용했습니다. 글로벌 범위에서 끌어 들이기. (아래 Chen의 대답 참조). 그래도 고마워! –

2

글로벌 변수를 포함 할시기를 지정하려면 global 키워드를 사용해야합니다.

$config = array ('one' => 'two'); 

class Foo { 
    public function bar() { 
     print_r($config); // NULL 
     global $config; 
     print_r($config); // Array ('one' => 'ywo') 
    } 
} 
+0

감사합니다. Chen! 이것은 생성자 삽입 및 설정 메소드가 내게 유용하지 않도록 내부 정적 메소드를 사용하기 때문에 해결 방법입니다. –

0

나는 당신의 Connection.class에 새 세터 메소드를 추가하는 것이 좋습니다을, 같은 :

public function set_config($config = array()) { 
    if (empty($config)) return false; 

    $this->_username = $config["username"]; 
    $this->_password = $config["password"]; 
    // ... 
} 

그런 다음 당신이 데이터를 사용할 수있어 어떻게 작동하는지 는 예를 들어,이입니다 다른 방법은 같은 :

global $config; 
:
oci_connection($this->_username, $this->_password); 

그렇지 않으면 전역은 $ 설정을 설정
+0

@Havelock 당신 말이 맞아요.하지만 Exception-Handling이 다른 장이라고 생각합니다. 예제 코드를 가능한 한 간단하게 유지하려고 노력합니다. :-) –

+0

내가 쓴 것처럼, 나는 statement global $ config를 사용하지만 여전히 $ config 변수를 보지 못한다. – Igor

+0

당신은 setter-method를 시도 했습니까? –

0

나는 이런 식으로 해결 :이 변수로 파일을 포함하는 경우는 현재 개체의 속성을 의미한다이 때문에

private $username = "usr1"; 
private $password = "pass1"; 
private $conn_string = "connection_string"; 

private $conn; 

// Create connection to Oracle 
public function getConnection() 
{ 
    $conn = oci_connect($this -> username, 
         $this -> password, 
         $this -> conn_string); 
    if (!$conn) { 
     $m = oci_error(); 
     echo $m['message'], "\n"; 
     exit; 
    } 
    else 
    { 
     return $conn; 
    } 
}