函数前加 & 的问题

ycnxz 2011-04-07 03:21:24
1.不太清楚函数前加&什么意思,知道变量前加&说明该变量是引用变量,那函数前加什么意思。应该是和地址引用有关系的,但谁能详细说说啊。
2.看一些代码比如有个函数如下

function &drupal_static($name, $default_value = NULL, $reset = FALSE) {
……
}

那么在其他地方用到此函数一般都是加了&的,例如

$directory = &drupal_static(__FUNCTION__, '');


但是有些地方也有没加了&的,例如:

function drupal_static_reset($name = NULL) {
drupal_static($name, NULL, TRUE);
}

这&怎么可以又加又不加,加了和没加的区别谁能详细说说?
...全文
489 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycnxz 2011-04-10
  • 打赏
  • 举报
回复
哦 错了 不是清空 是重置
ycnxz 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hnxxwyq 的回复:]

function &fun() {
}

// 相当于, 仅做比喻,不能使用

function fun() {
return &$result;
}

也就是说(function)加不加&,仅对返回结果有作用

你说的2个例子:

$directory = &drupal_static(__FUNCTION__, '');

……
[/Quote]

我觉得

function drupal_static_reset($name = NULL) {
drupal_static($name, NULL, TRUE);
}

这段代码的作用是清空 没看见函数名里有个reset么
ycnxz 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lgg201 的回复:]

首先说变量的名称空间, 名称空间有全局名称空间, 局部名称空间(函数内部/方法内部), 所谓名称空间, 就是存放名字的地方, 就是一个符号表, 你可以想象, 有很多数组, 专门用来存放自己作用域中的名字.

每个名称空间是相互隔离的, 它们各自维护一个符号表用来保存自己作用域中的名称(变量名)

变量是由名字和值组成的. 上面的名称空间中保存了变量的名字, 变量的值有两种类型, 一种是直……
[/Quote]

多谢了哥们,结贴,嘿嘿。
goosman 2011-04-10
  • 打赏
  • 举报
回复
首先说变量的名称空间, 名称空间有全局名称空间, 局部名称空间(函数内部/方法内部), 所谓名称空间, 就是存放名字的地方, 就是一个符号表, 你可以想象, 有很多数组, 专门用来存放自己作用域中的名字.

每个名称空间是相互隔离的, 它们各自维护一个符号表用来保存自己作用域中的名称(变量名)

变量是由名字和值组成的. 上面的名称空间中保存了变量的名字, 变量的值有两种类型, 一种是直接的值, 另外一种是对其他变量的引用.

按照楼主的意思, 应该是明白引用的含义的, 不再赘述.

php中引用的用法:
1. 变量的引用赋值: $a = &$b
2. 函数调用时的引用参数传递
1) 早期php是在调用时通过&符号传递引用类型的变量, 比如: func(&$arg);
2) 后来, 函数的引用类型参数被规定为需要在函数声明时定义, 不如: function func(&$arg);
注: 引用声明时定义引用类型参数后, 运行时引用参数传递被废弃, 需要在php.ini中增加allow_call_time_pass_reference来开启.
3. 函数返回引用类型, 这种应用方式需要声明函数时, 在函数名前增加&符号, 并且, 在调用时, 要用引用赋值方式, 比如:
function &func() {
return $a;
}
$a = func(); //这种调用方式得到的不是引用传值
$a =& func(); //这样调用才是引用传值

简而言之, 就是让函数的返回一个引用类型的值, 一个更实际的例子:
$a = 1;
function &func(&$a) {
return $a;
}
$b = func($a);
$c =& func($a);
$b = 2;
echo "a: $a, b: $b, c: $c. <br />\n";
//输出a: 1, b: 2, c: 1.
//可见对$b的修改不会影响$a
$c = 3;
echo "a: $a, b: $b, c: $c. <br />\n";
//输出a: 3, b: 2, c: 3.
//可见对$c的修改会影响$a

4. global和static两个关键字
1) global用来声明函数内部要使用一个全局变量, 其实这里隐式的创建了一个引用, 比如, global $a;就是在本地名称空间中创建一个名字a, 让它指向全局空间中$a变量的值.
2) static关键字也是隐式创建了一个引用, 这里谈的static是指在函数内部声明静态变量的用法, 比如
function func() {
static $a = 1;
echo $a ++ . ", ";
}
while($a ++ < 10) func();
//输出结果: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,

这种用法会在一次请求(就是php一次完整的解释执行)过程中, 该变量只会被初始化一次, 每次函数调用结束后, 函数内的静态变量不会被销毁(而其他的局部变量会被销毁), 下一次函数调用时, 又重复利用上一次处理后的结果.
lazyboy_wu 2011-04-07
  • 打赏
  • 举报
回复
function &fun() {
}

// 相当于, 仅做比喻,不能使用

function fun() {
return &$result;
}

也就是说(function)加不加&,仅对返回结果有作用

你说的2个例子:

$directory = &drupal_static(__FUNCTION__, '');

function drupal_static_reset($name = NULL) {
drupal_static($name, NULL, TRUE);
}

前一个是赋值,加不加其实都是一样引用的,标准是要提倡使用显时声明

而后一个本身就仅仅运算,要什么&,给谁引用?


测试代码


<?php

$foo = 'foo';

function &foo() {
return $GLOBALS['foo'];
}

// 不提倡,要显时声明为引用
$foo1 = foo();
// 正确格式
$foo2 = &foo();

// 虽然可以用
var_dump($foo1 === $foo2);

// 正确调用
foo();

// 语法错误
&foo();





Akuma XYD 2011-04-07
  • 打赏
  • 举报
回复
在函数前加&表示 引用函数返回的那个对象
fxs_2008 2011-04-07
  • 打赏
  • 举报
回复
手册,仔细看,仔细测
小在在 2011-04-07
  • 打赏
  • 举报
回复
请看下面例子:
$a='abc';
$a1=&$a;
$a2=$a;
echo $a.$a1.$a2; // 此时三个都是 'abc'
$a1='123';
echo $a.$a1.$a2; // 此时$a,$a1 是 '123',而$a2是 'abc';
取地址操作符就是让两个变量指向同一个地址,改变其中哪一个都会直接的改变这个值
榕树花园 2011-04-07
  • 打赏
  • 举报
回复
加&就是地址引用,就这么简单,反正我是这样理解的
jiangsq12345 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 snmr_com 的回复:]

从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符 & :

引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。

在你的例子中,其实就是对$directory的一个声明,表示它的值从哪里来

一般在后面的程序代码,$directory会随这个绑定的函数变化而变化,但不会另外赋值

就是后面不会再出现类似 $directory="c:\……
[/Quote]
+1
ImN1 2011-04-07
  • 打赏
  • 举报
回复
请看手册“引用的解释 - 引用返回”一节,上面说了对函数返回的引用不同于对变量的引用
ycnxz 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jiangsq12345 的回复:]

引用 1 楼 snmr_com 的回复:

从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符 &amp; :

引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。

在你的例子中,其实就是对$directory的一个声明,表示它的值从哪里来

一般在后面的程序代码,$directory会随这个绑定的函数变化而变化,但不会另外赋值

……
[/Quote]

我觉得不是这样哦 这个解释至少不全面
ImN1 2011-04-07
  • 打赏
  • 举报
回复
从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符 & :

引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。

在你的例子中,其实就是对$directory的一个声明,表示它的值从哪里来

一般在后面的程序代码,$directory会随这个绑定的函数变化而变化,但不会另外赋值

就是后面不会再出现类似 $directory="c:\abc" 这样的赋值

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