php에서 settype () 는 현장에서 변수의 유형을 수정할 수있는 매우 편리한 유형 변환 함수입니다. 그러나 settype ()를 사용하여 값을 부울 유형 ( BOOL )으로 변환 할 때, 특히 사용자 입력 또는 외부 데이터를 다룰 때 무시하기 쉽지만 큰 영향을 미치는 몇 가지 문제가 발생할 수 있습니다.
이 기사는 SetType ($ var, 'bool') 의 행동에 중점을두고 가능한 오해와 예방 조치를 분석합니다.
먼저 기본 예를 살펴 보겠습니다.
$var = 1;
settype($var, 'bool'); // 지금 $var 예 true
이것은 직관적입니다. 0이 아닌 숫자는 true 로 변환되고 0은 False 로 변환됩니다. 마찬가지로, 비어 있지 않은 줄은 사실이 되고 빈 줄은 거짓이 될 것입니다.
$var = 'hello';
settype($var, 'bool'); // true
$var = '';
settype($var, 'bool'); // false
언뜻보기에 모든 것이 합리적 인 것처럼 보이지만 문제는 이러한 "합리적"에 정확하게 숨겨져 있습니다.
가장 혼란스러운 상황 중 하나는 다음과 같습니다.
$var = 'false';
settype($var, 'bool'); // 结果예 true
다른 언어 (예 : JavaScript, Java)에서 전송 된 많은 초보자 또는 사람들은 "false" 문자열이 부울 값 거짓 에 해당해야한다고 생각하기 쉽지만 문자열이 비어 있지 않는 한 PHP에서는 사실 입니다. 이것은 전형적인 함정입니다.
특히 입력을 처리 할 때 :
$input = $_POST['subscribe']; // 사용자가 제출했을 수 있습니다 "false"
settype($input, 'bool');
이 시점에서 $ 입력은 비어 있지 않은 문자열이기 때문에 실제로 true 로 변환됩니다. 이것은 논리적 판단 오류로 이어질 수 있습니다.
쉽게 간과되는 또 다른 것은 배열과 객체입니다.
$var = [];
settype($var, 'bool'); // false
$var = [1];
settype($var, 'bool'); // true
빈 배열은 거짓 이지만 요소가 하나만 있더라도 사실 입니다. 데이터를 가로 지르거나 검증 할 때 잘못 판단 할 수 있습니다.
마찬가지로, 객체에 속성이 없더라도 물체는 항상 사실 입니다.
$var = new stdClass();
settype($var, 'bool'); // true
변수가 null 인 경우 settype ()는 false 로 변환되며 예상대로 다음과 같습니다.
$var = null;
settype($var, 'bool'); // false
그러나 isset () 와 settype () 의 조합은 유형 확인을 대체 할 수 없다는 점에 유의해야합니다. 예를 들어, 당신은 이것을 작성합니다.
if (isset($_GET['active'])) {
$active = $_GET['active'];
settype($active, 'bool');
}
$ _get [ 'active'] 가 '0' (즉, 문자열)이면 '0'이 비어 있지 않은 문자열이기 때문에 true 로 변환됩니다. 명시 적으로 만드는 올바른 방법 :
$active = isset($_GET['active']) && $_GET['active'] === '1';
또는 부울 값에 명시 적으로 매핑하는 것과 같은 컨텍스트에 따라 더 안전한 구문 분석을 수행하십시오.
settype ()를 if ($ var) 와 혼합하면 코드 의미론이 흐려질 수 있습니다. 예를 들어:
$val = $_GET['debug'] ?? '';
settype($val, 'bool');
if ($val) {
// 디버그 모드를 켭니다
}
이 코드는 표면에서 바로 보이지만 실제로 유지하고 읽기가 어렵습니다. 명백한 화이트리스트를 사용하는 것이 좋습니다.
$debug = in_array($_GET['debug'] ?? '', ['1', 'true'], true);
이것은 명확하고 제어 가능하며 안전합니다.
부울 변환, 특히 사용자 또는 URL의 입력을 처리 할 때는 SettingType ()를 피하는 것이 좋습니다. 보다 명백한 판단 논리를 사용하거나 변환 기능을 캡슐화하는 것을 고려하십시오.
function toBool($value): bool {
$truthy = ['1', 1, true, 'true', 'on', 'yes'];
return in_array(strtolower((string)$value), $truthy, true);
}
그런 다음 사용하십시오 :
$flag = toBool($_GET['flag'] ?? '');
이를 통해 잘못 판단을 방지하고 코드의 유지 관리 및 예측 가능성을 향상시킬 수 있습니다.
settype ()는 PHP에서 간단 해 보이지만 부울 값을 변환 할 때 예상치 못한 동작을 유발하기가 쉽습니다. 일반적인 질문은 다음과 같습니다.
문자열 "false" 가 true 로 변환됩니다
빈 문자열과 '0' 의 동작 차이
배열 및 객체의 기본 부울 값은 직관적이지 않습니다.
사용자 입력과 협력 할 때 논리적 취약점을 유발하는 것은 쉽습니다.
따라서 부울 변환에주의를 기울여 SetType ()를 사용하는 것이 좋습니다. 특히 외부에서 데이터를 처리 할 때 더 안전한 기능의 명시 적 판단 또는 캡슐화를 사용하여 코드 견고성을 향상시켜야합니다.
이러한 상황에 대한 특정 코드를 시연하거나 테스트 도구를 구축하려면 https://gitbox.net/tools/php-bool-test를 참조하십시오.