Ответы:
intval()
может быть передана база для конвертации. (int)
не может.
int intval( mixed $var [, int $base = 10 ] )
$i++
является неправильным в красном цвете. Но это должно быть медленнее!
$i++
. Что вы имеете в виду? Когда вы говорите "Но это должно быть медленнее!" что ты сравниваешь?
(int)
быстрее x 2! (int)
: Ideone.com/QggNGc , intval()
: ideone.com/6Y8mPN
Следует отметить одну вещь, касающуюся разницы между (int)
and intval()
: intval()
обрабатывает переменные, которые уже int
s и float
s, как не требующие преобразования, независимо от базового аргумента (по крайней мере, в PHP 5.3.5). Это поведение не является наиболее очевидным, как отмечено в комментариях на странице документации по PHP и бесстыдно повторено здесь:
$test_int = 12;
$test_string = "12";
$test_float = 12.8;
echo (int) $test_int; // 12
echo (int) $test_string; // 12
echo (int) $test_float; // 12
echo intval($test_int, 8); // 12 <-- WOAH!
echo intval($test_string, 8); // 10
echo intval($test_float, 8) // 12 <-- HUH?
The base parameter has no effect unless the var parameter is a string.
Опять же, страница была обновлена четыре дня назад, так что, возможно, это было добавлено».
intval(12,8)
которое даст ответ, что при преобразовании в строку без форматирования будет выглядеть как основание 8 номер просто неправильный Чего бы вы ожидали, intval(12,16)
потому что он не может сделать int c
?
Извините за некроз, я просто хотел посмотреть, повлияет ли / как PHP7 на этот вопрос:
$ php -v
PHP 7.0.4-5+deb.sury.org~trusty+1 (cli) ( NTS )
Тест:
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = (int) '1'; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "3279.1121006012 ms"
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = intval('1'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "5379.3351650238 ms"
Как видите, кастинг определенно быстрее, почти на 100%
Но мне пришлось увеличить количество циклов до 100 миллионов, прежде чем разница составила считанные секунды, а в большинстве случаев я начинал заботиться о производительности.
Поэтому я остановлюсь на использовании этой intval
функции, потому что кастинг - это немного языковой магии, которая происходит. Даже если intval
использование кастинга происходит за кулисами, если при кастинге была обнаружена ошибка, и по какой-то причине ее нельзя было исправить (обратная совместимость?), Тогда они могли бы, по крайней мере, исправить ее intval
для выполнения своих обязанностей.
Обновление (PHP 7.1 + Extra case):
$ php -v
PHP 7.1.0RC6 (cli) (built: Nov 9 2016 04:45:59) ( NTS )
$ php -a
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = (int) '1'; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "3583.9052200317 ms"
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = intval('1'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "3569.0960884094 ms"
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = '1' + 0; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "1641.7920589447 ms"
Выглядит как 7.1 оптимизирован intval
, и «1» + 0 теперь победитель этого конкурса скорости :) я бы до сих пор продолжают использовать в intval
любом случае
+0
это var ... не уверен, что неявное приведение здесь быстрее, чем явное.
+0
победы ... это очень грязный хак
v5.5.34
моих результатов были 9191.0059452057 ms
, 23307.397127151 ms
и 11483.719110489 ms
соответственно. Так что до PHP 7 кастинг был самым быстрым.
$a = '1' + 0;
и я уверен, что большинство из них никогда не думали так делать
Я думаю, что есть как минимум одно отличие: с помощью intval вы можете указать, какая база должна использоваться в качестве второго параметра (по умолчанию база 10):
var_dump((int)"0123", intval("0123"), intval("0123", 8));
получит вас:
int 123
int 123
int 83
intval("2g", 17) = 50 = 2*17 + 16
36
, например, в intval("g", 36) //16
. Любое значение больше 36 возвращает 0. Это говорит о том, что мы можем использовать все 0-9 плюс символы z для нашей пользовательской базы, например intval("z",36) //35
. Также следует отметить, что первый параметр не учитывает регистр .
Одним из полезных свойств intval
является то, что - поскольку это функция, а не языковая конструкция - ее можно передать в качестве аргумента функции, которая ожидает функцию. Вы не можете сделать это с (int)
.
Например, я использовал его для очистки целых чисел для включения в предложение SQL IN()
, передав его array_map
. Вот пример:
$ids = implode(",", array_map('intval', $_POST['array_of_integers']));
$sql = "SELECT * FROM table WHERE ids IN ($ids)";
array_map(function($n){return (int)$n;}, $_POST['array_of_integers'])
Янтарь прав, и если я могу добавить полезную информацию, приведение типов (добавление "(int)" перед вашим выражением) будет на 300-600% быстрее, чем intval. Поэтому, если ваша цель не в том, чтобы иметь дело с другими основаниями, кроме десятичной, я рекомендую использовать:
(int) $something
То, что intval
делает то , чего не делает простое приведение, - это базовое преобразование:
int intval ( mixed $var [, int $base = 10 ] )
Если основание равно 10, то оно intval
должно совпадать с приведением (если только вы не будете придирчивы и упомяните, что один выполняет вызов функции, а другой нет). Как отмечено на странице руководства :
Применяются общие правила целочисленного приведения.