1. 서문
최근 PHP가 수학 연산을 수행하는 데 있어 사소하고 무해한 몇 가지 문제에 직면했습니다.
개미집 속에 천리 둑이 무너졌습니다. 유형 변환을 추가하면 매우 쉽게 해결되지만 그냥 놔둘 수는 없을 것 같습니다.
특히 재무 계산을 수행하거나 인터페이스 계산 및 강력한 언어 도킹학생들은 더 많은 관심을 기울여야 합니다.
별거 아닌데, 디테일이 성공과 실패를 결정짓는 법이니까요. 정말 많은 방법이 있고, 저도 교훈을 얻었습니다.
PHP가 약한 유형의 언어라는 것을 정말로 알고 계십니까?
얼마 전 PHP 커널에 대한 연구를 진행하여 PHP 변수의 기본 저장 구조에 대해 자세히 이해했습니다. 그러나 다양한 유형의 연산 프로세스는 이해하지 못했습니다. 값과 변수 유형의 변환 과정.
사실 이는 우리의 지능형 PHP [자동 유형 변환]의 문제이기도 합니다. , 그냥 완전히 공부하고 요약하세요.
(아래 5가지 예시가 있는데 모두 아주 간단한 조작이지만 이유를 알 수 없을 수도 있습니다)
2. 프로세스 분석
사례 1
먼저 제가 겪은 문제(간소화)를 살펴보겠습니다. 제가 이 블로그를 쓰게 된 계기가 되었습니다.$a = '1.11'; $b = '0.11'; var_dump($a);//string(4) "1.11" var_dump($b);//string(4) "0.11" $re = $a - $b; var_dump($re);//float(1)참고: 두 가지 변경 사항이 발생했습니다.
1. 문자열을 빼서 부동 소수점형으로 변환
2. 피감수는 모두 소수점 이하 두 자리이고 결과는 소수점이 아닙니다. [앱에서 소수점 두 자리를 요구하기 때문에 버그가 발생하는 곳이기도 합니다. display 】
마찬가지로 소수가 없는 문자열을 뺄 경우 결과는 int
$a = '11'; $b = '1'; var_dump($a);//string(4) "11" var_dump($b);//string(4) "1" $re = $a - $b; var_dump($re);//int(10)
결론: 1. PHP 기본 연산 과정에서 다음을 입력합니다. 변환은 자동으로 수행되며, 소수는 부동 소수점으로, 정수는 정수로 변환됩니다.
2. 숫자의 소수 자릿수를 제한해야 하는 경우 이를 처리하는 것을 잊지 마세요. number_format();
이 이미 시작되었습니다. 이 유형 변환에 대해 이야기해 보겠습니다.
예 2 질문: 다음 내용은 참인가요, 거짓인가요?
var_dump(0123 == 123); var_dump('0123' == 123); var_dump('0123' === 123);답은 무엇인가요? ?
false;true;false
분석:
===는 강력한 판단이고 유형 비교를 추가하기 때문에 세 번째가 false라고 누구나 쉽게 추측할 수 있다고 생각합니다.
두 가지가 있습니다. 여기서 주의할 점. 한편, PHP의 맨 아래 레이어는 0으로 시작하는 정수를 8진수로 간주합니다. 반면에 sting을 int로 변환할 때 선행 0이 제거됩니다.
var_dump(0123 == 123); // false, PHP의 기본값은 0123입니다. 이는 8진수로 처리되지만 실제로 10진수로 변환하면 83입니다. 분명히 이것은 동일하지 않습니다.
var_dump('0123' == 123); // 여기서는 true입니다. PHP는 '0123'을 숫자로 변환하고 기본적으로 이전 0(123==123)을 제거하는 것이 매우 흥미로울 것입니다.
var_dump(' 0123 ' === 123); // false 분명히 위의 질문에서는 숫자와 문자열 유형이 일치하지 않는다고 말했습니다.
결론: 1. 0으로 시작하는 정수는 PHP에서 8진수로 처리됩니다.
2. 동료의 결론 1 예제 1, 문자열은 연산 중에 자동으로 유형 변환을 수행합니다. 앞의 0은 제거됩니다
예 3 아래 $x의 결과는 무엇입니까:
$x = NULL; if ('0xFF' == 255) { $x = (int)'0xFF'; } $x = ?
答案是什么呢??
$x=0而不是255
注意点:
首先'oxFF' == 255我们好判断,会进行转换将16进制数字转换成10进制数字,0xff = 255。PHP使用is_numeric_string 判断字符串是否包含十六进制数字然后进行转换。
但是$x = (int)'0xFF';是否也会变成255呢?显然不是,将一个字符串进行强制类型转换实际上用的是convert_to_long,它实际上是将字符串从左向右进行转换,遇到非数字字符则停止。因此0xFF到x就停止了。所以$x=0
结论:
1.0开头的整形数字PHP会当作十六进制来处理
2. string->int的过程,是将字符串从左向右进行转换,遇到非数字字符则停止。
事例四
经过下面的运算 $x的值应该是多少?
$x = 3 + "15%" + "$25"
答案是什么呢?? 18
注意点:其实就是前边的所提到的点。3+15+0=18(0时因为从左往右取数字嘛,遇到非数字停止,没有当然为0)
事例五(无关类型转换,但也很有意思)
$a = true && false; var_dump($a); $a = true and false; var_dump($a);
答案是什么呢??
false;true
为什么呢?是对运算符优先级的一个理解,哈哈,提醒到这里自己去查查吧~
事例六
$arr = array(0,1,2,3); foreach ($arr as $key => $value) {} var_dump(current($arr));//最后指针停留在数组结尾,取不到值了输出false $arr = array(0,1,2,3); foreach ($arr as $key => $value) { //$arr其实是进行了一次传值,用的是$arr_copy $arr[$key] = $value;//进行了改值,则发生分离现象 } var_dump(current($arr));//输出1
输出false 与 1;(PHP5.6环境下,php7已经做了修改);
那这个又是为什么呢?【和PHP内核有关,变量分离改变】
위 내용은 PHP 개발자가 거의 항상 실수하는 작업에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!