Baru-baru ini saya membutuhkan fungsi konversi boolean "longgar" untuk menangani string seperti yang Anda tanyakan (antara lain). Saya menemukan beberapa pendekatan yang berbeda dan menghasilkan satu set besar data uji untuk menjalaninya . Tidak ada yang cukup sesuai dengan kebutuhan saya, jadi saya menulis sendiri:
function loosely_cast_to_boolean($value) {
if(is_array($value) || $value instanceof Countable) {
return (boolean) count($value);
} else if(is_string($value) || is_object($value) && method_exists($value, '__toString')) {
$value = (string) $value;
// see http://www.php.net/manual/en/filter.filters.validate.php#108218
// see https://bugs.php.net/bug.php?id=49510
$filtered = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
if(!is_null($filtered)) {
return $filtered;
} else {
// "none" gets special treatment to be consistent with ini file behavior.
// see documentation in php.ini for more information, in part it says:
// "An empty string can be denoted by simply not writing anything after
// the equal sign, or by using the None keyword".
if(strtolower($value) === 'none') {
$value = '';
}
return (boolean) $value;
}
} else {
return (boolean) $value;
}
}
Perhatikan bahwa untuk objek yang dihitung dan string-castable, ini akan mendukung penghitungan atas nilai string untuk menentukan kebenaran. Yaitu, jika $object instanceof Countable
ini akan kembali (boolean) count($object)
terlepas dari nilai (string) $object
.
Anda dapat melihat perilaku untuk data uji yang saya gunakan serta hasil untuk beberapa fungsi lainnya di sini . Agak sulit untuk skim hasil dari iframe kecil itu, jadi Anda dapat melihat output skrip di halaman penuh , bukan (URL itu tidak didokumentasikan sehingga ini mungkin tidak berfungsi selamanya). Kalau-kalau tautan itu mati suatu hari, saya juga menaruh kodenya di pastebin .
Garis antara apa yang "seharusnya benar" dan apa yang tidak seharusnya cukup sewenang-wenang; data yang saya gunakan dikategorikan berdasarkan kebutuhan dan preferensi estetika saya, Anda mungkin berbeda.
isBoolean("")
harus mengembalikan false.