Извините за некроз, я просто хотел посмотреть, как / как 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 + дополнительный регистр):
$ 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
в любом случае