속성만 가진 PHP 클래스를 구현

[목차(도우미)]
PHP 에서 클래스는 독특한 함수가 존재하는데 흔히 자바에서 유래한 명칭으로 getter/setter를 스크립트답게 정의해 줄수 있다.보통 이런 함수를 매직 함수(굳이 번역하자면 마술 함수)라고 부르는데 __get(), __set()함수를 써서 정의한다.

이런 클래스 사양을 사용하여 전역 변수를 정의하면 편리하게 사용할 수 있다. 웹페이지를 구성함에 있어서 PHP에는 구조체가 없기 때문에 흔히 습관적으로 구조체를 써서 변수를 정의하던 개발자들은 일일이 변수를 정의해 주게 될 것이다. 그럴 때 간단히 속성(property, 자산)만 가진 클래스 변수를 만들어 두면 우아하게 된다. 우아하다(elegant)는 표현은 유명한 수학자 Erwin Kreyszig 교수가 공업수학(Advanced Engineering Mathematics 5판) 에서 복소해석학의 서문에 표현한 것에 영감을 받아 말하는 표현이다.

우아하게 커피콩으로 커피 한잔하면서

소스코드의 구현과 차이

단순 변수를 쓴 예

  1. // base.php에서 보관
  2. $is_logged_user = true;

  3. // sidemenu.php 에서 사용
  4. if ( $is_logged_user ) :
  5.     // 어쩌구 저쩌구...
  6.     :
  7. endif;

배열 변수를 쓴 예

  1. // base.php에서 보관
  2. $global_var['is_logged_user'] = true;

  3. // sidemenu.php 에서 사용
  4. if ( $global_var['is_logged_user'] ) :
  5.     // 어쩌구 저쩌구...
  6.     :
  7. endif;

클래스 변수를 쓴 예

  1. // 속성전용 클래스 변수를 생성
  2. class PropertyBag {
  3.     function __get($name){ ... }
  4.     function __set($name, $value){ ... }
  5. }

  6. $the = new PropertyBag();
  7. // base.php에서 보관
  8. $the->is_logged_user = true;

  9. // sidemenu.php 에서 사용
  10. if ( $the->is_logged_user ) :
  11.     // 어쩌구 저쩌구...
  12.     :
  13. endif;

클래스의 자세한 정의는 기존 공개된 것이 있으므로 출전을 참고하면 된다.
이하 일부 인용
  1. protected $attributes = Array();     
  2. public function __get($key){           
  3.   return array_key_exists($key, $this->attributes) ? $this->attributes[$key] : null;
  4. }
  5.       
  6. public function __set($key, $value){           
  7.   $this->attributes[$key] = $value;
  8. }

출전: http://php.net/manual/en/language.oop5.magic.php

논의

전역 변수를 정의함에 있어서 어떤 형태로든지 사용하는 것에는 지장이 없으나 단순 변수는 특별한 이름을 붙이지 않는 한 전역변수임을 알기 어렵다. 전역 변수가 서너개 이상 필요하게 되면 단순 변수를 사용하는 것은 사소한 실수가 생기기 쉽다. 변수 이름이 중복되어서 처음에 보관한 값이 바뀌어 버리는 실수가 아무래도 생긴다.

배열 변수로 사용하면 이름의 중복을 피할 수 있고 사용하기에 편리하지만, 변수를 호출하는 것이 괄호가 필요하고 인용 부호를 사용해야 하기 때문에 가독성이 떨어진다.

클래스 변수를 사용한 것은 가독성에 있어서도 쓸만하다. 클래스 변수가 전역 변수로 사용하기 쉬운 이름을 붙여 주면 편리하다.
by 금메달.아빠 on 2012. 1. 10. 06:30