코드/PHP

[PHP] 특수한 상수들

Yeah-Panda 2015. 8. 7. 17:56
    echo __FILE__;

__FILE__ 상수가 사용된 PHP 파일이 웹서버 컴퓨터 하드 드라이브에 저장된 물리적인 디렉토리 경로를 가져온다.
www.naver.com/news/topic.html
이런 웹상의 경로가 아니라

D:\APM_Setup\doc_test\project\news\topic.html

이런 종류의 경로값을 반환한다. 현재 파일이 구동되고 있는 웹서버 컴퓨터 폴더구조다.


$_SEVER['PHP_SELF'] 와 비교할때 인클루드시 반환하는 결과가 다르더다.

/* init.php */
$file = __FILE__;
$self = $_SERVER['PHP_SELF'];

/* view.php */
include_once(init.php);
echo $file; // init.php 반환 
echo $self; // view.php 반환/

인클루드 시키면 __FILE__ 은 이 상수코드가 입력된 php 파일의 참조를 반환하고 $_SERVER['PHP_SELF'] 얘는 최종적으로 보이는 페이지의 참조를 반환한다.

주의해야 할 점은 루트 디렉토리 경로를 변수로 선언하고자 할 때 PHP 내부에서와 HTML 파일 경로등은 조금 다르게 적용된다.
가령

/* init.php */
$_DIR_ROOT = str_replace('\\', '/', dirname(__FILE__));
$_WEB_ROOT = dirname($_SERVER['PHP_SELF']);
$_WEB_ROOT = array_filter(explode('/', $_WEB_ROOT));
$_WEB_ROOT = '/'.array_shift($_WEB_ROOT).'/';

include_once($_DIR_ROOT.'/inc/config.php');

/* config.php */
class GlobalPath{};
$GP = new GlobalPath();
$GP -> ROOT    = $_DIR_ROOT.'/';
$GP -> WEBROOT = $_WEB_ROOT;
$GP -> INC     = $GP -> ROOT .'inc/';

/* index.php */
include_once('../init.php');
include_once($GP -> INC.'doc.head.php');

기본적으로 init.php 파일이 프로젝트의 최상위 폴더에 위치한다고 가정한다

그리고 이 웹사이트는 localhost/temp/ 라는 가상디렉토리에 위치하고 있다


init.php 파일에서 $_DIR_ROOT 를 선언하고 \를 '/' 로 바꿔 놨다.

그리고 $_DIR_ROOT 를 ROOT 라는 식별자로 다시 GlobalPath 객체의 속성으로 넘겨줬다. ( 여기에서는 굳이 그럴필요 없다만.. ㅎ )
$_DIR_ROOT 는 알겠지만 init.php 파일이 저장된 폴더 경로다. 예를 들면 "D:/APM_Setup/html_doc/ " 이런 식의 값일 것이다 , 물론 여기는 현재 웹사이트의 최상위 폴더다.( 서버 컴퓨터 내부 폴더 경로 )


다시 $_WEB_ROOT 라는 변수에 현재 init.php 파일을 include 하거나 호출한 파일의 경로를 저장하고 PHP 함수등( dirname, explode 등)을 통해 폴더 구조에서 최상위 폴더 경로를 저장했다.

그러면 이 경로들($_DIR_ROOT, $_WEBROOT)을 이용해서 다른 파일들을 인클루드 하거나 링크시켜보자


index.php 파일을 보면 알겠지만 $GP -> INC.'doc.head.php' 의 경로로 doc.head.php 파일을 인클루드 시키는데는 아무런 문제가 없다. 그냥 $GP->INC 에 선언된 경로에 파일이 존재한다.


문제는 html 의 src, href 속성등에 선언할 경우다.







요런 식으로 css 파일을 불러오게 되면 $GP -> ROOT 의 경우 못 불러 온다
보면 알겠지만 경로가 다르다.
엄연히 따지면 $GP ->ROOT 가 정확한 경로다.
하지만 html 내부에 쓰일 경우는 웹사이트의 경로를 타야 한다
즉 웹사이트 경로에 따라 가상 디렉터리 아래로 들어가야한다.

물론 저기에서 www.domain.com/temp/css/basic.css 라면 더 정확할 것이다.(도메인이야 없어도 상관은 없다 )
이 부분을 주의해서 사용해야 겠다.

'코드 > PHP' 카테고리의 다른 글

[MySql]MySql Pagination, 페이지 리스팅  (0) 2015.08.13
[PHP]Query 결과 재사용, 인덱스 리셋  (0) 2015.08.13
[MySql]외래키, Foreign Key 설정  (0) 2015.08.03
[정규표현식]IP 주소찾기  (0) 2015.07.30
port 번호 모음  (0) 2015.07.29