PHP的极限奇葩问题----持续更新

PHP怪癖与陷阱
本文深入探讨PHP开发中易忽视的怪癖与潜在陷阱,包括跨域请求处理、字符串与数组混淆、上传表单限制、数组键名换算等,揭示PHP在不同场景下的行为特性,帮助开发者避免常见错误。

 php奇葩注意事项

--------------------------------------------

浏览器跨域请求  会先发起  预options请求

然后我们的PHP当他是GET处理  这时会存在重复请求并丢失post数据可能 

所以遇到options请求 直接die结束执行

跨域问题

跨域有协议头部+请求模式+域名限制  你抓包对比下看看触发哪个规则
还有如果返回 2个重复 Access-Control-Allow-Origin * 跨域也会出问题

------------------------------------------------

字符串跟数组混淆容易出bug

$v = '90';
@$b = $v['type_name']; #bug产生 if($v['type_name'])执行有这个变量的操作
var_dump($b); #输出'9'  他把$v['type_name']>>$v[(int)'type_name']>>$v[0]

phpv7.3

-----------------------------------------------------

当上传表单大于nginx/php配置 最大限制后 访问将请求保留    丢弃所有post参数

----------------------------------------------------------------------

数组奇葩换算

$arr = [5=>5,'5.1'=>5.1];
$arr[5.1]#输出5  小数自动变整数
$arr['5.1']#输出5.1

$arr['5']#输出5

----------------------------------------------------------------------

默认赋值问题

function skuList(&$nn=0){
    
}

skuList($nn);

var_dump($nn);


#输出null  并没有触发 空赋值0

-------------------------------------------------------

<?php
$str = 'hello'; 
echo $str{0}, "\n",$str{1}, "\n";
echo "{$str}dawd-$str{1}";

输出

h
e
hellodawd-hello{1}

$str{1}可以取出单个字符串

"{$str}8421"隔开变量名

---------------------------------------------------

数组创建

<?php
$a = array(
    'a',
    3 => 'b',
    1 => 'c',
	'e'=>66,
    'd',
	0 => '0',
	null => 'a',
    true => 'b',
    false => 'c',
	'' => 'f'
);
var_dump($a);

输出结果为:

array(6) {
  [0]=>
  string(1) "c"
  [3]=>
  string(1) "b"
  [1]=>
  string(1) "b"
  ["e"]=>
  int(66)
  [4]=>
  string(1) "d"
  [""]=>
  string(1) "f"
}

字符串a已经消失了 被 0替换

字符串d的键 = 取最大的数字键 +1

注:键名将被这样转换:null 转为(空字符串),true 转为 1,false 转为 0。

----------------------------------------------------------------------

通常我们都知道  false值有以下几种情况

null、false、‘’、0、[]、

<?php
$var = '0';
if ($var) {
    echo 'true';
} else {
    echo 'false';
}

'0'同样是输出false

var_dump(0==='0');

输出false

var_dump(empty($q));#是否为空
var_dump(isset($q));#是否已经创建变量

$q='';//不一样的效果来了

var_dump(empty($q));#是否为空
var_dump(isset($q));#是否已经创建变量

 很多时候这两个结果相反  但是如果不注意使用 容易bug

 true
 false
 true
 true

-----------------------------------------------------------------------------------

<?php
$RESULT = 11 + 011 + 0x11;
echo "$RESULT";

通常我们会以为 011 = 11  其实错误了

注:十进制加八进制加十六进制数,11 + 9 + 17 = 37

------------------------------------------------------------------------------

<?php
if ('2' == '02') {
    echo 'true';
} else {
    echo 'false';
}

PHP有毒,,自动化转 居然都不判断类型就 最大化识别匹配

注:php数值字符串作为整数进行比较。

----------------------------------------------------------

"222";
null;

php允许无用语句

--------------------------------------------------------

define('EEE',[1,2,3]);

报错

备注:只有(布尔值、整数、浮点数和字符串)可以包含在常量中  php7中已支持  但是依旧不支持对象和function

----------------------------------------------------------------

php小数有精度问题 

var_dump( 100*9.12);  = 9.11999999999

需要用bc开头高精度函数解决

-------------------------------------------

部分代码有jit问题 

静态变量缓存了结果函数

会导致 完全不运行 xx2缓存()

循环

xx()>xx1>xx2缓存()

循环

-------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值