• 카테고리

    질문 & 답변
  • 세부 분야

    웹 개발

  • 해결 여부

    미해결

워드프레스에서 액션의 개념

21.12.11 11:20 작성 조회수 160

0

잘 보고 있습니다.

 

워드프레스 액션의 개념에서

 

do_action() 이 실행될 때

empty()를 넣어서 실제 키에 대한 배열이 존재하는지 여부를 체크하셨는데,

안하고 했더니 실제로 에러가 떨어지더라구요.

 

1) 왜 에러가 떨어졌을까요?

 

에러에는 빈 스트링이 전달되서 그렇다는데 어디에 그런 여지가 있는지 잘 모르겠더라고요.

 

2) 암튼 저는 중간에 체크코드가 있는게 싫어서 isset 으로 얼리리턴 하긴 했는데.. 이건 워드프레스 스타일이 아닌가요?

답변 1

답변을 작성해보세요.

0

안녕하세요. 질문 남겨 주셔서 감사합니다.

질문해 주신 부분은 아마 아래 코드와 관련된 부분이신 것 같습니다.

맞나요?

1. 검사를 하지 않으면 알림(notice) 메시지가 뜨는 이유

알림(notice)은 경고(warning)나 에러(error)와 달리 당장 고치지 않아도 별 문제가 발생하지는 않을 것으로 생각되는 것들에 대한 에러 메시지입니다. 그러나 향후 문제가 발생할 수 있기 때문에 해결하는 습관을 들이는 것이 좋습니다.

여기서 알림이 뜬 이유는 배열에 없는 인덱스(배열의 키값)에 접근하려고 했기 때문이죠.

액션 실행 지점을 코드에서 모두 설정은 해 놨지만, 실제로 실행 지점과 함수를 등록하지 않으면 액션 목록 배열에는 실행 지점이 존재하지 않습니다. 예컨대 아래 코드를 참고해 봅시다.

add_action('실행지점2', function () { /* ... */ });

do_action('실행지점1');
do_action('실행지점2');

do_action은 실행지점1과 실행지점2를 모두 실행하지만 실제로 함수가 등록된 것은 실행지점1에 대해서만입니다. 실행지점2에 대해서는 등록된 함수가 없습니다. 따라서 $action_list 배열에는 "실행지점2"라는 키값이 배정돼 있지 않습니다. 

이런 상황에서 $action_list['실행지점2']에 접근하려고 하면 "어, 이 배열에 그런 인덱스는 없는데? 뭐 잘못한 거 아니니?" 하고 PHP가 알림(notice)를 띄워 주는 것입니다. 

 

2. empty와 isset의 차이

그래서 우선 $action_list['실행지점2']가 존재하는가를 검사한 뒤에 해당 값에 접근을 하려고 하는 것인데요.

이 지점에서는 말씀해주신 대로 isset을 사용해도 무방합니다. 함수가 등록됐다면 해당 인덱스가 존재할 것이기 때문입니다.

empty가 워드프레스 스타일인 것도 아니기 때문에 isset을 사용하시는 데 아무 문제가 없습니다.

둘 사이 차이는 빈값에 대한 판단입니다. 아래 코드를 참고해 보세요.

$a = [];
!empty($a); // false
isset($a); // true

!empty(비어있지 않음 == 내용물 있음)와 isset(정의돼 있음)을 비슷한 맥락에서 사용하게 될 텐데요.

empty는 빈 값(빈 문자열, 빈 배열, 숫자 0 등 PHP가 false 취급하는 모든 값)에 대해서 true를 반환하고 !empty는 false를 반환합니다.

반면 isset은 변수가 설정만 돼 있다면 값이 무엇이든 상관하지 않고 true를 반환합니다.

따라서 내용물에 상관없이 변수가 설정돼 있는지를 검사하는 경우에는 isset을, 내용물이 실질적으로 존재하는지까지 검사할 때 !empty를 사용하시면 됩니다.

위 경우에는 코드 진행 흐름상 $action_list 배열의 인덱스가 존재하면 내용물도 존재하는 것이기 때문에 isset을 사용해도 별 문제가 없기는 합니다.

그러나 논리적으로 본다면 $action_list에서 호출한 액션 지점 index가 존재하는지 여부를 체크하는 것이 필요한 게 아니라, 해당 index에서 실행할 함수(즉, 내용물)가 존재하는지 체크하는 게 필요한 것이기 때문에 !empty를 사용하는 것이 의미상 더 맞는 것이죠.

마지막으로 얼리 리턴을 하게 하셨다고 했는데요. 코드 깊이를 깊게 만들지 않는다는 점에서 좋은 방법인 것 같습니다! 저도 그렇게 짤 것을 그랬네요!

 

답변이 되었다면 좋겠습니다. 혹시 추가로 궁금한 게 있다면 주저하지 마시고 질문 남겨 주세요 :)

감사합니다.