您的位置:首页 > 编程语言 > PHP开发

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

2013-04-09 21:09 288 查看
/*------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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: