Recentemente, eu precisava de uma função de conversão booleana "solta" para lidar com strings como as que você está perguntando (entre outras coisas). Encontrei algumas abordagens diferentes e criei um grande conjunto de dados de teste para executá-las . Nada se encaixava perfeitamente nas minhas necessidades, então escrevi as minhas:
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;
}
}
Observe que, para objetos contáveis e combináveis por sequência, isso favorecerá a contagem sobre o valor da sequência para determinar a veracidade. Ou seja, se $object instanceof Countableisso retornar, (boolean) count($object)independentemente do valor de(string) $object .
Você pode ver o comportamento dos dados de teste que usei, bem como os resultados de várias outras funções aqui . É meio difícil analisar os resultados desse pequeno iframe, para que você possa visualizar a saída do script em uma página inteira (esse URL não é documentado, portanto isso pode não funcionar para sempre). Caso esses links morram algum dia, eu coloco o código em pastebin .
A linha entre o que "deveria ser verdade" e o que não deveria é bastante arbitrária; os dados que usei são classificados com base em minhas necessidades e preferências estéticas; as suas podem diferir.
isBoolean("")deve retornar false.