php: return与=区别及参数中$var=\'d\'与$var区别 => 难题已解

来源:互联网 发布:php 反射机制 编辑:程序博客网 时间:2024/06/09 17:04
        /*------test code-----------*/

        <pre>
        <?php

        echo '--------test 1, 2 type 1---------<br/>';
        $globalVar = 'global var';
        var_dump(array('what is return' => test($old = 1, $new = 2, $globalVar = & $globalVar) ));
        var_dump(array('<span style="color:red">call test over old value </span>' => $old));

        echo '--------test 1, 2 type 2---------<br/>';
        $old = 1;$new = 2;
        var_dump(array('what is return' => test($old , $new , $gVar)));
        var_dump(array('<span style="color:red">call test over old value </span>' => $old));

        echo '--------test 1, 0 type 1---------<br/>';
        var_dump(array('what is return' => test($old = 1, $new = 0, $globalVar = & $globalVar) ));
        var_dump(array('<span style="color:red">call test over old value </span>' => $old));

        echo '--------test 1, 0 type 2---------<br/>';
        $old = 1;$new = 0;
        var_dump(array('what is return' => test($old , $new , $gVar)));
        var_dump(array('<span style="color:red">call test over old value </span>' => $old));
        exit;
           
        function test (& $old, $new, & $isCopyOrReferVar) {
          global $globalVar;
          var_dump(array('outside test global var is' => &$globalVar, 'inside is ' => &$isCopyOrReferVar, 'test ===  ' => ($isCopyOrReferVar === $globalVar)));
          var_dump(array('new value is' => $new, 'old value is ' => $old));
          return $old = $new or var_dump(array('when false old value is' => $old));
        }

----------------结果-----------------

array(3) {
  ["新值"]=>
  int(2)
  ["旧值"]=>
  int(1)
  [0]=>
  string(8) "未赋值时"
}
array(2) {
  ["返回值"]=>
  bool(true)
  ["旧变新"]=>
  int(1)
}
array(1) {
  ["最后"]=>
  int(1)
}
array(3) {
  ["新值"]=>
  int(2)
  ["旧值"]=>
  int(1)
  [0]=>
  string(8) "未赋值时"
}
array(2) {
  ["返回值"]=>
  bool(true)
  ["旧变新"]=>
  int(2)
}
array(1) {
  ["最后"]=>
  int(2)

}

 

--------------测试代码改成新值为0时------------

<pre>
<?php
var_dump(array('返回值' => test($old = 1, $new = 0), '旧变新' => $old));
var_dump(array('最后' => $old));

$old = 1;$new = 0;
var_dump(array('返回值' => test($old , $new ), '旧变新' => $old));
var_dump(array('最后' => $old));
exit;
    
function test (& $old, $new) {
    var_dump(array('新值' => $new, '旧值' => $old, '未赋值时'));
    return $old = $new or var_dump(array('新值' => $new, '旧值' => $old, '赋值为false'));

}

---------------结果-----------

array(3) {
  ["新值"]=>
  int(0)
  ["旧值"]=>
  int(1)
  [0]=>
  string(8) "未赋值时"
}
array(3) {
  ["新值"]=>
  int(0)
  ["旧值"]=>
  int(0)
  [0]=>
  string(11) "赋值为false"
}
array(2) {
  ["返回值"]=>
  bool(false)
  ["旧变新"]=>
  int(1)
}
array(1) {
  ["最后"]=>
  int(1)
}
array(3) {
  ["新值"]=>
  int(0)
  ["旧值"]=>
  int(1)
  [0]=>
  string(8) "未赋值时"
}
array(3) {
  ["新值"]=>
  int(0)
  ["旧值"]=>
  int(0)
  [0]=>
  string(11) "赋值为false"
}
array(2) {
  ["返回值"]=>
  bool(false)
  ["旧变新"]=>
  int(0)
}
array(1) {
  ["最后"]=>
  int(0)
}

 

 

 

---------------------测试代码---------

<pre>
<?php
$gVar = 'aaaa';
var_dump(array('返回值' => test($old = 1, $new = 2, $gVar = & $gVar), '旧变新' => $old));
var_dump(array('最后' => $old));

$old = 1;$new = 2;
var_dump(array('返回值' => test($old , $new , $gVar), '旧变新' => $old));
var_dump(array('最后' => $old));
exit;
    
function test (& $old, $new, & $test) {
    global $gVar;
    var_dump(array( &$gVar, &$test ));
    var_dump(array('新值' => $new, '旧值' => $old, '未赋值时'));
    return $old = $new or var_dump(array('新值' => $new, '旧值' => $old, '赋值为false'));
}

------------结果(没搞明白有色部分怎么回事)--------------

array(2) {
  [0]=>
  &string(4) "aaaa"
  [1]=>
  &string(4) "aaaa"
}
array(3) {
  ["新值"]=>
  int(2)
  ["旧值"]=>
  int(1)
  [0]=>
  string(8) "未赋值时"
}
array(2) {
  ["返回值"]=>
  bool(true)
 ["旧变新"]=>
  int(1)
}
array(1) {
  ["最后"]=>
  int(1)
}
array(2) {
  [0]=>
  &string(4) "aaaa"
  [1]=>
  &string(4) "aaaa"
}
array(3) {
  ["新值"]=>
  int(2)
  ["旧值"]=>
  int(1)
  [0]=>
  string(8) "未赋值时"
}
array(2) {
  ["返回值"]=>
  bool(true)
 ["旧变新"]=>
  int(2)
}
array(1) {
  ["最后"]=>
  int(2)
}

----------------------分析-----------------

return 比 or 比=运算级都要低,基本相当整句都运算结束后才到它.

而=号比or的运算要高.

所以如果像以下情况,必须要分二行写:



function query($sql) {
    $sql = @mysql_query($sql) or die (tip('查询语句出错:' . mysql_error()));
    return $sql;
}

 

调用func时,funcName($var = 2);这种写法相当于复制传递?

猜了几次,测试都不对,这个问题有点怪.那天想到证实方法先.

<?php
    function f(& $var, & $isRefer){$var = rand(); $isRefer='kkkkk'; global $gVar;var_dump($gVar); var_dump(array('are they same?' => $isRefer === $gVar)); return $var;}
    $gVar = 'global var';
    echo f($var ="a_", $gVar = & $gVar).'<br/>'; /* outpu a random number */
    echo $var.'<br/>'; /*but don't change global variables, it still is "1<br/>", no the same like up line */
    echo f($var, $gVar).'<br/>'; /* outpu a random number */
    echo $var.'<br/>'; /* haved change, the same like up line */
    ?>

 

是把=式计算后的结果复制一份给func,但是复制应该是临时变量,所以& $var才不会提示出错.而不像string常量,下面是问答论坛中的讨论

 

http://stackoverflow.com/questions/8693068/why-echo-var-is-different

里面一位还误认为传递了bool值true;

原创粉丝点击