2012-02-01 3 views
3

함수 외부에 파일을 포함시키고 작동시키는 방법이 있습니까?PHP 함수가 아닌 파일 필요

즉.

require('db.inc.php') 
function add() { 

     $n = $DBH -> prepare(""); 
     $n -> execute((array)$s); 
} 

그래서 파일 : 나는 내 내 기능 파일, functions.php이 파일이 필요가 지금

switch (DB_TYPE) { 
case MYSQL : 
    try { 
     $DBH = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . "", DB_USER, DB_PASS); 
     $DBH -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } catch(PDOException $e) { 
     echo "Error in Connection" . $e -> getMessage(); 
    } 
} 

: 나는 파일 db.inc.php이이 내 DB 연결 문자열을 포함 제대로 추가되지만 내 함수는 $ DBH 핸들에 액세스 할 수 없습니다. 내 기능에 파일을 포함시킬 때만 :

function add(){ 
require('db.inc.php') 

....etc.... 

} 

내 기능이 작동합니다.

많은 파일에서 적어도 4-5 개의 기능을 갖기 때문에 기능 밖에서 기능을 필요로하고 기능이 작동하도록 할 수 있습니까?

감사와 관련

+0

테스트하기 어렵다 중복 코드를 많이 생산할 예정을 목표로 무엇을. 그냥 말하자면, 기술적으로 당신이 요구하는 것을 할 수 있습니다, 질문은 당신이 정말로 그것을 원합니까? – hakre

답변

1

을, 당신은 선언 할 수 변수는 글로벌 변수이지만 실제로는 그렇게하는 것이 좋지 않습니다. 대신 함수 전달자의 호출자에게 인수로 핸들을 전달해야합니다. 실패하면 데이터베이스 팩토리를 만들어 각 함수 내에서 호출 할 수 있습니다.

require을 (를) 기능 외에서 호출해야하는 이유는 무엇입니까?

+0

그래, 나는 전역 변수가 나쁘다는 것을 알고있다. 그래서 나는 그것을 사용하는 것을 피했다. 내가 왜 그것을 바깥으로 원 하느냐하는 이유는 내가 한 번만 요구하기를 원하기 때문이다. – d123

+0

require_once()? – 472084

0
당신은 단지 기능의 범위를 가지고 글로벌 키워드를 사용하려면

:

function add() { 
    global $DBH; 
    $n = $DBH -> prepare(""); 
    $n -> execute((array)$s); 
} 

이 변수 범위에 대한 자세한 읽기 this link를 참조하십시오.

$GLOBALS을 사용할 수도 있지만이 방법에 대한 팬이 아닙니다.

add($DBH); 

function add(&$DBH) { 
    global $DBH; 
    $n = $DBH -> prepare(""); 
    $n -> execute((array)$s); 
} 
0

당신은 global 연산자를 사용할 수 있습니다 : 당신이 add()를 호출 할 때

또는 참조로 핸들을 전달할 수있는 기능을 외부 파일을 포함하면

require('db.inc.php') 
function add() { 
     global $DBH; 
     $n = $DBH -> prepare(""); 
     $n -> execute((array)$s); 
} 
1

실제로 전역에 대한 유일한 대안은 객체 지향 트릭과 기술을 사용하는 것입니다. 예를 들어 클래스의 집합으로 기능을 구현하면 정적 공용 클래스 변수에 전역 변수로 액세스 할 수 있습니다. 또 다른 방법은 단일 객체 클래스에 표준 PHP 패턴을 사용하는 것입니다. 이는 표준 PDO 클래스를 래핑하는 것처럼 보이는 경우 특히 관련이 있습니다. 제 경우에는 mysqli를 사용하지만 동일한 기술이 적용됩니다. 모든 모듈은 AppDB::get()을 사용하여 데이터베이스 오브젝트에 액세스 할 수 있습니다. 여기 당신에게 아이디어를 제공하기 위해 내 모듈 프리앰블이다 (I 짧은 그것을 유지하기 위해 doxygen이 문서를 손질 한) :

class AppDB extends mysqli {    

    /**    
    * This class uses a standard single class object pattern.    
    */    
    private static $_instance;    
    private static $_class = __CLASS__;    
    private function __clone() {}    
    /**    
    * Initialise the blog context. This is a static method since only one AppDB instance is allowed. The    
    * $connectParams must be provided on first invocation.    
    */    
    public static function get() {    

     if (!isset(self::$_instance)) self::$_instance = new self::$_class();    
     return self::$_instance;    
    }    

    /**    
    * AppDB constructor. Connect to the database and initialise the list of tables with the given prefix.    
    */    
    private function __construct() {    

     parent::init();    
     list($host, $db, $user, $passwd, $this->tablePrefix) = explode (':', SQL_CONTEXT);    

     if(!parent::real_connect($host, $user, $passwd, $db)) {    
      throw new Exception ('Connect Error (' .    
       mysqli_connect_errno() . ') ' . mysqli_connect_error());    
     }    
     ...    
    } 
    ... 
}