내가 생각하는 PHP는 배열의 언어이다.
내부 소스를 들여다보지는 않았지만, 본 사람의 말에 의하면 내부적으로는 클래스 마저도 배열로 처리하고 있다고 하니 말 다한거나 마찬가지다(실제로 PHP 코딩할 때는 배열로 처리한다).
그래서인지 PHP에 있는 함수중에는 유난히 배열관련 함수가 많다.
PHP의 함수 인덱스 분류중 어느 섹션보다도 배열관련 함수가 많으며, 따라서 이들을 잘 활용한다면 코딩량을 확 줄일 수 있을 뿐더러 보다 직관적인 코드를 작성할 수 있다.
※주의 : 이 팁은 필자의 코딩스타일을 설명한 글이므로, 일반적이지도 않고 절대적이지도 않습니다. 자신에게 맞는 코딩스타일을 찾는 것이 가장 중요하며 거기에 도움이 되고자 하는 것일뿐입니다. ^^
1. enum 타입과 유효성 검사
C, C++등의 언어에 있는 enum은 특정 타입에 미리 정해둔 몇가지 값 이외의 다른 값을 사용할 수 없도록 한다. 입력값에 잘못된 값이 오는 일도 없을 뿐더러 내부적으로는 정수형을 쓰면서도 실제 코딩시에는 사람이 이해하기 편한 형태로 쓸 수 있기때문에 편하게 사용할 수 있다. 비록 PHP에는 이런 enum 타입이 없지만, define 등으로 비슷하게 사용할 수 있다.
<?php
$i = 0;
define('ALLOW_NONE', $i++);
define('ALLOW_MEMBER', $i++);
define('ALLOW_ALL', $i++);
$allow_type = array(ALLOW_NONE, ALLOW_MEMBER, ALLOW_ALL);
. . .
. . .
. . .
// 유효성 검사
// 권한 허용의 값이 올바르지 않으면 [허용안함]으로 지정한다.
if (!in_array($allow_value, $allow_type)) $allow_value = ALLOW_NONE;
?>
꼭 enum형처럼 사용할 필요는 없다. 아래처럼 입력값에 대한 유효성검사의 용도로 써도 된다.
<?php
$allow_search_type = array('name','user_id','title','content');
// 전달된 검색 타입이 올바르지 않을 경우 [제목검색]으로 지정한다.
if (!in_array($_GET['s_type'], $allow_search_type)) $_GET['s_type'] = 'title';
?>
2. OR 비교연산 대용
위와 같은 방법으로 OR 연산을 대신해서 사용할 수도 있다.
if ($val == 'test' || $val == 'question' || $val == 'answer') echo 'OK';
위와 같은 코드는
if ( in_array($val, array('test','question','answer')) ) echo 'OK';
와 같이 변경할 수 있다. 위와 같이 코딩하게되면 또 다른 값을 추가할 때 코딩해야할 양이 더 많을 뿐만 아니라 값이 여기저기 나누어져있어 가독성에서도 보기가 힘들지만 아래와 같은 코딩을 하면 쉼표와 값을 입력해주는 것만으로도 새로운 조건을 추가할 수 있다. 또한 AND 와 OR가 복합적으로 연결되어있어 가독성이 어려운 코드에서도 보다 나은 가독성을 보장해줄 수 있다.
3. 일괄 적용
간단한 경우를 생각해보자. 출력할 문자열들에 대해서 htmlspecialchars 라는 함수를 적용시키고 싶다고 하자. 우선 보통이라면 다음과 같이 코딩할 수도 있다.
$text_a = htmlspecialchars($text1);
$text_b = htmlspecialchars($text2);
$text_c = htmlspecialchars($text3);
$text_d = htmlspecialchars($text4);
$text_e = htmlspecialchars($text5);
이것을 배열을 이용해서 코딩하면 다음과 같이 표현할 수 있다.
$text_arr = array($text1, $text2, $text3, $text4, $text5);
list($text_a, $text_b, $text_c, $text_d, $text_e) = array_map('htmlspecialchars', $text_arr);
물론, 아래쪽의 코딩이 함수를 몇번 더 거치기 때문에 효율이 떨어진다고 반박하는 사람도 있을 것이다. 하지만, 여기에 값이 더 추가되거나 변경된다고 할 경우 혹은 함수를 하나 더 적용해야할 경우를 생각해본다면, 유지보수라는 측면에서는 충분히 이득이 있다. 게다가 직접 테스트해보지는 않았으나 이런 식의 사용을 한 프로세스에서 수천번씩 하는 것도 아닌 이상, 성능에의 손실은 거의 없다고 보아도 될 것이다.
코멘트 리스트 -->
|
<TEXTAREA id=save_comment_47688 style="DISPLAY: none">뭔가 더 있었는데 막상 쓰려니까 더 생각이 안나네요. ^^a</TEXTAREA> |
|
<TEXTAREA id=save_comment_47689 style="DISPLAY: none">머리가 나빠서 효율이 떨어지는 방법을 많이 사용합니다;</TEXTAREA> |
|
<TEXTAREA id=save_comment_47694 style="DISPLAY: none">ㅜ.ㅜ in_array 써야징 하고 있다가도, || <== 치고있는 자신을 발견 ㅜ.ㅜ 합니다.</TEXTAREA> |
|
<TEXTAREA id=save_comment_47698 style="DISPLAY: none">3번의 경우에는 저도 $_GET, $_POST에서 trim(), addslashes()처리하기 위해서 사용하고 있는데 편하더군요:) 1, 2번의 경우도 잘 참고하도록 하겠습니다:) 감사합니다:)</TEXTAREA> |
|
<TEXTAREA id=save_comment_47699 style="DISPLAY: none">ㄳ 저도 인제 배열을 많이 써봐야 겠네요</TEXTAREA> |
|
<TEXTAREA id=save_comment_47701 style="DISPLAY: none">저두 배열을 많이 쓰긴 하는 편인데 너무 지나치게 사용해서 코드가 늘어나는 경향이 ㅎㅎㅎ</TEXTAREA> |
|
<TEXTAREA id=save_comment_47703 style="DISPLAY: none">클래스가 배열로 만들어 졌다는 소리는 첨 들었는데... 객체를 생성시켜 놓고 나서 해당 객체를 print_r하면... 배열로 뿜어내더군요 ㅋ</TEXTAREA> |
|
<TEXTAREA id=save_comment_47705 style="DISPLAY: none">OS도 근본적으로는 메모리를 배열로 처리하죠. ^^; 저도 php = 배열 이라고 생각하고 있고 loop이 필요하면 일단 foreach 로 처리되는지부터 생각합니다만... 값에 따른 분기에 대해서는 switch 를 고수하고 있습니다. ^^; list()로의 매핑은... 최고죠. AI언어 같삼. ^^ 이런 팁이 많이 공유되면 좋겠습니다. 꾸벅~!</TEXTAREA> |
|
<TEXTAREA id=save_comment_47706 style="DISPLAY: none">저같은 경우 연관 배열을 많이 활용하고 있습니다. 대부분의 경우 config파일을 하나 만들어 defilne 시켜놓구 활용을 많이하는데.. 유지보수뿐만 아니라 코드 또한 더 간결해지는거 같네요..^^</TEXTAREA> |
|
<TEXTAREA id=save_comment_47708 style="DISPLAY: none">배열의 활용은 실행된 결과를 가지고 무엇무엇을 한다든지 하는 일이 있겠죠 (리포팅 툴에서) database 결과를 array 로 받아서 특정 로직을 실행한 다음 그 결과를 배열에 첨부하고 첨부된 결과로 sorting 을 하는겁니다. in_array,sort,usort,array_walk 등등 그리고 나라야 님이 말씀하신것 처럼 array 로 환경설정을 할 수도 있습니다. $imgExtList=array("gif","jpg","jpeg","png"); if(!in_array($ext,$imgExtList)) echo "이미지 파일만 업로드가 가능합니다.";</TEXTAREA> |
|
<TEXTAREA id=save_comment_47709 style="DISPLAY: none">좋은 내용 감사합니다. 역시 다른분들이 사용하시는 방법은 색다르군요~</TEXTAREA> |
|
<TEXTAREA id=save_comment_47714 style="DISPLAY: none">PHP 를 처음 만났을때부터 강력한 것은 문자열처리와 배열이었다고 기억합니다. 맨땅에서 처리한 C -> 문자처리의 경지를 보여주는 PERL -> 이 모든 처리를 함수 한방으로 보내버린 단순무식한 PHP 로 프래그래밍 도구를 갈아탔던 기억이 새롭네요. 제경우 배열을 아주 넘치도록 사용하고 있습니다. 특히나 환경설정이나 반복처리해야하는 자료형은 배열에 넣어서 가공처리 하여 사용합니다. 그럼 템플릿 사용하지 않아도 생각보다 페이지가 깔끔해집니다.</TEXTAREA> |
|
<TEXTAREA id=save_comment_47717 style="DISPLAY: none">거대한 배열 $HTML 에서 배열 요소를 교체하는 방식으로 템플릿+스킨시스템을 대체해본 적 있습니다. ^^;</TEXTAREA> |
|
<TEXTAREA id=save_comment_47716 style="DISPLAY: none">저도 환경설정이나 권한 검사등에서 배열을 많이 사용합니다. in_array() 로 부족할때는 array_search()(배열함수 중에 가장 맘에 안드는..) 등을 사용하고 함수 안에서나.. 리턴도 배열을 쓸때가 많습니다. 작은 차이겠지만 자원을 좀 더 먹지 않을까? 하는 생각은 자주 하게 되더군요~</TEXTAREA> |
|
<TEXTAREA id=save_comment_47718 style="DISPLAY: none">오오.. 마지막 list() .. 저런것도 있었다니.. ㅠㅠ 역시 아직도 부족한.. ㅠㅠ 좋은 걸 배웠습니다. ^^ 감사합니다~</TEXTAREA> |
|
<TEXTAREA id=save_comment_47725 style="DISPLAY: none">문자(열) 치환에 배열을 쓰는 예... $s = str_replace("\t",' ',$s); $s = str_replace("\r",'',$s); $s = str_replace("\n",'',$s); $s = str_replace(' ','',$s); 이것을 이렇게, $c = array("\t"=>' ',"\r"=>'',"\n"=>'',' '=>''); $s = strtr($s,$c); ...배열쪽으로 쓸 이야기가 많죠. ^^);</TEXTAREA> |
|
<TEXTAREA id=save_comment_47726 style="DISPLAY: none">저도 배열을 많이 사용할려 하는데 코딩하다보면 잊고 하는게 많죠 습관이란게 무섭죠....</TEXTAREA> |
|
<TEXTAREA id=save_comment_47738 style="DISPLAY: none">멋집니다~~~~php매뉴얼 배열부분 코멘트들 한번 다 읽어봐야겠네요. 여태 소켓같은거나 찾고있었는데 .... 포인트 100점 드리고 가요~ (라고 하려고 했는데 안보내지네요. ...)</TEXTAREA> |
|
<TEXTAREA id=save_comment_47744 style="DISPLAY: none">과거에 함수를 잘 모르던 시절에는 날코딩으로 힘들게 했던 기억이 나는데, 그러한 코딩들이 요즘은 내장함수 하나나 둘로 끝나는 걸보니 소스도 깔끔해지고 좋네요.</TEXTAREA> |
|
<TEXTAREA id=save_comment_47751 style="DISPLAY: none">저는 ASP에서 PHP로 왔는데, 처음에 소스가 무지 지저분하다는 느낌이 들었습니다. 그런데 쓰다보니까 ASP와는 비교할 수도, 될 수도 없는 막강한 기능에 매료되었습니다. 특히 ASP의 인클루드는 허접입니다. 요즘 ASP.net 많이들 쓸텐데, 좀 나아졌나 모르겠습니다. 그리고 연관배열이 무지 마음에 듭니다. ^^</TEXTAREA> |
|
<TEXTAREA id=save_comment_47794 style="DISPLAY: none">좋은 글 감사합니다. 무단으로 긁어갈께요~</TEXTAREA> |