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.