关于 imagetypes() & IMG_PNG 语法问题

今天在知道碰到有网友对 PHP 手册上的这段代码感到疑惑:

  1. <?php 
  2. if (imagetypes() & IMG_PNG) { 
  3. echo"PNG Support is enabled"
  4. ?>  
<?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 常量

  1. <?php 
  2.  
  3. echo IMG_GIF;    //输出1  
  4. echo IMG_JPG;    //输出2  
  5. echo IMG_PNG;    //输出4  
  6. echo IMG_WBMP;    //输出8  
  7. echo IMG_XPM;    //输出16  
  8.  
  9. ?> 
<?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 中还有很多地方使用到了这种方式,有心人可以研究一下。

 

posted @ 2013-03-19 21:13  达也.  阅读(319)  评论(0)    收藏  举报