2011-12-03 3 views
1

약 20 개의 기능을 등록하는 PHP 스크립트가 있습니다. 이상적으로 그것은 require_once으로로드 될 것입니다. 나는 그것이 어떻게 든 그것이 두 번 이상로드 될지라도 함수를 다시 등록하려고 시도하지 않기를 원한다. !function_exists에 각 선언을 래핑 할 수 있지만 더 빠른 방법이 있는지 궁금합니다. (또는 !function_exists에 대한 20 건의 호출이 무시할만한 수준이라고 생각하십니까?) exit을 사용해 보았지만 오류가 발생합니다. 오류가 발생하지 않고 종료 할 수 있습니까?종료 PHP 스크립트 없음 오류

if (/* already loaded */) { 
    /* leave gracefully */ 
} 

/* declare ~20 functions */ 

답변

4
if (!defined('ALREADY_LOADED')) { 
    define('ALREADY_LOADED', true); 
    // rest of your code goes here 

} 

이 일정한 ALREADY_LOADED가 정의되어 있는지 확인하고, 그렇지 않은 경우, 그것은 상수를 정의하고 당신이 원하는 어떤 다른 할 것입니다.

한 번 실행되면 상수가 정의되고 두 번째 실행되지 않습니다.

ALREADY_LOADED보다 자세한 상수 이름을 사용하는 것이 좋습니다.

+0

쿨인데 'global'을 사용하는 것에 대해 생각했지만 상수가 더 쉽다고 생각합니다. – ryanve

+0

다른 파일에서 동일한 상수 이름을 사용하지 마십시오. ;) –

+0

이것은 다른 언어의 포함 보호자라고도합니다.) –

1

저자로 더 많은 다음 번에, 그것을 필요로 (또는 일관되게 require_once() 사용) 다시 등록 기능에 대한 문제가 안하지 마십시오.

오류없이 종료하려면 die()을 시도하십시오.

+0

'die()'는 exit()의 별칭이며 치명적인 오류가 발생합니다. – ryanve

1

첫 번째 단계에서 기능을 다시 선언하지 않으려합니다 (여기서는 두 번 이상 필요합니다). 20x function_exists()를 수행하는 데 비용이 들지 않고 쓰기 및 줄 바꿈 만 가능합니다.) 아마도 클래스/메소드를 사용할 수 있습니다.

+0

원래 아이디어는 클래스를 사용하는 것이지만 문제가있었습니다. 그것을 얻는 것. 'class RAVE {/ * declarations * /}'에 랩핑을 시도한 다음,'$ rave = new RAVE();'를 행운과 함께 넣습니다. – ryanve

1

function_exists은 나쁘지 않습니다.

다음과 같은 방법으로 PHP 스크립트 파일을 작성할 수 있습니다.

/* file1.php */ 
if(!defined('FILE1')) { 
define('FILE1', 1); 
///////////////////////// 
// PUT file contents here. 

///////////////////////// 
}// file.php finished. 

이제이 파일을 원하는만큼 자주 포함 할 수 있습니다. 아무것도 다시 정의되지 않습니다. 나는 OOP를 사용하여 생각

2

는 가

class SimleClass{ 
    public static function func1($arg){...} 
} 

이 SimpeClass :: FUNC1 ($에 인수)를 사용하여 정적 함수를 가진 클래스로 사용할 수있는 가장 실용적인 방법입니다;

또는 sigleton

class SimleClass{ 
    protected static $_instance=null; 
    private function __construct(){...} 
    public static function getInstance(){ 
     if(is_null(self::$_instance) 
      self::$_instance=new SimpleClass(); 
     return self::$_instance; 
    } 
    public function func1($arg){...} 
} 

이 그것을 사용 에 SimpleClass ::의 getInstance() -> FUNC1 ($에 인수);

과 어떻게 이

include_once 문 사용할 수 있으며 자동 로더 클래스를

function myClassLoader($className){ 
include_once "/lib/$className.php"; 
} 
spl_autoload_register(myClassLoader); 

을 구현할 수 자체를 생각 연결 ================== =========================================================================================================================================================================================== 데이터. 아마도 응용 프로그램을 재정비하여보다 논리적 인 구조를 만들 수 있습니다.

+0

Thx- 나는 그 아이디어를 좋아합니다. 함수가 전역 적으로 노출되도록 만들기 위해 노력하고 있습니다. 즉,'SimpeClass :: func1 ($ arg)'대신'func1 ($ arg)'로 호출 할 수 있습니다.이 작업을 수행하는 가장 좋은 방법은 무엇입니까? – ryanve

+0

문맥에서 이혼 된이 문제의 관련성을 이해하는 것은 매우 어렵습니다. 클래스를 기반으로하는 편리한 솔루션이 아닌 이유를 설명하십시오. 다른 방법을 찾을 수 있습니까? – nonlux