Часть вашего заблуждения в том, что ord
- это просто не та функция, которую следует использовать здесь - это не функция приведения и не функция отладки, которая принимает любой тип. Это функция, которая ожидает строку и возвращает int, поэтому PHP должен сначала привести логическое значение к строке, а затем запустить функцию.
Обратите внимание, что PHP не преобразует false
в байт NSC ASCII (0). Это всего лишь артефакт того, что вы используете ord()
вне его предназначения: вы передали пустую строку и спросили: «Какой первый байт этой строки?» Возможно, он должен был дать вам ошибку, но в этом случае он решил дать вам 0
.
Лучшим тестом будет использование var_dump
, предназначенное для проверки значений PHP:
var_dump(true); // bool(true)
var_dump(false); // bool(false)
var_dump((string)true); // string(1) "1"
var_dump((string)false); // string(0) ""
Если вы хотите привести логическое значение к выбранному представлению, лучше всего просто использовать троичный оператор:
$bitAsInt = $booleanValue ? 1 : 0;
$bitAsString = $booleanValue ? '1' : '0';
$booleanKeyword = $booleanValue ? 'true' : 'false';
$boolString = $booleanValue ? "'t'" : "'f'";
Все вышеперечисленное подходит для некоторых систем баз данных в некоторых контекстах и служит хорошим объяснением того, почему (string)$booleanValue
не может просто дать вам правильную вещь каждый раз.
Существуют и другие сценарии, в которых (string)false
предоставление пустой строки является наиболее полезным, и именно это решил PHP. То есть:
(string)$booleanValue === ($booleanValue ? '1' : '')
Всегда есть много ответов на "почему". Для исторического контекста это, вероятно, было вдохновлено Perl (который был популярен для веб-программирования во время создания PHP) - хотя он не имеет логического типа как такового, он демонстрирует похожее поведение приведения:
print ( 1==1 ); # true as string, gives '1'
print ( 1==2 ); # false as string, gives ''
print 0 + ( 1==1 ); # true as int, gives 1
print 0 + ( 1==2 ); # false as int, gives 0