经验总结以及细节问题汇总

经验总结以及细节问题汇总

按位与计算是否为基数

$var & 1;//$var 为整数奇数 该结果为true,即‘&’符号可以用来判断是否为奇数

有意忽略php关闭标签

<?php
echo 'Hello';  
//Now dont close this tag

这將节约你很多时间,

我们举个例子://一个 super_class.php 文件

<?php
class super_class { 
    function super_function() {
         //pass
    }
 }
?>

//super extra character after the closing tag

index.php
require_once('super_class.php');
//echo an image or pdf, or set the cookies or session data

这样,你將会得到一个 Headers already send error。为什么?因为 “super extra character” 已经被输出了。现在你得开始调试啦。这会花费大量时间寻找 super extra 的位置。因此,养成省略关闭符的习惯:

 <?php
 class super_class {
     function super_function() {
        //pass
     }
 }
 //No closing tag

这回更好.

更改应用创建的文件权限

在linux环境中,权限问题可能会浪费你很多时间。从今往后,无论何时,当你创建一些文件后,确保使用chmod设置正确权限。否则的话,可能文件先是由”php”用户创建,但你用其它的用户登录工作,系统將会拒绝访问或打开文件,你不得不奋力获取root权限,更改文件的权限等等。

1 //Read and write for owner, read for everybody else
2 chmod('somedir/somefile', 0644);
3 //Everything for owner, read and exceute for others
4 chmod('somedir/somefile', 0755);

也就是创建文件的同时,要设置正确的文件权限

使用echo取代print

使用str_replace取代preg_replace,除非你绝对需要

不要使用 short tag

简单字符串用单引号取代双引号

head重定向后记得使用exit

不要在循环中调用函数

isset比strlen快

始中如一的格式化代码

不要删除循环或者if-else的括号

尽量不要用COUNT,能用ISSET用ISSET替代,比如ISSET($a[499])代替COUNT($a)==500

字符串与变量进行判断,字符串在前变量在后,防止少写一个等号,变成赋值操作。如:‘aa’==$a代替$a=='aa'

大数组尽量不要作为参数传递,如果非要传递,可以用传引用传参或者设置静态变量

尽量用===代替==

变量值判断是否是等于某个数字或者大于某个数字等,不要直接int($a)判断,要先判断是否是数字,如使用is_numeric($a)

时刻小心精度丢失的情况

$f = 0.58; echo intval($f * 100); // 输出57 sprintf("%.2f",$f * 100); //输出58.00

Hash比较

在进行hash比较的时候会存在问题。如下:

"0e132456789"=="0e7124511451155" //true
"0e123456abc"=="0e1dddada"    //false
"0e1abc"=="0"     //true

在进行比较运算时,如果遇到了0e\d+这种字符串,就会将这种字符串解析为科学计数法。所以上面例子中2个数的值都是0因而就相等了。如果不满足0e\d+这种模式就不会相等。这个题目在攻防平台中的md5 collision就有考到。

十六进制转换

还存在一种十六进制余字符串进行比较运算时的问题。例子如下:

"0x1e240"=="123456"        //true
"0x1e240"==123456        //true
"0x1e240"=="1e240"        //false

当其中的一个字符串是0x开头的时候,PHP会将此字符串解析成为十进制然后再进行比较,0x1240解析成为十进制就是123456,所以与int类型和string类型的123456比较都是相等。攻防平台中的起名字真难就是考察的这个特性。

in_array()

in_array()函数的第三个参数大多数情况都要传true,使其等价于全等于判断

尤其你的数组里有可能字符串和整数类型同时存在的场景下!

在PHP手册中,in_array()函数的解释是bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ),如果strict参数没有提供,$strict默认值false,那么in_array就会使用松散比较来判断$needle是否在$haystack中。当strince的值为true时,in_array()会比较needls的类型和haystack中的类型是否相同。

$array=[0,1,2,'3'];
var_dump(in_array('abc', $array));  //true
var_dump(in_array('1bc', $array));    //true

可以看到上面的情况返回的都是true,因为’abc’会转换为0,’1bc’转换为1。array_search()与in_array()也是一样的问题。

                       

点击阅读全文

上一篇 2023年 6月 11日 am11:00
下一篇 2023年 6月 11日 am11:00