티스토리 뷰
서론
- 문자열 안에 숫자가 내가 가져온 숫자가 있는지 판단해야 하는데...
- false가 나와야 하는데 true가 나온다?
- 아니 우리는 잘 쓰는데 뭐가 true고 뭐가 false라는거야?
본론
- 하단 코드의 결과값이 궁금한가?
var_dump(in_array('1asdf',[1,2,3])); # true???
- 아니 이게 뭐지???php 인터프리터 소스상으로 in_array는상단 코드를 호출한다.https://github.com/php/php-src/blob/master/ext/standard/array.c#L1465상단과 같은 데이터(우리가 맨 처음 줫던 in_array 콜 시파라미터)를 가져온다.
https://github.com/php/php-src/blob/master/ext/standard/array.c#L1518if (strict) { // 여기는 파라미터를 안줫는데 이때 php공식문서 상 default 파라미터는 false라서 else로 넘어감 } else { // 여기서 수행 시작 }
이후 해당 조건문에 true판단이 되어fast_equal_check_string 함수는 하단 헤더파일에 구현이 되어있는데
https://github.com/php/php-src/blob/master/Zend/zend_operators.h#L829해당 조건문에 걸리게 된다
왜냐하면 '1asdf'는 '1', 'a', 's', 'd', 'f' 로 나뉘어져서
루프문을 돌기 때문이다.
이후 return 을 zend_fast_equal_strings로 스트링으로 캐스팅 후 비교를 하면서 true 리턴이 떨어지고RETURN_TRUE; 매크로를 실행하며 in_array는 true 리턴을 하게 된다. if (behavior == 0) { // 여기 조건문을 수행한다. RETURN_TRUE; }
if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { return zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); }
- fast_equal_check_string 함수를 콜을 하게 된다
- 이후
https://github.com/php/php-src/blob/master/ext/standard/array.c#L1465 ZEND_PARSE_PARAMETERS_START(2, 3) Z_PARAM_ZVAL(value) // 첫번째 파라미터 '1asdf' Z_PARAM_ARRAY(array) // 두번째 파라미터 [1,2,3] Z_PARAM_OPTIONAL Z_PARAM_BOOL(strict) // 3번째 파라미터 strict여부 ZEND_PARSE_PARAMETERS_END();
- php_search_array 함수 내부 구현중 첫번째 파라미터로
php_search_array(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
- https://github.com/php/php-src/blob/master/ext/standard/array.c#L1554
결론
하단 예제와 같이 사용하자
in_array('1asdf',[1,2,3], true)
공식문서 잘 보도록 하자...