мой PHP переводчик сходит с ума, или я тот, кто ...? - PullRequest
2 голосов
/ 29 января 2012

Я продолжаю сталкиваться с действительно странным поведенческим кодированием php. Вот пример:

<?php 
date_default_timezone_set("Europe/Berlin");
$interval1 = (int) 336000;
$interval2 = (int) 1459200;
$interval3 = (int) 17403000;
$interval4 = (int) 43205760;
$interval5 = (int) 84299520;
$week =  (int) 604800;
?>

Когда я запускаю этот код, я получаю "неожиданную ошибку T_INT_CAST в строке 8" WTF? !! первые 5 приведений работают отлично. Когда я ничего не разыгрываю, первые 5 выражений приводят к целому числу, последнее в строке. Я заметил это при сравнении значений и, очевидно, получил неправильные результаты.

Вот вывод в шестнадцатеричном редакторе (согласно запросу в комментарии):

00000000: 3C 3F 70 68 70 20 0A 64  61 74 65 5F 64 65 66 61 
00000010: 75 6C 74 5F 74 69 6D 65  7A 6F 6E 65 5F 73 65 74 
00000020: 28 22 45 75 72 6F 70 65  2F 42 65 72 6C 69 6E 22 
00000030: 29 3B 0A 24 69 6E 74 65  72 76 61 6C 31 20 3D 20 
00000040: 28 69 6E 74 29 20 33 33  36 30 30 30 3B 20 2F 2F 
00000050: 74 65 73 74 20 69 6E 74  65 72 76 61 6C 20 66 72 
00000060: 6F 6D 20 68 74 74 70 3A  2F 2F 65 63 6B 71 75 61 
00000070: 72 74 65 72 73 2E 63 6F  6D 2F 6D 6F 65 74 65 72 
00000080: 77 6F 6C 66 2F 64 69 61  67 72 61 6D 6D 31 2E 68 
00000090: 74 6D 6C 0A 24 69 6E 74  65 72 76 61 6C 32 20 3D 
000000A0: 20 28 69 6E 74 29 20 31  34 35 39 32 30 30 3B 0A 
000000B0: 24 69 6E 74 65 72 76 61  6C 33 20 3D 20 28 69 6E 
000000C0: 74 29 20 31 37 34 30 33  30 30 30 3B 0A 24 69 6E 
000000D0: 74 65 72 76 61 6C 34 20  3D 20 28 69 6E 74 29 20 
000000E0: 34 33 32 30 35 37 36 30  3B 0A 24 69 6E 74 65 72 
000000F0: 76 61 6C 35 20 3D 20 28  69 6E 74 29 38 34 32 39 
00000100: 39 35 32 30 3B 0A 24 77  65 65 6B 20 3D 20 A0 69 
00000110: 6E 74 76 61 6C 28 36 30  34 38 30 30 29 3B

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Как видно из шестнадцатеричного редактора в вашем php-коде, перед произнесением intval / (int) есть неразрывный пробел: (второй пробел)

00000100: 39 35 32 30 3B 0A 24 77 65 65 6B 20 3D 20A069

избавься от этого и твой код должен работать.

1 голос
/ 29 января 2012

Вы должны подумать о

PHP_INT_SIZE

Размер целого числа зависит от платформы, хотя максимальное значение около двух миллиардов является обычным значением (это 32 бита со знаком).64-битные платформы обычно имеют максимальное значение около 9E18.PHP не поддерживает целые числа без знака.Целочисленный размер можно определить с помощью константы PHP_INT_SIZE, а максимальное значение - с помощью константы PHP_INT_MAX, начиная с PHP 4.4.0 и PHP 5.0.5.

При попытке преобразования чисел с плавающей запятой в целые, если число с плавающей запятой выходит заграницы целого числа (обычно +/- 2,15e + 9 = 2 ^ 31 на 32-разрядных платформах и +/- 9,22e + 18 = 2 ^ 63 на 64-разрядных платформах), результат не определен, так как float нене хватает точности, чтобы дать точный целочисленный результат.Когда это произойдет, предупреждения не будет, даже уведомление не будет выдано!

Попробуйте изменить константу PHP_INT_SIZE и сообщите нам, что изменилось

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...