본문 바로가기
연구_고민/PHP & MySql

인클루트 /인클루트 원스

by DevG 2007. 7. 28.

우선 include 와 require에 대해 모르고 있는 부분을 설명하겠다..

여러분이 알고 있는 error처리를 제외하고..

만약 if문 안에 include문이 있는경우 if문이 만족하지 못할때는
해당 include 파일에 대한 loading을 하지 않는다.

하지만 require같은 경우 if문이 만족하지 못해도 파일에 대한 loading을 한다는것이다..

 

 

[참고]

require 가 무조건 해당 파일을 로딩하던 것은 PHP 버전이 4.0.2 이전의 일이다. 그 이후 버전은 include 와 같이 호출될때에만 사용된다.

 


말로 써서 어렵게 느껴지실것 같아 예제 소스를 보겠다..

if($waiting)
    include "waiting.php";
->$waitng이 true가 아니면 waiting.php 파일을 loading 안한다..

if($waiting)
    require "waiting.php";
->$waiting이 true가 아니어도 loading을 한다..

이런 차이점이 있다.

그리고 _once를 사용하실때 주의하실 점이 있는데...

index.php 파일과 Common.inc 파일이 있다고 가정을 하겠습니다.
=======================
Index.php
-----------------------
include "Common.inc";
include_once "Test.inc";
=======================
->
Common.inc를 인클루드하며
Test.inc를 include_once로 인클루딩합니다

=======================
Common.inc
-----------------------
include_once "Test.inc";
=======================
->
Test.inc를 include_once로 인클루딩합니다


자 위와 같은 구조이다..
만약 프로그래머가 이런식으로 코딩을 했다면..
Test.inc 는 항상 Inclue 되어야 하는 파일일경우가 높다.
왜냐하면 여기저기서 Test.inc 를 로딩하기 때문이다..


하지만 먄약
include "Test.inc"
라고 로딩을 하면

오버로딩이라고 warning를 뱄기때문에 이 warning가 보기 싫어서 include_once를 쓴다..

자..여기서 첫번째 문제점..
1)index.php에서 Test.inc를 include 했는지 안했는지 체크를 합니다.
2)Test.inc가 include 된게 없으므로 Test.inc를 including 합니다.
3)Common.inc에서 또다시 그리고 Test.inc 가 include 유무를 체크합니다.
4)index.php에서 including 되었으니 include 안합니다.

자..여기서 문제점..Test.inc include 유무를 계속 체크한다는겁니다..
그냥 include도 마찬가지 아니냐~
라고 반문하실 수 있다..

솔직히 이 부분은 제가  확인하지는 못했지만
레퍼런스에 보면 include_once는
include 유무를 체크한다고 되어있다.


전 이 문구때문에 위에 제시한 문제점이 있을거라고 추측하고 말하는 것이다.
다시 한번 말씀드리지만 확인된건 아니다.

관련URL : http://kr.php.net/manual/en/function.include-once.php

자...그럼 얘기를 계속 이어나가서..
Test.inc가 필요없어졌다고 가정한다..

여기서 두번째 문제점...이 나옵니다.

그럼 Test.inc를 include_once 한 모든 페이지를 열어서 수정을 해줘야 한다...
왜냐하면
index.php에서 include_once "Test.inc"를 삭제했다 해도
Common.inc에서 Test.inc를 로딩하기 때문입니다.

그럼 여러분께서는
include라고 적어도 Common.inc에서 Test.inc를 로딩하게 될것이 아니냐!
라고 질문할것이다...

제가 위에서 언급했드시..
index.php, Common.inc 파일 모두
include "Test.inc";

라고 했으면 분명 오버로딩 warning를 뱄는다..

즉, include_once를 안쓰고 include문을 사용하게 되면..
위와 같은 상황을 막을 수 있고
보다 체계적인 프로그래밍을 할 수 있게 되는것이다.

결국은 프로그래머의 편리성(실수방지)을 위해서 _once가 있다고 보면 되는것이다...

 

include의 또다른 재미난 장나는 return 이 가능하다는점 이다.
// hello.php
<?
return 'Hello, Mr.' + $name ;
?>

// main.php
<?
$name = '거친마루';
$greet = include 'hello.php';
echo $greet; // will produce 'Hello, Mr. 거친마루'
?>
이렇게 쓰는것은 함수를 만들어 인클루드하는것보다 분명 비합리적이지만, 경우에따라 (예를들어 어떤 조건에 만족하지 않으면 출력을 하지 않고 종료해야 하는 어떤 루틴을 인클루드 처리할때도) 유용하게 쓰일수 있다.

include 되는 파일에서 exit; 해버리면 프로그램 자체가 종료되버리지만, return 하면 해당 include의 루틴만 빠져나가게 된다.

 

이 글은 스프링노트에서 작성되었습니다.