文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档> &func 调用与 func 调用的差别

&func 调用与 func 调用的差别

时间:2010-09-09  来源:黑色阳光_cu

一般情况下,函数调用时,@_会先被局部化,只有一种情况下不会,就是用&方式调用又没有提供参数列表时:
  1. sub func
  2. {
  3.         warn \@_;
  4. }

  5. @_ = (1, 2, 3);
  6. warn \@_;
  7. print "\n";

  8. func();
  9. func;
  10. &func();
  11. &func;
所以,&func 能访问到外部的@_,也能修改。&func 类似于 &func(@_) 又不全等。猜测 &func 是老式的调用风格,为了和原来的行为一致,不提供参数列表就用@_,所以不局部化@_,不给@_绑定新值。

而在函数里,假定@_被重新赋值的话:
  1. sub func
  2. {
  3.         warn \$_[0];
  4.         @_ = (4, 5, 6);
  5.         #($_[0], $_[1], $_[2]) = (4, 5, 6);
  6.         warn \$_[0];
  7. }

  8. func(1, 2, 3);
$_[0]相当于常量1的别名,修改$_[0]等于修改常量1,
$_[1]相当于常量2的别名,修改$_[1]等于修改常量2,
$_[2]相当于常量3的别名,修改$_[2]等于修改常量3,

那 @_ = (4, 5, 6)
相当于   ($_[0], $_[1], $_[2]) = (4, 5, 6) ?
等于修改常量的值?

不,当@_被重新赋值时,@_会先被清空。所以,@_ = (4, 5, 6) 不会引起问题,不会修改实参的值。而 ($_[0], $_[1], $_[2]) = (4, 5, 6) 可以修改实参的值,假如是实参是常量的话,引起语法错。
相关阅读 更多 +
排行榜 更多 +
谷歌卫星地图免费版下载

谷歌卫星地图免费版下载

生活实用 下载
谷歌卫星地图免费版下载

谷歌卫星地图免费版下载

生活实用 下载
kingsofpool官方正版下载

kingsofpool官方正版下载

赛车竞速 下载