今天在知道碰到有网友对 PHP 手册上的这段代码感到疑惑:
[php] view plain copy <?php if (imagetypes() & IMG_PNG) { echo "PNG Support is enabled"; } ?>这代码是什么意思? imagetypes() 返回 IMG_PNG IMG_GIF | IMG_JPG | IMG_PNG & 是不是要改成== ? 这个& 在这里是什么意思?
===========================================================
其实这是一个有趣的问题,但好像并没有多少资料可供借鉴。大部分教程或者资料也只是循规蹈矩的进行类似代码的引用而已。
imagetypes() & IMG_PNG 是按位与的简便判断方式来判断 IMG_PNG 是否属于 imagetypes() 结果内从而判断 php 所支持的图像格式。但这种判断可不是如这位网友所疑惑的为什么不用 == 运算符。
其实PHP预定义了这些: IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP| IMG_XPM 常量
[php] view plain copy <?php echo IMG_GIF; //输出1 echo IMG_JPG; //输出2 echo IMG_PNG; //输出4 echo IMG_WBMP; //输出8 echo IMG_XPM; //输出16 ?>
1 2 4 8 16 ... 是一个很特殊的数字序列,在二进制下,这些数字完全没有重叠,可以有多种组合。 如果系统只支持 IMG_GIF 与 IMG_JPG ,那么我们就记录 3(1+2) 这个数据即可,而没必要记录1,2。同理,如果系统支持IMG_GIF|IMG_JPG|IMG_PNG ,那么系统将记录 7(1+2+4) 这个数据,依次可以类推。
执行一下: echo imagetypes(); 一般情况下输出会是 15 ,所以你的 PHP 系统支持的就是 IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP 这么几个组合(1+2+4+8=15) 所以可以通过 (imagetypes() & IMG_PNG) 来判定是否支持 IMG_PNG ,当然这其中有个还原的过程。 PHP 中还有很多地方使用到了这种方式,有心人可以研究一下。