'php5'에 해당되는 글 3건

  1. 2006/11/30 php5의 정수 __autoload()활용하기 2 (2)
  2. 2006/11/10 php5의 정수 __autoload()활용하기 1 (4)
  3. 2006/03/22 미안하다. 너무 기대했다. (3)
2006/11/30 14:41

php5의 정수 __autoload()활용하기 2

include_path 개념
지금 리눅스/유닉스를 사용하고 계시거나, 예전에 DOS를 사용해 보셨다면, PATH환경 변수에 대해서 알고 있을 겁니다.
파일을 include시 꼭 현재 스크립트로 부터 시작되는 상대경로가 아니더라도, include path안에 있는 경로이면 알아서 include를 시켜줍니다.

메뉴얼에 따르면
require()와 include(), fopen_with_path() 함수들이 사용하는 파일을 찾을 위치(path)를 지정한다. string의 형식은 시스템 환경변수 PATH의 설정과 비슷하다. UNIX에서는 콜론으로 나뉘어진 디렉토리들의 리스트이고, Windows에서는 세미콜론을 사용한다. (이하 생략)

즉, 자동으로 파일을 찾아 include시켜준다는 의미 입니다. 이것을 조작하는 방법은 몇가지가 있는데,
  • php.ini에서 직접 변경
  • ini_get, ini_set 함수
  • get_include_path, set_include_path 함수
저는 php.ini에서 직접변경하는 방법과 함수를 사용하는 방법 중 함수를 사용해 동적으로 변경시키는 방법을 선호합니다. 왜냐하면 한 서버에서 여러개의 프로그램을 사용할 것이고, 또 개발서버에서 운용서버로 소스를 옮길 때 php.ini파일을 개발서버에 맞춰 변경시켜야 하는 번거로움이 싫어서입니다.

ini_get과 ini_set은 설정 옵션을 조정할 수 있도록 하는 범용함수이고, get_include_path와 set_include_path는 php4.3이상에서 지원하는 include_path를 위한 전용함수 입니다. 사용 예는 메뉴얼에서 확인 하실 수 있습니다.

아래 코드에서는 set_include_path와 get_include_path를 사용합니다.

그러면 include_path을 지정하면서 __autoload가 실행되는 것을 보겠습니다.



이 코드를 통해 이제 __autoload가 실행이 되면 자동으로 include_path를 따라 다른 경로에 있는 패키지들도 include가 가능하게 되었습니다.

하.지.만 이 방법도 문제가 있습니다. 상황에 따라 다르겠지만 저의 경우는 패키지 내에서 include할 때(cohesion)를 제외하고는 거의 include를 사용하지 않으므로 한 스크립트가 실행될 때 __autoload가 여러번 실행되게 됩니다.
그래서 위와 같은 방법으로는 include_path를 지정해주는 코드가 여러번 실행되는 것을 피할 수가 없게 됩니다.

그래서 정적(static)변수를 사용해 아래와 같이 개선해보았습니다.

제가 지금 사용하는 코드가 바로 위와 비슷한 코드 입니다. 파일이 존재하지 않을 때를 대비한 예외처리까지 합하면 조금 더 길어지기는 하지만.. 예외처리가 쉽게 가능하도록 아래에 팁을 마련합니다. 참고하시고 잘 사용하셨으면 좋겠습니다^^
include_path에서 파일이 있는지 없는지 어떻게 알 수 있을까?
file_exists를 이용한 노가다를 할 수도 있지만.. 조금더 elegant한 방법은,
fopen을 실행시켜 리턴값이 resource인지를 확인하는 방법이다. 많이 사용되지 않는 fopen의 세번째 인자는 include_path를 활용할 것인가 하는 boolean값이다.(기본값은 false다)

크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 2
2006/11/10 09:05

php5의 정수 __autoload()활용하기 1

php6의 발표를 앞두고 이제서야 포스팅을 올리는 것이 쑥스럽지만 php5에서 추가된 __autoload()에 대해 이야기 해보도록 하겠습니다.

__autoload()는 PHP5에서 추가된 'intercepter'로 필요한 클래스가 로딩 되지 않았을 때 자동으로 실행되는 함수입니다.

특히 네임스페이스라는 개념이 아직 없는 PHP에서 __autoload는 아주 유용하게 활용됩니다. (가장 많이 개발되는 형태에서) PHP4에서는 클래스의 로딩을 위해 include에 몇 라인씩을 할애해야했지만, PHP5의 __autoload를 활용하면 그런 라인들이 최소화 될 수 있습니다.

