我在初学PHP的时候,练习写了一段判断奇偶性的代码如下:<?php$x=4;
if ($x%2==int)
 echo "This is a double.";
else
 echo "This is an odd.";
 
 ?>我的问题是:$x%2==int 为什么也正确??如果是用 $x%2=="0" 我完全可以理解。
但上面用的int为什么也对?int不是指整数么?余数不都是整数么?这样的话,$x%2==int 岂不是恒成立了?

解决方案 »

  1.   

    php在做比较时,约定将参与比较的元素转换成一致的数据类型(数值型),除非运算符两边都是字符型或特别指定
    $x%2 的结果是数值型的,而标量 int 被转换成数值型后的值就是 0
    所以
    $x%2==int
    等价于
    $x%2==0
      

  2.   

    应该不是int,double 这些关键字 默认当作数字 0 ;个人判断
      

  3.   

    尝试了下。做如下解释if($x%2==int)我们拆分开来理解$x%2 = 0 if($x%2==int)  ===>  if(0==int)在int声明时,PHP解析声明一个NULL值变量(没有符号的数据)
    另外我们发现测试了下 NULL 值与 0 是等值
    在zend.h里我们可以找到#define ZEND_FILE_LINE_EMPTY_C NULL, 0因此你那代码大致理解是正确的。
    唯一让人疑惑的地方就是 int 的构造了其实你的代码变下1 、if(0==int) 在这里应该会产生疑惑的int 如何产生出 NULL
    2 、if(0==NULL) 通过这个你能发现值相等
    3 、if(0===NULL) 通过这个你可以发现NULL竟然就是 0 
    以上仅是我个人的看法。还希望有多PHP原始代码有研究的朋友能支持下
      

  4.   

    error_reporting(E_ALL);// 打开错误提示
    echo int === "int";//true,未定义常量int,等价于字符串int。
    define("int",0);//定义常量后,int值为0
    echo int === "int";//false,严格比较,不等,因为常量int值为0,类型为interger,而字符串"int"类型为string
    echo int == "int";//true,松散比较,相等,为什么这样,因为设计php的人决定这样做,哈哈,为避免掉入陷阱,详见手册:附录 O. PHP 类型比较表
      

  5.   


    不敢苟同你的看法。看了你最后描述参考了手册,我特地也查了下手册
    手册中有以下解释
    If you compare an integer with a string, the string is converted to a number.对于你的 
    echo int === "int";  在手册上有以下样例代码
    var_dump(0 == "a"); // 0 == 0 -> true你后面的比较代码都陷入这个问题中,而你这个问题还不是我们思考这个问题的结症所在
    在这个问题上,我所想的是 int  的保留字声明后,PHP是如何实现以及分配内存内的数据类型空间
      

  6.   


    另外补充下:  强烈建议使用PHP英文手册,如果用中文手册也得用PHP.NET提供的中文手册(至少有些模糊或者未翻译的地方还会给你保留下英文东西)
      

  7.   

    不一样,归根结底是
    echo int === "int";  这一句php如何解析,打开error_reporting,发现有这样的提示Notice: Use of undefined constant int。
    为何你认为
    echo int === "int";  在手册上有以下样例代码
    var_dump(0 == "a"); // 0 == 0 -> true 
    这两句有相同的意义呢?
      

  8.   

    其实这个问题挺有趣的。我认为是php的feature,其它语言可能有另一番解释。
    手册有这么一说
    If you use an undefined constant, PHP assumes that you mean the name of the constant itself, just as if you called it as a string (CONSTANT vs "CONSTANT"). An error of level E_NOTICE will be issued when this happens. See also the manual entry on why $foo[bar] is wrong (unless you first define()  bar as a constant). If you simply want to check if a constant is set, use the defined() function. 此链接有一番说法,可做参考,不妨看看。
    http://benramsey.com/archives/undefined-constant-is-a-string/
      

  9.   

    手册上呢,是这么说的。如果将整数和字符串做比较。
    会自动将字符串转换为整形数据,然后再做比较echo int === "int"  其实,现在大家疑惑的都是 echo int  这里的 int 是如何构造的。我对这个理解是 int --> 为 NULL 值,而NULL值在zend里定义为 0echo int  虽然很让人很费解,但最终我个人所找到的代入值是  0 ,所以我会将以上对比转为
    echo 0 === "int" 然后按照手册中的转换描述  将会转换 "int" 为整形 , 大家知道 "int"中如果不包含数字,将会被直接抛弃非数字字符,如果一个数字字符都没的话,默认会转换为 0 因此对比到此就转变为 echo 0 === 0 ;至于后面  0 == "a"  也是同理---------------------------------
    从上面到现在我其实一直迷惑也头疼的就是 关键字  int 是如何实现的换句通俗点的话来说就是php 如何解释代码中int 是默认就先产生变量的还是后产生?是否有变量表
    这个可能需要对PHP的原始代码了解很详细的朋友能给个回答了
      

  10.   


    你所说的这个应该是PHP的容错处理也就是我们以上常说的
    $_SERVER[PHP_SELF]; 中的 PHP_SELF 处理上PHP默认会将PHP_SELF转换为适合他的类型(String)
    等价$_SERVER[PHP_SELF]  我们之前之不推荐这么写主要是说存在问题是
    define(PHP_SELF,"abc");
    那这样的话 $_SERVER[PHP_SELF];将会成为一个非我们所要的数据,对于程序BUG排查也会是个难点我现在的疑惑就是 int  -  保留字,PHP是如何处理的?
    如果PHP对保留字的处理也是按照那种处理方法那你前面的解释就可以行的通的~
      

  11.   

    其實你這句話的意思本身就是
    if(0==int) :==:值的比較 以前者的值類型為基準
    0===int :== 類型和值 一起比較 以 前者的值類型為基準
      

  12.   

    我现在的疑惑就是 int  -  保留字,PHP是如何处理的? 
    ====================
    int不算保留字,只是类型转换的时候加上括号才算有效php语法的一部分
    $a = 'a';
    echo (int)$a;
    $b = 65;
    echo getType((string)$b);echo int;//int
    echo string;//string
    echo print;//syntax error
    关于保留字应该参考手册:附录 J. 保留字列表
      

  13.   

    其实这个问题本不应该成为问题,1是php设计的问题,像是if ($x%2==int) 这样的语句,未定义的contant完全应该抛出Parse error,从而影响程序执行,手快把$int写成int也不是不可能的。2就是phper习惯问题,$_GET['p']就是$_GET['p'],绝对不要写成$_GET[p];
    也就是因为php设计得太灵活,方便运用的同时,搞得很多phper也养成了不少坏习惯,包括我,