XETOWN

안개 골목

최신 웹 개발에 대한 이야기들을 나눠보세요. XE개발에 대해서도 배워볼 수 있습니다.
조회 수 116 추천 수 3 댓글 2
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

XE에서 모든 애드온은 같은 스코프에서 실행됩니다. 다른 애드온에서 선언한 변수를 마구 참조할 수 있지요. 그래서 내가 선언하지 않은 변수를 끌어다 쓰더라도 희한하게 작동하곤 합니다. 그러다가 다른 애드온이 없는 사이트에 가면 갑자기 작동을 안 해요.

 

반대로, 내가 쓰던 변수를 남겨놓으면 다른 애드온의 실행에 영향을 주거나, 심지어 코어에 오류를 일으킬 수도 있습니다. before_display_content 시점에서 $output 변수를 조작하는 경우가 대표적입니다. 여기서 $output 변수에는 화면에 뿌려줄 내용이 담겨 있는데, XE에서 쿼리 결과를 담는 변수명으로 흔히 $output을 쓰다 보니 애드온에서 무심코 쿼리를 쓰다가는 화면에 뿌려줄 내용을 날려먹기 일쑤입니다. (악명높은 백지화면의 가장 큰 원인 중 하나입니다.)

 

이런 오류를 피하려면 아래의 두 가지 규칙을 지켜야 합니다.

 

1. 내가 선언한 변수 외에는 사용하지 않는다.

2. 내가 선언한 변수는 내가 치운다.

 

그런데 이게 말처럼 쉽지가 않습니다. 특히 코드가 길어지면 어느 변수를 어디서 선언했는지 기억도 안 나요. 사용 후에 일일이 unset해주기도 귀찮습니다.

 

내가 쓰는 변수와 남이 쓰는 변수를 구분하는 가장 쉬운 방법은 함수 안으로 들어가는 것입니다. 함수 안에서는 함수 밖에 있는 변수를 건드릴 수 없고, 함수 안에서 선언한 변수는 함수 실행이 끝나면 자동으로 지워지니까요.

 

    function my_addon_function($addon_info, $called_position, &$output) {

        // 내 맘대로 변수 선언

    }

    my_addon_function($addon_info, $called_position, $output);

 

이렇게 하면 $addon_info, $called_position, $output 등 애드온에서 흔히 참조해야 하는 세 변수 외에는 모두 내맘대로 쓸 수 있게 됩니다.

 

그러나 PHP에서는 같은 이름의 함수를 여러 번 선언할 수 없기 때문에, XE 실행 과정에서 4번 실행되어야 하는 애드온에서 이렇게 하기에는 무리가 있습니다. 함수를 사용하는 애드온들이 func.php 등의 이름으로 함수 파일을 분리해 놓고 include_once로 처리하는 것은 이 때문이지요.

 

PHP 5.3부터는 익명 함수를 지원하므로 파일을 분리하지 않고도 깔끔하게 처리가 가능합니다. XE 최신 버전을 타겟으로 하는 애드온이라면 모두 이 문법을 사용할 수 있습니다.

 

    // 모든 애드온에서 사용 가능

    call_user_func(function() use($addon_info, $called_position, &$output) {

        // 내 맘대로 변수 선언

    });

 

이렇게 하면 여러 번 실행해도 상관없고, use() 문법을 사용해서 내가 사용할 변수만 싹 가져갈 수 있습니다. 함수나 클래스를 따로 선언할 필요가 없는 간단한 애드온이라면 이렇게 해 놓고 그 안에 내용을 작성하는 것이 안전합니다.

 

PHP 7.0부터는 심지어 아래와 같이 자바스크립트스러운 문법도 지원됩니다. 함수를 선언하자마자 곧바로 한 번 실행한 후 깔끔하게 폐기하는 거예요. 이건 뭐... $ 문자만 아니라면 PHP인지 자바스크립트인지 알 수도 없겠네요 ㅋㅋ (참고로 자바스크립트도 전역변수 때문에 오류가 많이 발생하기 때문에, 이렇게 함수를 선언해서 쓰는 것을 권장하는 추세입니다. IIFE라고 부릅니다.)

 

    // PHP 7.0 전용 애드온에서 사용 가능

    (function() use($addon_info, $called_position, &$output) {

        // 내 맘대로 변수 선언

    })();

 

