PHP 개발자가 거의 항상 실수하는 작업에 대한 자세한 설명

黄舟
풀어 주다: 2023-03-06 13:04:01
원래의
1582명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