2010-06-29 2 views
0

클래스 (예 : 데이터베이스)가 있으면이 클래스를 인스턴스화하려고 시도한 스크립트의 위치를 ​​확인할 수 있습니다.해당 스크립트에서 호출 한 클래스에서 a의 위치를 ​​확인하십시오. PHP : s

예 : Database.class.php

$db = new Database; 

및 물 :

lib 
    Database.class.php 
app 
    action.class.php 

및 action.class.php에서 : I는 예시적인 디렉토리 구조과 같이이

function __construct(){ 
$name = //some code to find out that app/action.class.php just tried to instantiate me 
$name = explode('/',$name); 
if($name[0] = 'app') //allow script to use the class 
else $this->__destruct; //dont allow other scripts not in app dir for example 
} 

감사 누가 복음 가능인지 아닌지

UPDATE :이 시간 내 주셔서 감사합니다 (아래 답변에서) 가능하지만 좋은 습관처럼 것 같다, 나는 주로 @이를 implimenting 수 실 거예요 고든의 주장.

+2

내가 왜 이것을 원하는지 궁금합니다. –

+0

필자가 쓰고있는 플러그인 시스템으로 Idea를 던지고 있었는데, 그것은 플러그인이 클래스에서 사용할 수있는 기능을 제한하는 것이 었습니다. 가능한지 궁금했습니다. – Luke

답변

2

파일 시스템의 호출 인스턴스 또는 파일 위치가 데이터베이스 클래스의 종속성이면 생성자를 통해 전달합니다. 파일의 위치를 ​​찾으려면 Reflection 또는 magic __FILE__ constant을 사용하십시오. 예 :

// action.class.php 
public function initDb() 
{ 
    $this->db = new Database($this); 
} 

// Database.php 
public function __construct($invoker) 
{ 
    // reflective way to get $invokerLocation 
    $reflector = new ReflectionClass($invoker); 
    $invokerLocation = $reflector->getFileName(); 
    // check location 
} 

하거나

// action.class.php 
public function initDb() 
{ 
    $this->db = new Database(__FILE__); 
} 

// Database.php 
public function __construct($invokerLocation) 
{ 
    // check location 
} 

당신은 데이터베이스 생성자라는 것을 알아 debug_backtrace 싶지 않아요. 이름에서 알 수 있듯이 디버깅 용도로 사용됩니다. 추적 스택의 크기에 따라 백 트레이스를 가져 오는 것은 많은 시간과 리소스를 소비 할 수 있습니다. 그것을 전달하는 것은 더 깨끗하고 빠릅니다.

또한 파일의 위치에 따라 코드의 보안을 설정하면 파일 시스템에 대한 의존성이 생깁니다. 이는 코드의 냄새입니다.

+0

나는 냄새 맡아서 좋은 것을하지 않는다는 뜻인가요? 보안을 위해 디렉토리 구조에 의존하지 않을 것을 제안합니까? 이것에 대한 이유는 무엇입니까? 환호 Luke – Luke

+0

@ 루크. 예, [Code Smell] (http://en.wikipedia.org/wiki/Code_smell)은 전문 용어입니다. 보안을 폴더 이름에 묶는 것이 이상하게 보입니다. 그렇지 않습니까? 디렉터리 레이아웃이 아닌 코드에서 응용 프로그램을 제어하려고합니다.또한 이러한 커플 링을 생성하면 UnitTest 보안을 어렵게 만듭니다. – Gordon

+0

코드 냄새 참조 :) 멋진 용어에 대한 감사. 왜 그 나쁜 생각에 대한 설명을 주셔서 감사합니다. Luke – Luke

-1

저는 $_SERVER['SCRIPT_FILENAME'] 상수를 사용할 수 있다고 생각합니다.

사용 된 스크립트 파일을 전체 스택해야하는 경우 일부 output buffering, debug_backtrace 등으로 충분합니다.

+0

아니요 인스턴스가 생성 될 수있는 포함 된 파일이 아닌 실행중인 스크립트의 파일 이름을 반환하기 때문에 불가능합니다. –

+0

그 이유는 편집을 추가하는 과정에 있었던 이유입니다. 역 추적에 대해서. – Arkh

1

당신이 필사적이 다음 debug_backtrace() 필요하지만

$db = new Database('action.class.php'); 

를 사용하여 생성자에 정보를 전달하는 것이 더 쉽습니다하지만 코드에서 이러한 종속성을 만드는 것이 좋습니다되지 않습니다.

관련 문제