Chinaunix

标题: [引用] 函数前加一个&是什么意思? [打印本页]

作者: imbiss    时间: 2005-09-10 18:04
标题: [引用] 函数前加一个&是什么意思?
比如
&funtion myfunction (){
    /*  ........... */

}
&不是代表变量的引用吗?
放在函数前面有代表什么呢?
难道代表返回一个返回值的引用? 糊涂了.
望高人指点.
谢谢.
作者: HonestQiao    时间: 2005-09-10 18:12
标题: [引用] 函数前加一个&是什么意思?
http://w.yi.org/ftp/FAPM/PHP/php_manual_zh/language.references.whatdo.html

但是奉劝你,最好先把手册通读一下子。



引用做什么
PHP 的引用允许你用两个变量来指向同一个内容。意思是,当你这样做时:


<?php
$a =& $b
?>;  


这意味着 $a 和 $b 指向了同一个变量。
注: $a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方。


同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中(PHP 4.0.4 以及以后版本):


<?php
$bar =& new fooclass();
$foo =& find_var ($bar);
?>;  



注: 不用 & 运算符导致对象生成了一个拷贝。如果你在类中用 $this,它将作用于该类当前的实例。没有用 & 的赋值将拷贝这个实例(例如对象)并且 $this 将作用于这个拷贝上,这并不总是想要的结果。由于性能和内存消耗的问题,通常你只想工作在一个实例上面。

尽管你可以用 @ 运算符来关闭构造函数中的任何错误信息,例如用 @new,但用 &new 语句时这不起效果。这是 Zend 引擎的一个限制并且会导致一个解析错误。

引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量并且该变量在呼叫范围内引用了同一个内容来实现的。例如:


<?php
function foo (&$var)
{
    $var++;
}

$a=5;
foo ($a);
?>;  


将使 $a 变成 6。这是因为在 foo 函数中变量 $var 指向了和 $a 指向的同一个内容。更多详细解释见引用传递。

引用做的第三件事是引用返回。
作者: imbiss    时间: 2005-09-10 19:35
标题: [引用] 函数前加一个&是什么意思?
的确手册上写了,可是还是不明白
手册说

  1. 同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中(PHP 4.0.4 以及以后版本):
  2. <?php
  3. $bar =& new fooclass();
  4. $foo =& find_var ($bar);
  5. ?>;   
复制代码

这里是不是说foo就是一个find_var的返回值的引用?
但是如果这个函数没有返回值呢?
在实际中,这样写又有什么用呢?能不能举个例子。谢谢。
作者: HonestQiao    时间: 2005-09-10 19:42
标题: [引用] 函数前加一个&是什么意思?
如果不用&,那么会在内存生成一个fooclass或者find_var的实例

如果使用,那么直接使用他们在内存的实例定义。

你最好把
http://w.yi.org/ftp/FAPM/PHP/php_manual_zh/language.references.html#language.references.whatare

这个多看清楚一些,包括这个的所有内容。

关于实例,你可以去研究研究C++的相关资料。
作者: hightman    时间: 2005-09-10 19:45
标题: [引用] 函数前加一个&是什么意思?
原帖由 "imbiss" 发表:
这里是不是说foo就是一个find_var的返回值的引用?
但是如果这个函数没有返回值呢?
在实际中,这样写又有什么用呢?能不能举个例子。谢谢。


这个东西没必要深究的, 或许只是对PHP引擎有作用.

对PHP程序员来说没多大区别; 当你的函数返回值是一很长的字串, 这时你可以试用 $xx = &foo(); 以免产生"拷贝", 过多的开销; 同时 foo 函数的定义也必须是 function &foo () { ... }

PHP语法器的包容度很大, 没有返回值的函数你用 &foo() 也不会有什么错误, 类似的例子(看似有误实不报错)很多啊




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2