
Иногда бывают и такие задачи, мое решение под катом, возможно кто знает более простой способ?
switch (true) {
case (0x7FFF > (int)(0x7FFF+1)): // 2^15-1
define('PHP_OS_BIT', 16);
break;
case (0x7FFFFFFF > (int)(0x7FFFFFFF+1)): // 2^31-1
define('PHP_OS_BIT', 32);
break;
case (0x7FFFFFFFFFFFFFFF > (int)(0x7FFFFFFFFFFFFFFF+1)): // 2^63-1
define('PHP_OS_BIT', 64);
break;
case (0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF > (int)(0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+1)): // 2^127-1
define('PHP_OS_BIT', 128);
break;
default:
define('PHP_OS_BIT', 8);
break;
}
var_dump(PHP_OS);
var_dump(PHP_OS_BIT);
Можно использовать константу PHP_INT_MAX, но есть зависимость от версии PHP:
switch (PHP_INT_MAX) {
case (0x7FFF): // 2^15-1
define('PHP_OS_BIT', 16);
break;
case (0x7FFFFFFF): // 2^31-1
define('PHP_OS_BIT', 32);
break;
case (0x7FFFFFFFFFFFFFFF): // 2^63-1
define('PHP_OS_BIT', 64);
break;
case (0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF): // 2^127-1
define('PHP_OS_BIT', 128);
break;
default:
define('PHP_OS_BIT', 8);
break;
}
ну как бы да, но зачем?
У меня вот по работе случается так, что скрипты должны знать на какой архитектуре они работают. В зависимости от этого уже вычисления по разному происходят. Для 32 битных систем используется bcmath, а для 64 битных хватает стандартных функций.
А что бывает пхп на чем-то 8битном? Спектрум ? Денди ?
Just for fun
Только несколькими часами раньше столкнулся с разницей 32/64 в функции base_convert() при попытке преобразования 36-ой (0-9, a-z) в 10-ую (0-9). Спасибо.
Решение в лоб
Да. РНР на 8битной ОС это было бы круто))
Даешь РНР на Спектруме
Думаю сейчас мало таких динозавров, у которых установлена ранняя версия.
С помощью этой константы я бы проверял так:
Но почему не легче сделать так?
Т.е в существующих реалиях вполне хватит
define('PHP_OS_BIT', PHP_INT_MAX === 0x7FFFFFFF ? 32 : 64);Если нужно универсальное решение которое будет работать без обновлений даже на РНР-9.3.1 1024-бит, то тут сам по себе подход надо менять, switch это не дело…
В прочем как уже сказали выше проще всего
define('PHP_OS_BIT', PHP_INT_SIZE << 3);Ну а если сугубо посмеяться, я бы предложил так
$bits = 1; for ($i = PHP_INT_MAX + 1; $i != 1; $i /= 2 ) { $bits++; }; define('PHP_OS_BIT', $bits);Впрочем есть вариант и без констант…
for ($i=1; is_int(pow(2,$i)); $i++) {} define('PHP_OS_BIT', ++$i);(думаю сработает даже на РНР3, но под рукой нету)