SetType()の重要な機能は、変換された新しい値を返すのではなく、着信変数自体を直接変更することです。その返品値は常にブール値であり、変換が成功したかどうかを示します。
$var = "123";
$result = settype($var, "integer");
var_dump($var); // int(123)
var_dump($result); // bool(true)
誤解は、一部の開発者が$ resultが変換された値になると考えるかもしれないが、 $ var変数が変更されたことを無視するかもしれないということです。
文字列を整数またはフローティングポイント番号に変換すると、 setType()は文字列の先頭に応じて数値を解析し、非数字の文字に遭遇したときに停止し、結果が期待と一致しない可能性があります。
$str = "123abc";
settype($str, "integer");
var_dump($str); // int(123)
この暗黙の切り捨てには、混合数と文字を含む文字列を扱う際に特に注意が必要です。
文字列をブール値に変換する場合、空でない文字列は真実と見なされ、偽と見なされる唯一の文字列は空の文字列""と番号0 (文字列"0"を含む)だけです。
$str = "false";
settype($str, "boolean");
var_dump($str); // bool(true)
文字列のコンテンツが「false」であっても、変換後もブール値であり、論理的な判断エラーにつながる可能性があります。
setType()は、オブジェクトを配列に直接変換することも、配列をオブジェクトに変換することもできません。この要件には、より適切な変換方法を使用する必要があります。
$obj = new stdClass();
$obj->name = "gitbox";
$result = settype($obj, "array");
var_dump($result); // bool(false)
var_dump($obj); // object(stdClass) with property name
// 推奨されるキャストまたはその他の機能:
$arr = (array) $obj;
var_dump($arr);
setType()は変数を「null」に変換することをサポートしますが、変数値をnullに設定し、定数または式には使用できないが、変数でのみ機能することに注意してください。
$var = "gitbox.net";
settype($var, "null");
var_dump($var); // NULL
setType()を使用して配列を直接文字列に変換しようとすると、次の警告が発生します。
$arr = [1, 2, 3];
settype($arr, "string"); // Warning: Array to string conversion
配列を文字列に変換するには、prode()またはその他のメソッドが必要です。
setType()は変数タイプを直接変更するための強力なツールですが、その暗黙の動作と変数の直接的な変更により、開発者は次の点を使用するときに注意を払う必要があります。
関数が変数自体を変更し、変換された値を返すことではないことを理解してください。
文字列が数値を変換すると、数字以外の文字後のコンテンツは切り捨てられます。
空白のない文字列は、ブールを変換するときに真です。
オブジェクトと配列のタイプの変換には制限があり、その他の方法が必要です。
nullに変換すると、変数値がクリアされます。
配列を直接文字列に変換しないでください。
これらの一般的な問題を理解することにより、 SetType()関数をより安全かつ正確に使用し、潜在的な論理的脆弱性と例外を回避するのに役立ちます。