Wszystkie pozostałe rozwiązania mają tutaj pewne zastrzeżenia (choć odnoszą się do podanego pytania). Jeśli (1) zapętlasz mieszane typy lub (2) chcesz ogólnego rozwiązania, które możesz wyeksportować jako funkcję lub dołączyć do swoich narzędzi, żadne inne rozwiązanie tutaj nie będzie działać.
Najprostszym i najbardziej zrozumiałym rozwiązaniem jest:
// simplest, most-readable
if (is_bool($res) {
$res = $res ? 'true' : 'false';
}
// same as above but written more tersely
$res = is_bool($res) ? ($res ? 'true' : 'false') : $res;
// Terser still, but completely unnecessary function call and must be
// commented due to poor readability. What is var_export? What is its
// second arg? Why are we exporting stuff?
$res = is_bool($res) ? var_export($res, 1) : $res;
Ale większość programistów czytających Twój kod będzie potrzebować podróży na http://php.net/var_export, aby zrozumieć, co var_export
robi i jaki jest drugi parametr.
1. var_export
Działa na boolean
dane wejściowe, ale konwertuje także wszystko inne string
.
// OK
var_export(false, 1); // 'false'
// OK
var_export(true, 1); // 'true'
// NOT OK
var_export('', 1); // '\'\''
// NOT OK
var_export(1, 1); // '1'
2) ($res) ? 'true' : 'false';
Działa dla danych logicznych, ale konwertuje wszystko inne (inty, ciągi znaków) na true / false.
// OK
true ? 'true' : 'false' // 'true'
// OK
false ? 'true' : 'false' // 'false'
// NOT OK
'' ? 'true' : 'false' // 'false'
// NOT OK
0 ? 'true' : 'false' // 'false'
3) json_encode()
Te same problemy var_export
i prawdopodobnie gorsze, ponieważ json_encode
nie można wiedzieć, czy ciąg true
miał być ciągiem, czy wartością logiczną.