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;
<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;
相关文章推荐
- <?php echo "<script language=javascript>alert('".$var['id']."!');</script>"; ?>
- 与'>以及DataBinder.Eval(Container, DataItem,"id")的区别
- php中::和->,self和this的区别
- PHP和JS中""和''的区别
- PHP中global与$GLOBALS['']区别
- PHP中调用类方法时->和::的区别
- PHP中::、->、self、$this几种操作符的区别介绍
- return null 与return new List<HaierPageView>()的区别
- 如果你 <?php ?>好使 但 <? ?> 就不好使,其实是php.ini中的一个参数问题
- PHP $_SERVER['SCRIPT_FILENAME'] 与 __FILE__ 的区别
- php 对象用&传递参数 与 对象用作普通参数的区别
- PHP中::、->、self、$this操作符的区别
- PHP中global与$GLOBALS['']区别
- 【未解决】php 中 '' "" null empty的区别
- 获取PHP文件绝对地址$_SERVER['SCRIPT_FILENAME'] 与 __FILE__ 的区别
- PHP中::、->、self、$this操作符的区别
- PHP基础学习:'=='和'==='的使用方法与区别
- $_SERVER['PHP_SELF']和$_SERVER['SCRIPT_NAME']区别
- LinkButton->OnCommand、OnClientClick="javascript:return confirm('确定删除吗?')"、href="javascript:void(0)"