우리 대부분이 알고 있듯이 PHP는 타이핑 이 약 합니다. 그렇지 않은 사람들을 위해 PHP.net은 말합니다.
PHP는 변수 선언에서 명시 적 유형 정의를 요구하지 않거나 지원하지 않습니다. 변수 유형은 변수가 사용되는 컨텍스트에 따라 결정됩니다.
그것을 좋아하거나 미워합니다. PHP는 변수를 즉석에서 다시 캐스팅합니다. 따라서 다음 코드가 유효합니다.
$var = "10";
$value = 10 + $var;
var_dump($value); // int(20)
PHP를 사용하면 다음과 같이 변수를 명시 적으로 캐스팅 할 수 있습니다.
$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"
그것은 모두 시원합니다 ...하지만, 내 삶을 위해, 나는 이것을하는 실질적인 이유를 생각할 수 없습니다.
Java와 같이 지원 언어로 강력한 타이핑에 문제가 없습니다. 괜찮습니다. 완전히 이해합니다. 또한 함수 매개 변수에서 유형 힌트 의 유용성을 알고 있으며 완전히 이해하고 있습니다.
타입 캐스팅과 관련된 문제는 위의 인용문으로 설명됩니다. PHP가 원하는대로 타입 을 바꿀 수 있다면 , 타입 을 강제로 캐스팅 한 후에도 그렇게 할 수 있습니다 . 그리고 그렇게 할 수 에 - 더 - 플라이 당신이 작업의 특정 유형을 필요로 할 때. 그러면 다음이 유효합니다.
$var = "10";
$value = (int)$var;
$value = $value . ' TaDa!';
var_dump($value); // string(8) "10 TaDa!"
그래서 요점이 뭐야?
PHP 에서 사용자 정의 유형 캐스팅 이 적합한 세계의 이론적 예를 보자 .
- 캐스트 변수
$foo
를int
→ 로 강제 실행(int)$foo
합니다. - 변수에 문자열 값을 저장하려고합니다
$foo
. - PHP는 예외를 던졌습니다 !! ← 말이 되겠네요. 갑자기 사용자 정의 유형 캐스팅의 이유가 존재합니다!
PHP가 필요에 따라 상황을 전환한다는 사실은 사용자 정의 유형 캐스팅의 요지를 모호하게 만듭니다. 예를 들어 다음 두 코드 샘플은 동일합니다.
// example 1
$foo = 0;
$foo = (string)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
// example 2
$foo = 0;
$foo = (int)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
원래이 질문을 한 지 1 년 후, 실제 환경에서 누가 타입 캐스팅을 사용하고 있는가? 당신은 정말입니다.
식당 메뉴를 위해 웹 사이트에 돈 가치를 표시해야했습니다. 사이트를 디자인하려면 후행 0을 다듬어야하므로 디스플레이가 다음과 같이 보입니다.
Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3
내가 찾은 가장 좋은 방법은 변수를 float로 캐스팅하는 것이 아닙니다.
$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;
PHP는 float의 후행 0을 자른 다음 float를 문자열로 다시 연결하여 연결합니다.
(string)
캐스트 를 원하십니까 ?
$intval.'bar'
예외를 던졌다 고 말하는 경우 에도, 나는 여전히 동의하지 않습니다. 그것은 어떤 언어에서도 예외를 던지지 않습니다. (내가 아는 모든 언어는 자동 전송 또는을 수행합니다 .toString()
). 당신이 $intval = $stringval
예외를 던졌다 고 말하는 경우, 당신은 강력한 유형의 언어에 대해 이야기하고 있습니다. 무례하게 들릴 생각은 아니 었으므로 미안합니다. 나는 그것이 모든 개발자가 익숙한 것에 반하고 훨씬 덜 편리하다고 생각합니다.