include 와 require의 차이점 그리고 _once사용시 주의할점..
컨텐츠 정보
- 19,989 조회
- 1 추천
- 목록
본문
http://kr.php.net/manual/en/function.include-once.php
http://kr.php.net/manual/en/function.require-once.php
얼마만에 쓰는 팁엔텍인지 모르겠습니다..^^;
솔직히 습자지 같은 지식가지고 이런말 하기 굉장히 부끄럽지만..
감히 한자 한자 적어 보겠습니다.
--------------------------------------------------------
아래 include문에 대한 글이 있길래 읽고 리플로 달려다가..
그냥 새로운글로 하나 씁니다..
우선 include 와 require에 대해 모르고 있는 부분을 설명하겠습니다..
여러분이 알고 있는 error처리를 제외하고..
만약 if문 안에 include문이 있는경우 if문이 만족하지 못할때는
해당 include 파일에 대한 loading을 하지 않습니다.
하지만 require같은 경우 if문이 만족하지 못해도 파일에 대한 loading을 한다는것이죠..
말로 써서 어렵게 느껴지실것 같아 예제 소스를 드리겠습니다..
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 하는것이 바람직하지 못하다고 생각합니다.
루프안에서 include 되는것도 안좋죠.
분명 꼼꼼히 짜면 once 는 필요치 않겠으나,
실수를 방지하기 위해 그냥 붙여주고 있습니다.
그리고, 위에 언급했듯 루프 안에서도 include 가 가능하기 때문에, 에러는 나지 않습니다.
warning 이나 notice 겠죠. (~E_WARNING & ~E_NOTICE 가 디폴트라 웬만해선 보이지 않습니다.)
에러가 난다면 once 는 필요 없죠. 08/12 18:38:03
기다림 아..제가 용어 선택을 잘못했군요..^^;
제가 말한 에러는 warning이었습니다..^^;
정정하겠습니다~^^ 08/12 18:41:13
거친마루 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의 루틴만 빠져나가게 되니까요 : ) 08/12 18:48:22
기다림 효진님 말씀대로 실수를 방지할 수 는 있는점은 저도 맘에 드는 부분입니다..아무래도 프로그래머의 실수를 처리해준다는게..^^
그런데 제가 예를 든데로 Test.inc파일을 삭제할경우 모든 파일을 열어야 하는거죠..
이럴 일은 없겠지만 예를 들어
만약 Test.inc의 용도가 바꼇다고 가정해 보겠습니다.
Test.inc에 원래 그냥 Array 같은게 담겨있었는데
DBConnect 이나..머 기타 중요한..외부에 알려지면 크리티컬한 파일이 되었다고 가정합시다..
이럴경우 제가 본문에서 썻던것 처럼 _once한 파일을 다 열어서 지워야 하는데 혹시나 하나를 빼먹게 될 경우..그럴경우 위험성이 있을수도 있죠.. 08/12 18:49:26
기다림 오..return...쓸일이 없어서 잊어먹고 살았던..^^;
좋은 정보 감사합니다 마루님~^^ 08/12 18:51:30
통구이 include 와 require에 차이점 그리고 _once사용시 주의할점..
include 와 require의 차이점 그리고 _once사용시 주의할점..
국민학교 국어시간에 졸았습니까? 왜 '에' 하고 '의' 하고
구별을 못하십니까? 심심찮게 이런 글을 보는데... 08/12 18:58:38
기다림 아..나름대로 맞춤법 신경쓴다면서 했는데;;
6년동안 국민학교다니면서 한번도 국어시간에 안졸았다고는 못하겠네요..^^;
정정했습니다..^^ 08/12 19:00:35
송효진 find . -iname "*.php" -exec perl -pi -e "s/include_once Test\\.inc;\\r\\n//g" "{}" \\;
ㄴ(-.- )ㄱ===3==3=3 08/12 19:01:59
기다림 효진님 윈도우면...? -_-v 08/12 19:04:21
nextream 기다림// 리눅스로 통째로 옮긴후 효진님의 솔루션을 적용함
v-_-v 08/12 19:06:43
기다림 헉...대략 낭패 -_-;;
nextream님...우너츄..>ㅁ<)=b
ㅎㅎ 그리고 마루님이랑 넥수투림님 언제 함...^^; 08/12 19:09:09
Test 윈도우면 탐색기의 오른쪽에 보면 내용에서 찾는 기능이 있습니다..
더 쉽죠.. 08/12 19:13:06
entr 많은 프로그래머들이 include 와 include_once 의 선택기준이 편리성은 아닐것이라고 생각되는군요... 왠만하면 include 를 쓰는것이 좋겠지만. cms나 테플릿등을 개발하다 보면 동일한 모듈성 File 을 include 하는 경우가 비일비재합니다..이러한 경우에는 include_once 를 쓰는것이 좋겠죠... 옳고 그름을 따질 분제는 아닌것 같습니다....
늘...닭잡는데 닭잡는 칼을...소잡는데 소잡는 칼을~~ 08/12 20:54:47
... 걍 _once쓰는게 좋을듯...
속도를 생각한다면 서버를 업글하징... 개발비용은 비용아닌가요 08/12 22:46:41
s 기다림//
예제가 꼭 include_once를 써서 안좋은 것에 대해서 설명하기 위해 만들어진 것 같습니다.
include나 include_once는 필요에 따라서 알맞게 사용하면 된다고 봅니다.
php 코어 개발자가 심심해서 include_once를 만든건 아닐테니깐요. 08/12 22:54:16
--; once를 쓰지 말라고...너무 하네요..잘 알지도 못하면서..--;;
그런 이유말고도 _once는 효율적으로 쓰이고 있습니다.
가끔 웹서버에서 include를 두번씩 로드하는 경우가 있습니다.
사실은 아주 빈번하게 일어나는 일이지요.
그리고 예전에 특정한 플래그 값을 두어서 두번 로드 하지 않도록 include를 처리하는게 정교한 프로그래밍으로 인정되던 때도 있었습니다.
뭐...그때쯤에는 어쩌면 님께서는 프로그래머가 아니었지도 모르겠지만. 여하튼 그런의미에서. include_once는 의미가 있습니다. 굳이 플래그 값을 주지 않아도 해결해 줄테니깐요.
특정한 클래스 등이 두번 로드된다고 생각하면 끔찍하네요.
그리고 바로 위의 분의 말처럼 결국에는 전부 _once를 쓰는게 훨씬 효울적이게 됩니다. 비용 대 효율로 따지면....
프로그래밍이 속도만을 따진다면 아마도 php는 존재하지도 않았을겁니다. 오직 기계어만을 쓰는게 훨씬 빠르겠죠..--;;
중요한건 개발할때 유지보수 혹은 관리를 위해 최소한 구조적인 혹은 function base 혹은 class base로 개발하고 항상 개발의 일관성을 유지하는게 좋습니다. 아주 특정한 프로그래밍을 제외하고는요..일반적인 어플리케이션에서는 이런 부분이 더 중요합니다. 결국 프로그램은 개발로만 끝나는게 아니라 어느 일정한 기간을 유지보수 하고 다시 개발되는 사이클을 탑니다. 이런 큰 의미에서의 프로그래밍을 생각하신다면 _once가 바람직하지 않다는 주장은 아주 국지적인 자기 아집에 불과한거죠.
그럼..이만 08/12 23:04:11
지나는 이 오버로딩이라...
말씀하신건 오버로딩이 아니죠 : ) 08/13 0:31:20
s include_once 가 속도때문에 배제되야 한다고 생각하지 않습니다. 저는 include보다는 include_once를 주로 씁니다. 모듈방식으로 개발할 때 어미 클래스를 여러 자식 클래스가 include 해야 하는데 어떤 자식클래스가 쓰일지 알 수가 없죠.. 이건 동적으로 결정되는 부분이기 때문에요.
include_once는 이런 경우에 아주 유용합니다. 속도고 뭐고 "그냥" 필요합니다 이럴때는. 어차피 include_once와 같은 동작하는 루틴을 만들어줘야 하기 때문이죠. 08/13 2:36:47
freezn 저도 찬성 쪽... 주로 기본적인(config 나 각 부분에서 필요로 하는 class) 파일로딩에 사용합니다.
특히나 스크립팅 언어인 php에서 어떠한 이유로 병목현상이 일어났고 그로 인해 재 요청이 들어가고... 분리해놓은 class 모듈 파일이 재로딩 된다면 -_-a;;
08/13 6:21:45
행복한고니 첫번째 설명 틀렸습니다. 엄밀히 말하면 완전히 틀린 것은 아니지만요. require 가 무조건 해당 파일을 로딩하던 것은 PHP 버전이 4.0.2 이전의 일입니다. 그 이후 버전은 include 와 같이 호출될때에만 사용됩니다. 08/13 9:02:58
기다림 우선 속도적인 문제..
저는 이 부분에서의 속도차이에는 그리 많은 비중을 들지 않았습니다.단지 이럴 부분도 있다...라고 명시정도 였죠..
저는 좀 더 체계적으로 구조를 짜고 프로그래밍을 한다면 _once는 구지 안써도 된다고 생각합니다.
물런 개발을 하다보면 이리 저리 수정하게되고.
그러다 보면 일일이 파일 열어서 수정하기 귀찮아서 _once를 쓰게되죠..
그리고 이런 귀차니즘을 원천에 방지하기위해 처음부터 _once를 쓰고요..
저도 사실 이럴때도 있고 이것이 굉장히 맘에들고 사용 하는편합니다..
하지만
--;님의 말씀대로 유지보수를 생각한다면...
전 안쓰는게 맞다고 생각합니다..
제 의견이 국지적인 아집에 불과하시다고 하셧는데..
하나 예를 들어 보겠습니다..
A라는 개발자가 PHPSCHOOL 이라는 프로그램을 개발했습니다..
그리고 시간이 흘러 A라는 사람은 담당이 바뀌었고
회사에서는 PHPSCHOOL프로그램을 업그래이드 하기로 결정을 내렸습니다
하지만 A는 이미 다른 프로젝트 진행중어서 하는 수 없이 새로운 개발자를 뽑기로 했습니다.
그래서 B라는 사람이 왔습니다..
B라는 사람은 PHPSCHOOL을 차근차근 파악하고 개발을 할려고 하는데..
회사에서는 CP와의 계약때문에 그럴 시간 없다며 빨리 만들라고만 재촉합니다..
그래서 하는 수 없이 B는 PHPSCHOOL을 다 파악하지도 못한채 개발에 들어갔고
Test.inc는 필요해 의해 삭제되었습니다..
자..이럴경우 어떻게 되죠..?
솔직히 IT같은데 계약직으로 프로그ㄹ매 개발하고 쫑 인경우도 많고..
한 회사에 머무는 기간이 솔직히 그리 길지 않은게 사실입니다..
만약 전담장자가 퇴사하고 연락이 끊겼다면..?
그리고 대부분 회사가 발등에 불이 떨어졌을때 B를 고용하는 사례가 많죠..
물런 이런 문제는 크리티컬한 문제는 아닙니만..
어디선가 계속 존재하지도 않은 Test.inc를 로딩 유무를 체크하고 로딩하고 있겠죠..
그리고 제가 _once에 대한 의견이 국지적인 자기 아집이라고 하셧는데...
여기에 변명을 좀 하자면..
전 분명 제목에 주의할점이라고 명시했고..
_once의 장점은 누구나 아는 사실이니깐
단점과 그 예를 들어서 설명한 것 뿐입니다..
물런 저 또한 윗분들 처럼 _once를 편하게 잘 사용하고 있습니다..
하지만
사람은 편하면 게을러 지게되죠.
_once를 낭발해버리면...
프로그래머가 체계적인 프로그래밍을 할까요..?
체계적인 프로그래밍을 할려고 노력하면..
최소한 프로그래머에게 조금이나 발전이 있지 않을까요..?
그렇기 때문에 저 또한 대도록이면 _once를 안쓸려고 할 뿐이죠..
(마음만.-_-; 실력은 전혀 못되어서;;제가 말했듯이 워낙 허접인지라..^^;)
결국은 자신의 코딩스타일이겠지만요...
제 허접함이 들통나서 많이 부끄럽네요^^;
많은 가르침 감사합니다(__) 08/13 10:58:28
디토 파일을 삭제 하지 않고 내용만 없애면 -.-;; 08/13 11:00:36
골땡초보 디토 // ^^)=b 대단합니다. 08/13 11:38:43
--;; 예시를 든 phpschool사이트는 개발문서가 없나보죠...?? 그건건 개발된 혹은 개발이라는 단어를 쓰는건이 의미가 없는 것이기 때문에 무시합니다.
한편 include의 include는 추후 소스의 가독성 문제때문에 결코 권하지 않는 사항입니다. 이문제는 이야기를 하지 않았지만 include의 include가 되어있지 않다면 결코 문제가 되지 않을 사항일것 같아서 이야기 한거구요 만약 그런문제가 발생하다면 search에서 아주 손쉽게 소스를 수정할수도 있습니다.
혹시 코딩하실때 inputCheck 두번다 하시나요? 아님 한번만 하시나요? 아님 안하시나요? 그게 궁금하네..--;;
정답은 두번다 해야 한다 입니다. 물론 경우에 따라 예외가 있지만.--;
코딩량도 배가 되고, 속도도 그만큼 느린데 왜 두번해야 할까? 일단 프로그램밍에서 가장 중요한건 에러를 막고 DB의 무결성을 유지하기 위해서이고 include_once를 쓰는 건 에러를 막는다는 의미에서 적극 권장해야 할 부분이라고 생각합니다.
그리고 실제적으로 저기 phpschool같이 문서가 없는 유지보수 혹은 추가 개발등에서는 더욱더 include_once가 더 효과적입니다. 일단 파악이 되지 않은 혹은 파악할 수 없는 부분에서의 eroor에 효과적으로 대처 할수 있을테니깐요.
그럼..꾸벅. 08/13 11:48:47
골땡초보 기다림님의 글을 어느정도는 이해한듯 합니다. 좋은 글 감사합니다. ^^;
그런데 결론은 좀 다른 방향으로 내려버렸습니다.(머 이것도 제 주관적인 경험과 판단이라 ㅡㅡ; 다른 분들의 include가 더 낫다라는 훌륭한 글이 있다면 금방 바뀝니다. ^___^; 줏대가 없어서)
위에서 어떤 분이 언급하셨지만 include_once같은게 없었을 경우엔 라이브러리에 종종 defined, define등으로 검사해서 include_once를 비슷하게 구현했던 것을 볼 수 있습니다. 지금도 그렇게 하시는 분들도 있구요. C의 헤더파일들을 봐도 모두 전처리문으로 #ifdef #ifndef 등등을 사용해서 include_once와 비슷한 구현을 해놓았습니다. 물론 사용자들의 실수를 미연에 방지한다는 목적도 있겠지만 제 경험상으론 다른 이유도 있는 것 같습니다. 08/13 11:50:57
골땡초보 예를 들어 A.php, B1.php. B2.php, C.php가 있습니다.
B1.php에서는 구현을 위해 A.php를 include하구요. B2.php에서도 역시 A.php를 include하고 있습니다. 그런데 C.php에서는 B1.php와 B2.php를 모두 include해야 할 상황입니다.
이 상황에서 include만을 쓴다고 하면 경고메시지를 안보기 위한 해결방법은
1. B1.php와 B2.php에서 모두 A.php를 include한 것을 지우고
C.php에서 처음에 A.php를 include하고 B1.php와 B2.php를
다시 include
2. B1.php나 B2.php중 하나만을 선택해 include A.php문을 제거
하고 A.php에서는 B1.php와 B2.php를 include
1,2번 모두 제 생각에는 약간 이상한 구조 같아 보입니당.. 그나마 낳아 보이는 것은 1번이지만(2번은 B1.php나 B2.php중 하나만을 필요로 하는 D.php가 있을 경우 모양새가 이상해집니다. B1.php를 include할 때는 A.php도 같이 include해야 하지만, B2.php를 include할 때는 B2.php만 include해야 하기 때문이죠) 1번역시 이상한 건 마찬가지인 것 같습니다. include해야 하는 라이브러리가 여러개인 경우 모두의 선행관계를 꿰고 있어야 할 것 같습니다. 08/13 12:04:24
기다림 --;님의 include_once를 쓰는 건 에러를 막는다는 의미에서 적극 권장해야 할 부분이라고 생각합니다.
->이건 저도 그렇게 생각하고 에러를 막는다는 부분에서는 저도 추천하는 바입니다.
일단 파악이 되지 않은 혹은 파악할 수 없는 부분에서의 error에 효과적으로 대처 할수 있을테니깐요.
->이부분은 이해가 안되는데..예를 들어 주실 수 있으실까요..?
(제가 많이 허접해서 그래요..^^;;;)
골땡초보님이 예제를 든 경우는 분명 _once가 필요합니다.
(저라도 그런 경우 100% _once 쓸겁니다^^;)
하지만
저는 좀 더 체계적으로 프로그래밍을 해서 골땡초보님이 예제드신 일이 일어나지 않도록 하자!!
하는게 제 생각이죠... 08/13 12:14:41
골땡초보 훔... 그렇군요... 그런데 예제든 상황이 저는 체계적으로 한다고 해도 분명 자주 일어나는 일이라고 생각합니다. 08/13 12:32:55
--;; 골땡 초보님의 경우와 비슷한 경우로 생각하면 될겁니다. 개발 문서도 없고 include들이 어떠한 영향을 미칠지 모르는 상황이 분명 존재합니다.
그런 대표적인 경우가 만들다가 그냥 팽개치고 나간 사이트 뒷처러 등에서 골땡초보님이 예시하신 경우는 흔하게 발견합니다.
문제는 여기서 끝나지 않습니다. 그렇게 만들어 놓은 파일들을 include해서 작업을 해야하는뎅, 이부분을 수정한다는 의미는 이미 기 개발된 전체를 수정해야 한다는 말이고 이건 시간적으로나 개인적인 밥벌이 이상을 일으킵니다. 그러므로 이미 개발되어있는 부분은 잘 활용해서 처리할려고 합니다.근데 이걸 다시 include해서 module로 만들어야만 쉽게 프로젝트가 끝난다고 한다면 include를 해야 하는는뎅 이렇게 하니깐 문제가 발생하는 경우가 많습니다.
예를 들자면 session_start();등을 global하게 포함시키지 않았다던가 하는 이럴때는 어쩔수 없이 _once를 써야 하겠죠. 근데 문제는 여기서 발생하는게 아닙니다. 전체중에서 아주 부분적으로 수정해야 할 부분이 생기고 특정 파일을 include할 때 혹시 다른 부분에 영향을 미치지나 않나 걱정이 들면 전 주저없이 include_once를 써서 (페이지가 너무 많으니깐 다 체크하고 다닐수 없습니다. 결정적으로 돈벌이가 안됩니다. 전 돈만 준다면 기꺼이 다 수정하는 스타일입니다.) 혹여 발생할지 모르는 에러에 대처합니다.
아마도 골땡초보님의 예시 정도로 충분하리라 생각됩니다.
더욱 구체적인 자료를 원하시면 소스등을 정리해 올려보도록 노력하겠습니다.
08/13 13:56:34
기다림 아..무슨 말씀하시는건지 충분히 이해 했습니다..^^
귀찮으실텐데 이렇게 자세히 써주셔서 감사드립니다..^^
저도 돈만 보고 단기간내에 작업하라면_once를 남발할게 뻔합니다.^^ 절대 _once를 배척하는게 아닙니다.
그런데 개발자..소스작성자의 발전을 위해서는
좀 더 체계적으로...소스짜기전에 전체적인 레이아웃을 구성해 놓고서 짜는게 더 유리하지 않을까..하는게 제 생각이죠.. 08/13 14:42:00
골땡초보 -0-.. 그런데 제가 예제로 든 내용이 어째 잘못 코딩해서 생긴 예로 보여지는 것 같네요. 전 충분히 잘 설계된 라이브러리 역시 저런 구조를 가질 수 있다고 생각해서 예를 든건데.... ㅜ.ㅜ 08/13 14:46:57
s include_once 를 사용한다고 구조적이 아닌 프로그램은 아닙니다.. 체계적이지 않은것도 아니구요. 전체적인 레이아웃 상 필요한 경우가 분명 있습니다.
include_once가 필요 없는 상황이나 필요한 상황이나 모두 특수한 상황으로 보이는데 어느 한쪽만 일반화 되는것은 문제가 있습니다.
include_once를 쓴다고 체계적이지 않다. 유리하지 않다. 라고 단정지을 수 없다고 생각합니다. 08/13 14:47:20
s include_once가 개발시간을 크게 단축시키지는 않는다고 생각합니다. 시간 촉박 = include_once 이런 공식은 듣도 보도 못했구요. 저같으면 시간이 있고 없고간에 include_once를 쓰고 그 시간을 투자해서 다른 부분에서의 퍼포먼스를 올리겠습니다. 전체 성능은 코드의 20%가 좌우한다 라는 말이 있는데 include_once를 쓰나 include를 쓰나 이 20%에 끼기는 힘들듯 합니다. 뭐 몇천~몇만번 이상 호출된다면 모를까요. 이런 상황이라면 말씀하신대로 설계에서 잘못된 것 아닐까요. 08/13 14:49:52
--;; 네..저두 s님과 같은 생각입니다. 다만 현실은 항상 처음부터 설계에서부터 개발 테스트까지 저를 그냥 그일에만 매달리게 해주지 않는다는...
inclue_once가 개발 기간을 단축시키다기 보다는 에러가 알지 못하는 데에서 나는 것을 막을 수 있다는 의미입니다.
그럼..꾸벅.
08/13 14:57:30
기다림 골땡초보님//절대 아닙니다..^^
또 많은걸 배우고 갑니다..^^
감사합니다~^^
꾸벅~(__) 08/13 15:17:37
BirdShim 음.. 제가 include_once를 쓴것은 카운터 프로그래밍 할때였는데요.
사이트 전체 config같은 곳(항상 읽혀짐)에 넣구서
카운터도 DB를 써야 하는데 전에 DB클래스를 include했는지 안했는지 체크 하기보다는 아무래도 once로 쓰는게 낳죠..
제 경험에 의하면 include_once가 걸리게 되는 파일은
함수모음이나 클래스 파일등의 정말 필요한 파일이더군요..
그 파일이 없으면 사이트 전체에 영향을 미치는 파일이요..
그러니까 once되어있는 파일이 삭제된다는 가정 자체가 왠지 모순같습니다. 08/13 15:20:32
기다림 BirdShim님 말씀대로 _once되어있는 파일이 삭제된다는 가정이 모순같을 수 있지만..
사람마다 코딩스타일이 틀리듯 이부분도 그런측에 속하지 않을까 하는 생각입니다..
그리고 왠지 제 분위기가..
_once쓰면 무조건 나빠!!
이런식으로 흘러가는거 같은데..절대로 아닙니다 ㅡ,.ㅡ;; 08/13 15:24:59
BirdShim 기다림//
그렇군요 코딩 스타일이 틀리니까. 아무래도 include_once로 익숙해진 분들께서는 모두 once할 수도 있겠네요..
글구 아무래도 once를 너무 유용하게 쓰는 사람들이 많아서 _once 안 쓰면 안된다고 리플이 달리는것 같은데요..
그리고 리플 보다가 잊어 버렸는데 제목이 _once의 주의점이군요.. ㅋㅋㅋ
이런 경우를 주의하라는.. ㅋㅋ 08/13 15:40:24
lain include 에서 return 이 가능하군요.
새로운 거 배워갑니다. ^-^ㆀ 08/13 15:49:31
BOSong 논쟁거리인가?... 사알짝 끼어듭니다.
기다림님의 작성의도는 그러한 위험성이 있다는 가정이고,
_once가 붙고 안붙고 이것 역시 퍼포먼스를 감안하면서도 기능을 추가한것이라고 봅니다. 개발자의 사용여부와 에러의 가능성또한 변수가 많고요. 이렇게 모든것들이 불확정한 대상에 대해 이렇게까지 갑론을박할것까지는 없어보이는군요.
대부분 _once 존재를 대략 알고있고, 기다림님의 의견도 그 존재로 인해 생길지도 모르는 미세한 주의점을 제시한것 뿐인데.
a+= 1; a=a+1; a++; ++a;........ 08/14 4:08:05
Heeya 혹시 이 위에 lain은.. lainTT 아닐까.. 흠... (-- ); 08/14 9:31:13
모질이 이런이런.. 기다림님에게 한표 던집니다.
쓸때 없이 중간 프로세스에서 인클루드 할필요는 없다라고 봅니다. 인클루드 문제라고 중복이 어쩌구 저쩌구...^^ 만약 변수라면 중복 선언 하시겠습니까? 진행하고 있는 프로젝트를 이해 하지 않고서 프로젝트를 진행하고 귀찮타고 손을 놓아 버리게 된다면 중복으로 선언을 하겠지요. 중간 프로세스에서 변경이 되면 상위에서 하위까지 파일을 다 훌터 보는것이 현명하다고 봅니다. 메모리고 속도고 cpu 오버헤드고 다 필요 없다면 once를 쓰는게 낳을지도 모르죠. 프로그레머의 가장 최악의 적은 귀차니즘입니다. 08/14 12:21:27
모질이 실수 방지...... 프로그램에 실수가 있어서는 안돼죠..^^ 08/14 12:23:05
Tenshi _once는 주로 OOP 구조의 프로그램에서 사용합니다
그리고 기다림님이 쓰신대로 조건적으로 인클루드하는 경우가 아니라면.. require가 효율상 더 좋구요.. ;) 08/15 20:31:39
Tenshi 다른분들이 쓰신대로 _once가 퍼포먼스가 떨어지기는 합니다만.. 사이트 전체적으로 봤을 때 아주 미미한 부분이니 크게 신경쓰지 않으셔도 될듯 하네요. 08/15 20:33:16
기다림 Heeya님//확인결과 lain님은 lainTT님이 아니셨습니다..
하지만 여기 코멘트중에 글은 쓰셨죠..^^
http://kr.php.net/manual/en/function.require-once.php
얼마만에 쓰는 팁엔텍인지 모르겠습니다..^^;
솔직히 습자지 같은 지식가지고 이런말 하기 굉장히 부끄럽지만..
감히 한자 한자 적어 보겠습니다.
--------------------------------------------------------
아래 include문에 대한 글이 있길래 읽고 리플로 달려다가..
그냥 새로운글로 하나 씁니다..
우선 include 와 require에 대해 모르고 있는 부분을 설명하겠습니다..
여러분이 알고 있는 error처리를 제외하고..
만약 if문 안에 include문이 있는경우 if문이 만족하지 못할때는
해당 include 파일에 대한 loading을 하지 않습니다.
하지만 require같은 경우 if문이 만족하지 못해도 파일에 대한 loading을 한다는것이죠..
말로 써서 어렵게 느껴지실것 같아 예제 소스를 드리겠습니다..
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 하는것이 바람직하지 못하다고 생각합니다.
루프안에서 include 되는것도 안좋죠.
분명 꼼꼼히 짜면 once 는 필요치 않겠으나,
실수를 방지하기 위해 그냥 붙여주고 있습니다.
그리고, 위에 언급했듯 루프 안에서도 include 가 가능하기 때문에, 에러는 나지 않습니다.
warning 이나 notice 겠죠. (~E_WARNING & ~E_NOTICE 가 디폴트라 웬만해선 보이지 않습니다.)
에러가 난다면 once 는 필요 없죠. 08/12 18:38:03
기다림 아..제가 용어 선택을 잘못했군요..^^;
제가 말한 에러는 warning이었습니다..^^;
정정하겠습니다~^^ 08/12 18:41:13
거친마루 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의 루틴만 빠져나가게 되니까요 : ) 08/12 18:48:22
기다림 효진님 말씀대로 실수를 방지할 수 는 있는점은 저도 맘에 드는 부분입니다..아무래도 프로그래머의 실수를 처리해준다는게..^^
그런데 제가 예를 든데로 Test.inc파일을 삭제할경우 모든 파일을 열어야 하는거죠..
이럴 일은 없겠지만 예를 들어
만약 Test.inc의 용도가 바꼇다고 가정해 보겠습니다.
Test.inc에 원래 그냥 Array 같은게 담겨있었는데
DBConnect 이나..머 기타 중요한..외부에 알려지면 크리티컬한 파일이 되었다고 가정합시다..
이럴경우 제가 본문에서 썻던것 처럼 _once한 파일을 다 열어서 지워야 하는데 혹시나 하나를 빼먹게 될 경우..그럴경우 위험성이 있을수도 있죠.. 08/12 18:49:26
기다림 오..return...쓸일이 없어서 잊어먹고 살았던..^^;
좋은 정보 감사합니다 마루님~^^ 08/12 18:51:30
통구이 include 와 require에 차이점 그리고 _once사용시 주의할점..
include 와 require의 차이점 그리고 _once사용시 주의할점..
국민학교 국어시간에 졸았습니까? 왜 '에' 하고 '의' 하고
구별을 못하십니까? 심심찮게 이런 글을 보는데... 08/12 18:58:38
기다림 아..나름대로 맞춤법 신경쓴다면서 했는데;;
6년동안 국민학교다니면서 한번도 국어시간에 안졸았다고는 못하겠네요..^^;
정정했습니다..^^ 08/12 19:00:35
송효진 find . -iname "*.php" -exec perl -pi -e "s/include_once Test\\.inc;\\r\\n//g" "{}" \\;
ㄴ(-.- )ㄱ===3==3=3 08/12 19:01:59
기다림 효진님 윈도우면...? -_-v 08/12 19:04:21
nextream 기다림// 리눅스로 통째로 옮긴후 효진님의 솔루션을 적용함
v-_-v 08/12 19:06:43
기다림 헉...대략 낭패 -_-;;
nextream님...우너츄..>ㅁ<)=b
ㅎㅎ 그리고 마루님이랑 넥수투림님 언제 함...^^; 08/12 19:09:09
Test 윈도우면 탐색기의 오른쪽에 보면 내용에서 찾는 기능이 있습니다..
더 쉽죠.. 08/12 19:13:06
entr 많은 프로그래머들이 include 와 include_once 의 선택기준이 편리성은 아닐것이라고 생각되는군요... 왠만하면 include 를 쓰는것이 좋겠지만. cms나 테플릿등을 개발하다 보면 동일한 모듈성 File 을 include 하는 경우가 비일비재합니다..이러한 경우에는 include_once 를 쓰는것이 좋겠죠... 옳고 그름을 따질 분제는 아닌것 같습니다....
늘...닭잡는데 닭잡는 칼을...소잡는데 소잡는 칼을~~ 08/12 20:54:47
... 걍 _once쓰는게 좋을듯...
속도를 생각한다면 서버를 업글하징... 개발비용은 비용아닌가요 08/12 22:46:41
s 기다림//
예제가 꼭 include_once를 써서 안좋은 것에 대해서 설명하기 위해 만들어진 것 같습니다.
include나 include_once는 필요에 따라서 알맞게 사용하면 된다고 봅니다.
php 코어 개발자가 심심해서 include_once를 만든건 아닐테니깐요. 08/12 22:54:16
--; once를 쓰지 말라고...너무 하네요..잘 알지도 못하면서..--;;
그런 이유말고도 _once는 효율적으로 쓰이고 있습니다.
가끔 웹서버에서 include를 두번씩 로드하는 경우가 있습니다.
사실은 아주 빈번하게 일어나는 일이지요.
그리고 예전에 특정한 플래그 값을 두어서 두번 로드 하지 않도록 include를 처리하는게 정교한 프로그래밍으로 인정되던 때도 있었습니다.
뭐...그때쯤에는 어쩌면 님께서는 프로그래머가 아니었지도 모르겠지만. 여하튼 그런의미에서. include_once는 의미가 있습니다. 굳이 플래그 값을 주지 않아도 해결해 줄테니깐요.
특정한 클래스 등이 두번 로드된다고 생각하면 끔찍하네요.
그리고 바로 위의 분의 말처럼 결국에는 전부 _once를 쓰는게 훨씬 효울적이게 됩니다. 비용 대 효율로 따지면....
프로그래밍이 속도만을 따진다면 아마도 php는 존재하지도 않았을겁니다. 오직 기계어만을 쓰는게 훨씬 빠르겠죠..--;;
중요한건 개발할때 유지보수 혹은 관리를 위해 최소한 구조적인 혹은 function base 혹은 class base로 개발하고 항상 개발의 일관성을 유지하는게 좋습니다. 아주 특정한 프로그래밍을 제외하고는요..일반적인 어플리케이션에서는 이런 부분이 더 중요합니다. 결국 프로그램은 개발로만 끝나는게 아니라 어느 일정한 기간을 유지보수 하고 다시 개발되는 사이클을 탑니다. 이런 큰 의미에서의 프로그래밍을 생각하신다면 _once가 바람직하지 않다는 주장은 아주 국지적인 자기 아집에 불과한거죠.
그럼..이만 08/12 23:04:11
지나는 이 오버로딩이라...
말씀하신건 오버로딩이 아니죠 : ) 08/13 0:31:20
s include_once 가 속도때문에 배제되야 한다고 생각하지 않습니다. 저는 include보다는 include_once를 주로 씁니다. 모듈방식으로 개발할 때 어미 클래스를 여러 자식 클래스가 include 해야 하는데 어떤 자식클래스가 쓰일지 알 수가 없죠.. 이건 동적으로 결정되는 부분이기 때문에요.
include_once는 이런 경우에 아주 유용합니다. 속도고 뭐고 "그냥" 필요합니다 이럴때는. 어차피 include_once와 같은 동작하는 루틴을 만들어줘야 하기 때문이죠. 08/13 2:36:47
freezn 저도 찬성 쪽... 주로 기본적인(config 나 각 부분에서 필요로 하는 class) 파일로딩에 사용합니다.
특히나 스크립팅 언어인 php에서 어떠한 이유로 병목현상이 일어났고 그로 인해 재 요청이 들어가고... 분리해놓은 class 모듈 파일이 재로딩 된다면 -_-a;;
08/13 6:21:45
행복한고니 첫번째 설명 틀렸습니다. 엄밀히 말하면 완전히 틀린 것은 아니지만요. require 가 무조건 해당 파일을 로딩하던 것은 PHP 버전이 4.0.2 이전의 일입니다. 그 이후 버전은 include 와 같이 호출될때에만 사용됩니다. 08/13 9:02:58
기다림 우선 속도적인 문제..
저는 이 부분에서의 속도차이에는 그리 많은 비중을 들지 않았습니다.단지 이럴 부분도 있다...라고 명시정도 였죠..
저는 좀 더 체계적으로 구조를 짜고 프로그래밍을 한다면 _once는 구지 안써도 된다고 생각합니다.
물런 개발을 하다보면 이리 저리 수정하게되고.
그러다 보면 일일이 파일 열어서 수정하기 귀찮아서 _once를 쓰게되죠..
그리고 이런 귀차니즘을 원천에 방지하기위해 처음부터 _once를 쓰고요..
저도 사실 이럴때도 있고 이것이 굉장히 맘에들고 사용 하는편합니다..
하지만
--;님의 말씀대로 유지보수를 생각한다면...
전 안쓰는게 맞다고 생각합니다..
제 의견이 국지적인 아집에 불과하시다고 하셧는데..
하나 예를 들어 보겠습니다..
A라는 개발자가 PHPSCHOOL 이라는 프로그램을 개발했습니다..
그리고 시간이 흘러 A라는 사람은 담당이 바뀌었고
회사에서는 PHPSCHOOL프로그램을 업그래이드 하기로 결정을 내렸습니다
하지만 A는 이미 다른 프로젝트 진행중어서 하는 수 없이 새로운 개발자를 뽑기로 했습니다.
그래서 B라는 사람이 왔습니다..
B라는 사람은 PHPSCHOOL을 차근차근 파악하고 개발을 할려고 하는데..
회사에서는 CP와의 계약때문에 그럴 시간 없다며 빨리 만들라고만 재촉합니다..
그래서 하는 수 없이 B는 PHPSCHOOL을 다 파악하지도 못한채 개발에 들어갔고
Test.inc는 필요해 의해 삭제되었습니다..
자..이럴경우 어떻게 되죠..?
솔직히 IT같은데 계약직으로 프로그ㄹ매 개발하고 쫑 인경우도 많고..
한 회사에 머무는 기간이 솔직히 그리 길지 않은게 사실입니다..
만약 전담장자가 퇴사하고 연락이 끊겼다면..?
그리고 대부분 회사가 발등에 불이 떨어졌을때 B를 고용하는 사례가 많죠..
물런 이런 문제는 크리티컬한 문제는 아닙니만..
어디선가 계속 존재하지도 않은 Test.inc를 로딩 유무를 체크하고 로딩하고 있겠죠..
그리고 제가 _once에 대한 의견이 국지적인 자기 아집이라고 하셧는데...
여기에 변명을 좀 하자면..
전 분명 제목에 주의할점이라고 명시했고..
_once의 장점은 누구나 아는 사실이니깐
단점과 그 예를 들어서 설명한 것 뿐입니다..
물런 저 또한 윗분들 처럼 _once를 편하게 잘 사용하고 있습니다..
하지만
사람은 편하면 게을러 지게되죠.
_once를 낭발해버리면...
프로그래머가 체계적인 프로그래밍을 할까요..?
체계적인 프로그래밍을 할려고 노력하면..
최소한 프로그래머에게 조금이나 발전이 있지 않을까요..?
그렇기 때문에 저 또한 대도록이면 _once를 안쓸려고 할 뿐이죠..
(마음만.-_-; 실력은 전혀 못되어서;;제가 말했듯이 워낙 허접인지라..^^;)
결국은 자신의 코딩스타일이겠지만요...
제 허접함이 들통나서 많이 부끄럽네요^^;
많은 가르침 감사합니다(__) 08/13 10:58:28
디토 파일을 삭제 하지 않고 내용만 없애면 -.-;; 08/13 11:00:36
골땡초보 디토 // ^^)=b 대단합니다. 08/13 11:38:43
--;; 예시를 든 phpschool사이트는 개발문서가 없나보죠...?? 그건건 개발된 혹은 개발이라는 단어를 쓰는건이 의미가 없는 것이기 때문에 무시합니다.
한편 include의 include는 추후 소스의 가독성 문제때문에 결코 권하지 않는 사항입니다. 이문제는 이야기를 하지 않았지만 include의 include가 되어있지 않다면 결코 문제가 되지 않을 사항일것 같아서 이야기 한거구요 만약 그런문제가 발생하다면 search에서 아주 손쉽게 소스를 수정할수도 있습니다.
혹시 코딩하실때 inputCheck 두번다 하시나요? 아님 한번만 하시나요? 아님 안하시나요? 그게 궁금하네..--;;
정답은 두번다 해야 한다 입니다. 물론 경우에 따라 예외가 있지만.--;
코딩량도 배가 되고, 속도도 그만큼 느린데 왜 두번해야 할까? 일단 프로그램밍에서 가장 중요한건 에러를 막고 DB의 무결성을 유지하기 위해서이고 include_once를 쓰는 건 에러를 막는다는 의미에서 적극 권장해야 할 부분이라고 생각합니다.
그리고 실제적으로 저기 phpschool같이 문서가 없는 유지보수 혹은 추가 개발등에서는 더욱더 include_once가 더 효과적입니다. 일단 파악이 되지 않은 혹은 파악할 수 없는 부분에서의 eroor에 효과적으로 대처 할수 있을테니깐요.
그럼..꾸벅. 08/13 11:48:47
골땡초보 기다림님의 글을 어느정도는 이해한듯 합니다. 좋은 글 감사합니다. ^^;
그런데 결론은 좀 다른 방향으로 내려버렸습니다.(머 이것도 제 주관적인 경험과 판단이라 ㅡㅡ; 다른 분들의 include가 더 낫다라는 훌륭한 글이 있다면 금방 바뀝니다. ^___^; 줏대가 없어서)
위에서 어떤 분이 언급하셨지만 include_once같은게 없었을 경우엔 라이브러리에 종종 defined, define등으로 검사해서 include_once를 비슷하게 구현했던 것을 볼 수 있습니다. 지금도 그렇게 하시는 분들도 있구요. C의 헤더파일들을 봐도 모두 전처리문으로 #ifdef #ifndef 등등을 사용해서 include_once와 비슷한 구현을 해놓았습니다. 물론 사용자들의 실수를 미연에 방지한다는 목적도 있겠지만 제 경험상으론 다른 이유도 있는 것 같습니다. 08/13 11:50:57
골땡초보 예를 들어 A.php, B1.php. B2.php, C.php가 있습니다.
B1.php에서는 구현을 위해 A.php를 include하구요. B2.php에서도 역시 A.php를 include하고 있습니다. 그런데 C.php에서는 B1.php와 B2.php를 모두 include해야 할 상황입니다.
이 상황에서 include만을 쓴다고 하면 경고메시지를 안보기 위한 해결방법은
1. B1.php와 B2.php에서 모두 A.php를 include한 것을 지우고
C.php에서 처음에 A.php를 include하고 B1.php와 B2.php를
다시 include
2. B1.php나 B2.php중 하나만을 선택해 include A.php문을 제거
하고 A.php에서는 B1.php와 B2.php를 include
1,2번 모두 제 생각에는 약간 이상한 구조 같아 보입니당.. 그나마 낳아 보이는 것은 1번이지만(2번은 B1.php나 B2.php중 하나만을 필요로 하는 D.php가 있을 경우 모양새가 이상해집니다. B1.php를 include할 때는 A.php도 같이 include해야 하지만, B2.php를 include할 때는 B2.php만 include해야 하기 때문이죠) 1번역시 이상한 건 마찬가지인 것 같습니다. include해야 하는 라이브러리가 여러개인 경우 모두의 선행관계를 꿰고 있어야 할 것 같습니다. 08/13 12:04:24
기다림 --;님의 include_once를 쓰는 건 에러를 막는다는 의미에서 적극 권장해야 할 부분이라고 생각합니다.
->이건 저도 그렇게 생각하고 에러를 막는다는 부분에서는 저도 추천하는 바입니다.
일단 파악이 되지 않은 혹은 파악할 수 없는 부분에서의 error에 효과적으로 대처 할수 있을테니깐요.
->이부분은 이해가 안되는데..예를 들어 주실 수 있으실까요..?
(제가 많이 허접해서 그래요..^^;;;)
골땡초보님이 예제를 든 경우는 분명 _once가 필요합니다.
(저라도 그런 경우 100% _once 쓸겁니다^^;)
하지만
저는 좀 더 체계적으로 프로그래밍을 해서 골땡초보님이 예제드신 일이 일어나지 않도록 하자!!
하는게 제 생각이죠... 08/13 12:14:41
골땡초보 훔... 그렇군요... 그런데 예제든 상황이 저는 체계적으로 한다고 해도 분명 자주 일어나는 일이라고 생각합니다. 08/13 12:32:55
--;; 골땡 초보님의 경우와 비슷한 경우로 생각하면 될겁니다. 개발 문서도 없고 include들이 어떠한 영향을 미칠지 모르는 상황이 분명 존재합니다.
그런 대표적인 경우가 만들다가 그냥 팽개치고 나간 사이트 뒷처러 등에서 골땡초보님이 예시하신 경우는 흔하게 발견합니다.
문제는 여기서 끝나지 않습니다. 그렇게 만들어 놓은 파일들을 include해서 작업을 해야하는뎅, 이부분을 수정한다는 의미는 이미 기 개발된 전체를 수정해야 한다는 말이고 이건 시간적으로나 개인적인 밥벌이 이상을 일으킵니다. 그러므로 이미 개발되어있는 부분은 잘 활용해서 처리할려고 합니다.근데 이걸 다시 include해서 module로 만들어야만 쉽게 프로젝트가 끝난다고 한다면 include를 해야 하는는뎅 이렇게 하니깐 문제가 발생하는 경우가 많습니다.
예를 들자면 session_start();등을 global하게 포함시키지 않았다던가 하는 이럴때는 어쩔수 없이 _once를 써야 하겠죠. 근데 문제는 여기서 발생하는게 아닙니다. 전체중에서 아주 부분적으로 수정해야 할 부분이 생기고 특정 파일을 include할 때 혹시 다른 부분에 영향을 미치지나 않나 걱정이 들면 전 주저없이 include_once를 써서 (페이지가 너무 많으니깐 다 체크하고 다닐수 없습니다. 결정적으로 돈벌이가 안됩니다. 전 돈만 준다면 기꺼이 다 수정하는 스타일입니다.) 혹여 발생할지 모르는 에러에 대처합니다.
아마도 골땡초보님의 예시 정도로 충분하리라 생각됩니다.
더욱 구체적인 자료를 원하시면 소스등을 정리해 올려보도록 노력하겠습니다.
08/13 13:56:34
기다림 아..무슨 말씀하시는건지 충분히 이해 했습니다..^^
귀찮으실텐데 이렇게 자세히 써주셔서 감사드립니다..^^
저도 돈만 보고 단기간내에 작업하라면_once를 남발할게 뻔합니다.^^ 절대 _once를 배척하는게 아닙니다.
그런데 개발자..소스작성자의 발전을 위해서는
좀 더 체계적으로...소스짜기전에 전체적인 레이아웃을 구성해 놓고서 짜는게 더 유리하지 않을까..하는게 제 생각이죠.. 08/13 14:42:00
골땡초보 -0-.. 그런데 제가 예제로 든 내용이 어째 잘못 코딩해서 생긴 예로 보여지는 것 같네요. 전 충분히 잘 설계된 라이브러리 역시 저런 구조를 가질 수 있다고 생각해서 예를 든건데.... ㅜ.ㅜ 08/13 14:46:57
s include_once 를 사용한다고 구조적이 아닌 프로그램은 아닙니다.. 체계적이지 않은것도 아니구요. 전체적인 레이아웃 상 필요한 경우가 분명 있습니다.
include_once가 필요 없는 상황이나 필요한 상황이나 모두 특수한 상황으로 보이는데 어느 한쪽만 일반화 되는것은 문제가 있습니다.
include_once를 쓴다고 체계적이지 않다. 유리하지 않다. 라고 단정지을 수 없다고 생각합니다. 08/13 14:47:20
s include_once가 개발시간을 크게 단축시키지는 않는다고 생각합니다. 시간 촉박 = include_once 이런 공식은 듣도 보도 못했구요. 저같으면 시간이 있고 없고간에 include_once를 쓰고 그 시간을 투자해서 다른 부분에서의 퍼포먼스를 올리겠습니다. 전체 성능은 코드의 20%가 좌우한다 라는 말이 있는데 include_once를 쓰나 include를 쓰나 이 20%에 끼기는 힘들듯 합니다. 뭐 몇천~몇만번 이상 호출된다면 모를까요. 이런 상황이라면 말씀하신대로 설계에서 잘못된 것 아닐까요. 08/13 14:49:52
--;; 네..저두 s님과 같은 생각입니다. 다만 현실은 항상 처음부터 설계에서부터 개발 테스트까지 저를 그냥 그일에만 매달리게 해주지 않는다는...
inclue_once가 개발 기간을 단축시키다기 보다는 에러가 알지 못하는 데에서 나는 것을 막을 수 있다는 의미입니다.
그럼..꾸벅.
08/13 14:57:30
기다림 골땡초보님//절대 아닙니다..^^
또 많은걸 배우고 갑니다..^^
감사합니다~^^
꾸벅~(__) 08/13 15:17:37
BirdShim 음.. 제가 include_once를 쓴것은 카운터 프로그래밍 할때였는데요.
사이트 전체 config같은 곳(항상 읽혀짐)에 넣구서
카운터도 DB를 써야 하는데 전에 DB클래스를 include했는지 안했는지 체크 하기보다는 아무래도 once로 쓰는게 낳죠..
제 경험에 의하면 include_once가 걸리게 되는 파일은
함수모음이나 클래스 파일등의 정말 필요한 파일이더군요..
그 파일이 없으면 사이트 전체에 영향을 미치는 파일이요..
그러니까 once되어있는 파일이 삭제된다는 가정 자체가 왠지 모순같습니다. 08/13 15:20:32
기다림 BirdShim님 말씀대로 _once되어있는 파일이 삭제된다는 가정이 모순같을 수 있지만..
사람마다 코딩스타일이 틀리듯 이부분도 그런측에 속하지 않을까 하는 생각입니다..
그리고 왠지 제 분위기가..
_once쓰면 무조건 나빠!!
이런식으로 흘러가는거 같은데..절대로 아닙니다 ㅡ,.ㅡ;; 08/13 15:24:59
BirdShim 기다림//
그렇군요 코딩 스타일이 틀리니까. 아무래도 include_once로 익숙해진 분들께서는 모두 once할 수도 있겠네요..
글구 아무래도 once를 너무 유용하게 쓰는 사람들이 많아서 _once 안 쓰면 안된다고 리플이 달리는것 같은데요..
그리고 리플 보다가 잊어 버렸는데 제목이 _once의 주의점이군요.. ㅋㅋㅋ
이런 경우를 주의하라는.. ㅋㅋ 08/13 15:40:24
lain include 에서 return 이 가능하군요.
새로운 거 배워갑니다. ^-^ㆀ 08/13 15:49:31
BOSong 논쟁거리인가?... 사알짝 끼어듭니다.
기다림님의 작성의도는 그러한 위험성이 있다는 가정이고,
_once가 붙고 안붙고 이것 역시 퍼포먼스를 감안하면서도 기능을 추가한것이라고 봅니다. 개발자의 사용여부와 에러의 가능성또한 변수가 많고요. 이렇게 모든것들이 불확정한 대상에 대해 이렇게까지 갑론을박할것까지는 없어보이는군요.
대부분 _once 존재를 대략 알고있고, 기다림님의 의견도 그 존재로 인해 생길지도 모르는 미세한 주의점을 제시한것 뿐인데.
a+= 1; a=a+1; a++; ++a;........ 08/14 4:08:05
Heeya 혹시 이 위에 lain은.. lainTT 아닐까.. 흠... (-- ); 08/14 9:31:13
모질이 이런이런.. 기다림님에게 한표 던집니다.
쓸때 없이 중간 프로세스에서 인클루드 할필요는 없다라고 봅니다. 인클루드 문제라고 중복이 어쩌구 저쩌구...^^ 만약 변수라면 중복 선언 하시겠습니까? 진행하고 있는 프로젝트를 이해 하지 않고서 프로젝트를 진행하고 귀찮타고 손을 놓아 버리게 된다면 중복으로 선언을 하겠지요. 중간 프로세스에서 변경이 되면 상위에서 하위까지 파일을 다 훌터 보는것이 현명하다고 봅니다. 메모리고 속도고 cpu 오버헤드고 다 필요 없다면 once를 쓰는게 낳을지도 모르죠. 프로그레머의 가장 최악의 적은 귀차니즘입니다. 08/14 12:21:27
모질이 실수 방지...... 프로그램에 실수가 있어서는 안돼죠..^^ 08/14 12:23:05
Tenshi _once는 주로 OOP 구조의 프로그램에서 사용합니다
그리고 기다림님이 쓰신대로 조건적으로 인클루드하는 경우가 아니라면.. require가 효율상 더 좋구요.. ;) 08/15 20:31:39
Tenshi 다른분들이 쓰신대로 _once가 퍼포먼스가 떨어지기는 합니다만.. 사이트 전체적으로 봤을 때 아주 미미한 부분이니 크게 신경쓰지 않으셔도 될듯 하네요. 08/15 20:33:16
기다림 Heeya님//확인결과 lain님은 lainTT님이 아니셨습니다..
하지만 여기 코멘트중에 글은 쓰셨죠..^^
관련자료
-
링크
댓글 0
등록된 댓글이 없습니다.