intval과 int로 캐스팅하는 것 사이에 특별한 차이점이 있습니까?


219

intval과 (int) 사이에 특별한 차이점이 있습니까?

예:

$product_id = intval($_GET['pid']);
$product_id = (int) $_GET['pid'];

위 두 줄의 코드 사이에 특별한 차이점이 있습니까?

답변:


192

intval()변환 할 기준전달할 수 있습니다 . (int)할 수 없습니다.

int intval( mixed $var  [, int $base = 10  ] )

73
(INT)가있어서, 빠름) (INTVAL보다 wiki.phpbb.com/Best_Practices:PHP
마틴 토마

내가 따라 아래에 명시된 오늘 이전, 기본 변환은 인수를 int 또는 부동 인 경우 예상대로 작동하지 않습니다.
t-dub

1
@moose 페이지 상태 $i++가 빨간색 으로 올바르지 않습니다 . 그러나 더 느려 야한다!!
Shiplu Mokaddim 2012

1
나는 결코 말한 적이 없다 $i++. 무슨 소리 야? "하지만 속도가 느려 야합니다!"라고 말할 때 당신은 무엇을 비교합니까?
마틴 토마

6
나는 ideone- (int)typecast가 x 2 더 빠릅니다. (int): ideone.com/QggNGc , intval(): ideone.com/6Y8mPN
jave.web

52

의 차이에 대한주의 사항 한 가지 (int)intval(): intval()취급 이미 변수 ints와 float(적어도 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?

13
의사 말합니다. The base parameter has no effect unless the var parameter is a string.그러면 다시 4 일 전에 페이지가 업데이트되었으므로 추가되었을 수 있습니다.
궤도에서 가벼움 경주


6
문서화가 잘되어 있든 없든간에, 함수가 이론적으로 기본 변환을 수행 할 수 있다는 사실을 고려하면 동작이 약간 놀랍습니다. 그것은 확실히 전에 나를 트립,하지만 아마도 그냥 RTFM 좀 더 신중하게 :)
t-dub

7
나는 이것이 오래된 스레드라는 것을 알고 있으며 여전히 프로그래밍하고 있다면 이것이 실제로 가장 명백한 결과 인 이유를 알기를 바랍니다. base는 문자열 표현에만 사용되므로 int에는 base가 없습니다. 더 간단히 말하면, 기본 10의 int 12는 기본 99의 int 12와 같습니다. 여전히 12입니다. intval(12,8)형식이없는 문자열로 변환 할 때 기본 8처럼 보일 것입니다. 숫자가 잘못되었습니다. intval(12,16)int를 만들 수 없기 때문에 무엇을 기대할 수 c있습니까?
Robert McKee

1
또는 다른 방법 ... 1970 년 1 월 1 일 이후 1523994328 개의 틱이있었습니다. MM / DD / YYYY 또는 DD / MM / YYYY로 저장되어 있는지 묻는 것은 그 형식 중 하나에 저장되어 있지 않기 때문에 의미가 없습니다. 특정 날짜 형식이 아닌 숫자로 저장됩니다. int의 기초가 무엇인지 묻는 것과 같은 방법입니다. 표시되는 형식에서 값을 분리하는 것은 매우 중요합니다.
Robert McKee

32

괴로워서 미안합니다. 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 % 빨라졌습니다.

그러나 차이가 몇 초가되기 전에 루프 카운트를 1 억으로 늘려야했는데, 실제로 대부분의 경우 성능에 관심을 갖기 시작했습니다.

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어쨌든 계속 사용 하고 있습니다.


1
남아있는 유일한 벤치 마크 +0는 var입니다 ... 여기의 암시 적 캐스팅이 명시 적 캐스팅보다 빠른지 확실하지 않습니다.
SparK

2
LOL @ +0
wining

@SparK 당신의 아이디어 :) 나는 그것을 신뢰하지는 않겠지 만, PHP의 타입 캐스팅 규칙은 정확히 최고가 아닙니다
Populus

들어 v5.5.34내 결과는 9191.0059452057 ms, 23307.397127151 ms그리고 11483.719110489 ms각각. 따라서 PHP 7 이전에는 캐스팅이 가장 빠릅니다.
GreeKatrina

비록 이해하기는 쉽지 않지만 나는 그런 식으로 $a = '1' + 0;생각하지 않았을 것입니다
mic

26

적어도 하나의 차이점이 있다고 생각합니다. intval을 사용하면 두 번째 매개 변수 (기본적으로 10 진법)로 사용할 기준을 지정할 수 있습니다.

var_dump((int)"0123", intval("0123"), intval("0123", 8));

당신을 얻을 것입니다 :

int 123
int 123
int 83

11
나는 기초 17 숫자 "g"를 십진수로 변환 할 수 있다는 것이 엄청나게 재미있다 :intval("2g", 17) = 50 = 2*17 + 16
JSchaefer

1
@JSchaefer 더 나아가서 기본으로 전달할 수있는 최대 값은 36과 같습니다 intval("g", 36) //16. 36보다 큰 값은 0을 반환합니다. 즉, 사용자 지정 기준에 대해 0-9와 az 문자를 모두 사용할 수 있습니다 (예 :) intval("z",36) //35. 또한 첫 번째 매개 변수는 대소 문자를 구분하지 않습니다 .
Jay Dadhania

17

유용한 속성 중 하나 intval는 언어 구조가 아니라 함수이기 때문에 함수를 기대하는 함수에 인수로 전달할 수 있다는 것입니다. 으로이 작업을 수행 할 수 없습니다 (int).

예를 들어, 정수를 IN()전달 하여 SQL 절에 포함시키기 위해 정수를 살균 했습니다 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'])
다니엘 오 미네

@DanielOmine 나는 콜백 함수를 정의하지 않고도 사용할 수 있음을 의미했습니다.
Kodos Johnson

15

앰버가 옳고 유용한 정보 유형 캐스팅을 추가하면 (식 앞에 "(int)"추가) intval보다 300 ~ 600 % 빠릅니다. 따라서 귀하의 목적이 소수 이외의 다른 염기를 다루지 않는 경우 다음을 사용하는 것이 좋습니다. (int) $something


2
: 뭔가 당신이 흥미있을 programmers.stackexchange.com/questions/99445/...
게리

8

것은 intval간단한 캐스트하지 않는 것을 수행은 기본 변환입니다 :

int intval ( mixed $var [, int $base = 10 ] )

그러나 밑이 10이면 intval캐스트와 동일해야합니다. 매뉴얼 페이지 에 명시된 바와 같이 :

정수 캐스팅의 일반적인 규칙이 적용됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.