찾다
백엔드 개발PHP 튜토리얼PHP 개발자가 거의 항상 실수하는 작업에 대한 자세한 설명

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

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전