2011-08-16 2 views
1

을 포함 내 previous question 내가문제는 경로

require_once($_SERVER['DOCUMENT_ROOT'] . '/proj/database/database-common.php'); 

의 좋아하는을 사용하는 것이 잘못이고, 대신

require_once(dirname(__FILE__) . '/database/database-common.php'); 

를 사용해야하지만, 내가 멀티를 제안 논의를 broght 레벨 계층과 어떤 수준에서 호출 될 수있는 몇 가지 공통 기능 (데이터 집합, 오류 처리 등) - 어떻게 처리해야합니까? 예 : 오류 처리에는 $ _SERVER [ 'DOCUMENT_ROOT'] \ css \ my.css의 CSS 파일이 필요합니다.

$_SERVER['DOCUMENT_ROOT']을 앵커 포인트로 사용하지 않으면 다른 것을 사용할 수 있습니까? 그렇지 않다면 공통 파일에 다른 파일을 포함 시키겠다는 것을 어떻게 처리 할 수 ​​있습니까?

예 : 확인/common.php가 앵커없이 데이터베이스/database_common.php thhen를 포함하고자하는 경우

root 
    `- databse 
     `- validation 

, 검증/common.php은 그것을 database_common.php 할 수있는 경로를 알 수는 아니다/common.php 검증 루트 디렉토리에있는 파일에서 incldued했다 (이것은 단순화 된 예입니다) 항상을 사용하는 파일의 파일을 필요로

내 philiosophy이며, 만약 그렇다면..\database/database_common.php 그럴 수 없어 단지 루트 디렉터리 파일에 everthing 포함 ....

나를 위해 최선의 방법을 분명히 할 수 있습니까? 감사합니다.

답변

2

당신은 사용되는 부트 스트랩 파일을 사용할 수 있습니다 당신의 다음이 될 것입니다 필요하므로 다른 모든 걸쳐 파일과이 모든 글로벌 매개 변수를 정의, 뭔가를

# bootstrap.php 
// Define path to application directory 
defined('APPLICATION_PATH') 
    || define('APPLICATION_PATH', realpath(dirname(__FILE__))); 

처럼 다른 파일을 포함해야하는 모든 파일이 마스터 파일이 필요

require 'path/to/bootstrap.php'; 
require APPLICATION_PATH . '/database/common.php'; 

이것은 부분적으로는 문제를 해결하지만 문제는 일관성을 유지합니다. 변경해야하는 부분은 첫 번째 요구 사항이지만 상대 경로를 사용하면 코드를 이식 할 수 있습니다.

php가 포함 경로의 모든 디렉토리를 검색하고 가장 비싼 syscall 중 하나 인 stat이 경로 검색 속도가 느려지므로 include_path을 사용하지 않았습니다.예 : 만약 당신이이 경로 .:/dir1:/dir2:/dir3을 포함해야하고 다음과 같은 네 가지 스탯 호출 할 것입니다 dir3 PHP에 foo.php라는 이름의 파일이 필요합니다 이러한 이유로

./foo.php 
/dir1/foo.php 
/dir2/foo.php 
/dir3/foo.php 

파일을 필요로 할 때 당신은 항상 절대 경로를 사용한다을 include 경로를 하나 또는 두 개의 경로로 제한해야합니다.

OOP를 사용하는 경우 언제든지 autoloading for your classes을 사용하여 파일을 필요로하지 않아도되고 꽤 잘 작동 할 수 있습니다. 이 기술의 좋은 예가 Zend Framework autoloader

+0

+1 나는이 아이디어가 마음에 든다. 이게 정말로 모든 사람들이 어떻게하는거야? – Mawg

+1

@Mawg 모두가이 접근법을 사용하는지 모르겠습니다. 나는 3 년 전에 자기가 만든 코드 (스파게티 코드로 자주 이어지는 코드)를 남겨두고 zend 프레임 워크와 RoR로 옮겼습니다. 코드 재사용과 대부분 컨벤션 오버 규칙 때문입니다. 내 주요 목표 중 하나는 이러한 종류의 문제를 피하는 것입니다. 나는 다른 프로젝트에서 재사용 될 수 있고 공통 언어를 사용하여 다른 동료와 공유 할 수있는 훌륭한 표준을 많이 배웠습니다. – Fabio

0

php.ini에 include_path를 설정하십시오. 이것은 포함을 위해 검색 될 것입니다. 포함 된 파일이 대체되도록 디렉토리 구조를 잘 정의하십시오.

include_path=".:/dir/first:/dir/second" 

이 포함 필요 파일에서 검색되는 의미 : php.ini 파일에서

다음과 같은 설정합니다. (현재 디렉토리, 다음/디렉토리/첫번째 그리고 마지막으로/디렉토리/초

그래서 require_once를 '데이터베이스/common.php이'에서 볼 수 있습니다 :

/dir/first/database/common.php 
/dir/second/database/common.php 
+0

으로 주어집니다. 다른 디렉토리를 추가 할 때까지 모든 하위 디렉토리를 열거하고 있지만 내 질문에 답하지 않는 것 같습니다. PHP 포함 파일은 어디에서 알지 못합니다. 포함되었으므로 사이트의 여러 수준에서 포함될 때 유효한 상대 경로를 어떻게 만들 수 있습니까? – Mawg