Відповіді:
intval()може передаватися база, з якої можна перетворити. (int)не може.
int intval( mixed $var [, int $base = 10 ] )
$i++є неправильним в червоному кольорі. Але це повинно бути повільніше !!
$i++. Що ви маєте на увазі? Коли ви говорите "Але це повинно бути повільніше !!" з чим ти порівнюєш?
(int)typecast - це швидше x 2! (int): Ideone.com/QggNGc , intval(): ideone.com/6Y8mPN
Варто зауважити про різницю між (int)та intval(): intval()трактує змінні, які вже є ints та floats, не потребують перетворення, незалежно від базового аргументу (як мінімум на 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 a 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 + додатковий регістр):
$ 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 ... не впевнений, що тут неявна передача є швидшою, ніж явна.
+0win ... це дуже брудний злом
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 плюс az символів для нашої спеціальної бази, наприклад 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повинна бути такою ж, як у складі (якщо тільки ви не будете нахабними і згадаєте, що один робить виклик функції, а інший - ні). Як зазначено на сторінці людини :
Чинні правила керування цілими числами застосовуються.