问答详情
源自:4-4 PHP-常量如何取值

请教大神们一个问题——变量传值问题

请教大神们一个问题:
直接上代码吧,
< ?php
$p="";
//定义圆周率的两种取值
define("PI1",3.14);
define("PI2",3.142);
//定义值的精度
$height = "中";
//根据精度返回常量名,将常量变成了一个可变的常量
if($height == "中"){
   $p = "PI1";
}else if($height == "低"){
$p = "PI2";
}
$r=1;
$area=constant($p)*$r*$r;
$area2=$p*$r*$r;//直接将得到的变量值进行计算。
echo $area;
echo "</br>";
echo $area2;//搞不懂为什么在这里$p的值还是null,没有传入呢?
?>
为什么显示的结果会是:
3.14
0
呢?怎么不是
3.14
3.14
呢?

提问者:我是最棒的程序员 2015-01-05 18:52

个回答

  • 我是最棒的程序员
    2015-01-06 21:32:52

    首先,非常感谢sophia的耐心解答,也非常感谢她的代码!
    <?php

    $foo  =  1  +  "10.5" ;                
    echo $foo."</br>";
    $foo  =  1  +  "-1.3e3" ;          
    echo $foo."</br>";
    $foo  =  1  +  "bob-1.3e3" ;        
    echo $foo."</br>";
    $foo  =  1  +  "bob3" ;               
    echo $foo."</br>";
    $foo  =  1  +  "10 Small Pigs" ;      
    echo $foo."</br>";
    $foo  =  4  +  "10.2 Little Piggies" ; 
    echo $foo."</br>";
    $foo  =  "10.0 pigs "  +  1 ;          
    echo $foo."</br>";
    $foo  =  "10.0 pigs "  +  1.0 ;            
    echo $foo."</br>";
    ?>
    输出结果是:
    11.5
    -1299
    1
    1
    11
    14.2
    11
    11
    根据这个输出结果,我知道了:
    1、开始的那段代码是将字符串“PI1”本身赋值给了$p;
    2、当字符串与整型、单精度浮点型、双精度浮点型的数据一起四则运算(+-*/)时。首先要将字符串进行一种转化,运算结果有以下几种情况:
    一、当字符串首不包含数字,字符串默认转化为数值0。
    二、当字符串首包含数字时,如果是浮点型数据,且小数部分不为0,那么默认的运算结果会自动转化为浮点型数据。
    三、当字符串首包含数字时,如果是浮点型数据,且小数部分为0,那么默认的运算结果就会显示为整型数据(系统默认变量的类型)。
    3、字符串中间有数值,不影响上面1、2点的结果,即只要字符串首不包含数值,字符串还是转化为0.
    4、如果变量被赋值为字符串,没有“.”连接运算符或者constant()运算符的干预,则对它进行运算时,默认会将它转化为数值进行运算。

  • sophia_yu
    2015-01-06 14:17:25

    $area2=$p*$r*$r;这个地方$p参与了运算,相当于一个字符串被当做一个数值来取值,此种情况下:

    如果该字符串没有包含 '.','e' 或 'E' 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串将被当成 integer 来取值。其它所有情况下都被作为 float 来取值。 

    该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。

    参考以下代码,对照运行结果,再理解一下:

    <?php
    $foo  =  1  +  "10.5" ;                 
    $foo  =  1  +  "-1.3e3" ;           
    $foo  =  1  +  "bob-1.3e3" ;         
    $foo  =  1  +  "bob3" ;                
    $foo  =  1  +  "10 Small Pigs" ;       
    $foo  =  4  +  "10.2 Little Piggies" ;  
    $foo  =  "10.0 pigs "  +  1 ;           
    $foo  =  "10.0 pigs "  +  1.0 ;             
    ?>


  • sophia_yu
    2015-01-06 09:50:03

    这个地方你没有搞清楚的是$p的值究竟是什么,echo一下$p的值,你就明白了。