사용예는

[CODE type=php]
function __autoload( $className ){
   require_once $className.'.php';
}
[/CODE]



이렇습니다.

$className에 필요한 클래스 네임이 들어가고, 그것을 규칙에 맞도록 파일이름으로 변경시켜 인클루드 시켜주는 것으로 작업이 끝납니다.

아주 간단하게 사용을 할 수가 있겠죠?

하지만 한가지 더 생각해 보아야 할 주제는 바로 패키지 개념 적용입니다. 패키지는 관련있는 클래스들의 모음이고 어떤 방법으로든 그룹화 됩니다. 지금부터는 이 그룹화에 대해 말씀드리려고 합니다.

PEAR를 한번이라도 활용해보셨다면, 이름짓기규칙(Naming Convention)에 대해서도 아실 텐데요. DB_Common이라는 클래스는 DB/Common.php 에 저장되어 있습니다.또 Zend Framework에서 Zend_Controller_Action이라는 클래스는 Zend/Controller/Action.php에 저장되어 있습니다. _(언더바)가 /(디렉토리 분리기호)로 변경시켜 디렉토리 단위로 패키지로 묶는 것이 PHP에서의 대세 입니다.

이것을 활용한 __autoload()의 코드의 예는 이렇습니다.
[CODE type=php]
function __autoload($className)
{
   $path = str_replace('_',DIRECTORY_SEPARATOR,$className).'.php'; /*DIRECTORY SEPARATOR는 윈도환경에서는 \으로, xNIX환경에서는 / 이 저장되어 있는 php기본 상수 입니다. */
   require_once $path;
}
[/CODE]

다음 포스팅에서 include_path를 활용하는 방법과 앞서 언급한 것을 모두 적용시킨, 제가 사용하는 __autoload코드를 공개합니다~
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 4
2006/03/22 23:09

미안하다. 너무 기대했다.

어제 이 책이 왔다. kimho의 PHP 5 웹 프로그래밍.

PHP를 Eclipse로 개발하기 에서도 언급했지만, 우리나라의 PHP책들은 정말 한결같이 '무작정따라하기' 식에 한글 레퍼런스다.

이번에도 그럴까봐서 공동으로 사는 책 안에 넣었는데.. 역시나다.

처음 강컴에서 책 목차를 봤을때 이클립스, 디자인패턴, 객체지향 등에 빠져 엄청나게 매력적으로 느껴졌던 이 책이, 막상 도착하고 나니 매력이 사라져버렸다. 내가 관심있게 생각했던 부분은 100페이지 남짓이다. 기대치가 너무 높았나보다.

하기야.. 우리나라에서 중급자용 PHP 책을 만든다면 사볼사람이 거의 없다는건 자명한 사실이다. "까이꺼 개나 소나 다 한다" 라고 자평사는 사람들까지 있는데 중급자 상급자로 나눠봤자 그게 무슨소용이람?

그런 사람들에게는 자기자신을 개나 소로 격하시키지 마시라고 이야기하고 싶다.

O'Reilly의 Cookbook 시리즈는 '두번째 책'을 표방한다. Learn 시리즈를 다 읽고나서 두번째 책이라는 뜻이다. 우리나라의 PHP에서도 '이 책은 당신의 두번째 책입니다.' 혹은 '세번째 책입니다.' 라고 적혀진 책을 보고 싶다. (방법은 어찌되든 상관없다. PHP에 미친 출판사 사장님이 "고급책 번역시켜!" 하던지, 엄청난 고수가 나타나 "안팔려도 좋으니 찍어주십셔!" 하던지..)

Branch-
일본에서는 각종 문서들이 일본어로 금방금방 번역되어 나온다.. 우린 그것을 다시 번역기를 돌려 한글로 만들어내는 수준이니.. 이건 아마도 쪽수(인구 수)가 모자라 관심분야가 넓지 않아서 그런것이 아닐까 싶다.
크리에이티브 커먼즈 라이선스
Creative Commons License

'일상 > ' 카테고리의 다른 글

PHP 보안 - 몇 줄의 코드로 안전하게  (1) 2006/03/27
미안하다. 너무 기대했다.  (3) 2006/03/22
PHP 5 Objects, Patterns, and Practice  (0) 2006/01/07
Trackback 0 Comment 3