단, 위에서 소개한 어느 방식을 사용하더라도 함수 안에서는 $this를 사용할 수 없다는 제약이 있습니다. before_module_proc, after_module_proc 등의 시점에서 $this를 조작해야 하는 애드온이라면 먼저 $this를 다른 변수에 할당한 후 넘겨야 하는데, 이런 목적으로는 관례상 $that을 사용합니다.

예:

 

    $that = $this;  // 오브젝트이므로 레퍼런스(&)를 사용할 필요 없음

    call_user_func(function() use($addon_info, $called_position, $that) {

        // 내 맘대로 변수 선언

        // $that->stop('에러메시지');

    });

 

글쓴이 기진곰

profile

GitHub 아이디는 @kijin입니다. 사람을 위한 인터넷 생태계의 발전과 웹 보안에 많은 관심을 가지고 있습니다.

오픈소스 도로명주소 검색서버 및 API Postcodify를 개발, 운영하고 있습니다.

우리가 만들어 가는 XE의 새 이름, 라이믹스(Rhymix) 프로젝트에 참여하고 있습니다.

국내외 서버 및 클라우드서버 셋팅, 이전, 튜닝해 드립니다.

  • ?
    날아라 2017.01.03 13:03:28
    팁 감사합니다. 다른팁도 부탁드려요 ~~~ ㅎㅎ
  • ?
    진영 2017.01.03 15:28:31
    팁 감사합니다~!

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
271 최신 웹소식 SSL 인증서 구입시 주의하세요. 15 기진곰 2017.03.24 358
270 소스공유 ISPCONFIG 3 호스팅 패널 설치기.... 4 아파치 2017.03.22 134
269 개발이야기 Microsoft의 웹브라우저 Edge의 XE 웹사이트 호환성에 대해서 1 이박사 2017.03.20 126
268 최신 웹소식 XE3 자료실이 공식적으로 열렸네요. 4 mAKEkr 2017.03.18 250
267 개발이야기 XE 데이터 마이그레이션 PHP 프로그램 사용 간 주의 필요 이박사 2017.03.18 73
266 소스공유 국기 이미지 필요 할수도 있을것 같아서 올려 봅니다 file 구미호 2017.03.07 146
265 최신 웹소식 AMD 라이젠 판매 시작 했네요. 8 file 아파치 2017.02.25 264
264 최신 웹소식 첫 SHA-1 충돌 공격이 성공 1 YJSoft 2017.02.25 190
263 최신 웹소식 클라우드플레어, 취약점으로 정보 유출 가능성 있어 5 YJSoft 2017.02.24 921
262 XE 개발팁 최근게시물에서 alt 안에 html 소스가 먹힌 경우 이온디 2017.02.18 69
261 XE 개발팁 최근게시물 위젯에서 해당 게시판명 불러오는 함수 1 이온디 2017.02.18 56
260 최신 웹소식 Linode에서 5달러짜리 가상서버가 나왔네요. 11 기진곰 2017.02.15 312
259 XE 개발팁 그룹별로 게시물 보이게 하기 2 이온디 2017.02.15 107
258 소스공유 jquery를 이용하여 인풋에 기본값을 placeholder로 바꿔주는 소스 이온디 2017.02.11 100
257 XE 개발팁 HTML5 API 사용시 브라우저 지원 체크하기 file 후하니 2017.02.09 87
256 소스공유 APM 최신 Stable 소스 설치 6 아파치 2017.02.05 159
255 개발이야기 1년간 개발한 모듈의 관리자 페이지 디자인 변경 작업을 하면서.. 4 file 구름이 2017.01.24 228
254 XE 개발팁 동영상 삽입시 소스모드로 바꾸지 않아도 되도록 하기 12 기진곰 2017.01.09 287
253 소스공유 토렌트 정보 애드온 수정본 (트레커, 파일쪽 textarea처리) 4 file 우리아기 2017.01.07 188
» XE 개발팁 애드온에서 변수 중복 방지하기 2 기진곰 2017.01.03 116
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 15 Next
/ 15
위로
서버에 요청 중입니다. 잠시만 기다려 주십시오...