`

PHP在变量前面加&是什么意思

阅读更多

比如:
<? php

$a
= 'c' ;

$b = & $a ; //表示$b 和 $a 引用了同一个变量

$a = 'abc' ; //这里重置了$a

echo $b ; //将输出abc

unset( $a ); //取消引用

echo $b ; //这里仍输出 abc

$a = 'abcd' ;

echo
$b ; //因为已经取消引用 这里仍输出abc

?>

$a = &$b;


看手册第15章:

引用是什么
在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,它们是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身 - 变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的紧密连接。

引用做什么
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 指向的同一个内容。更多详细解释见引用传递。

引用做的第三件事是引用返回。


引用不是什么
如前所述,引用不是指针。这意味着下面的结构不会产生你预期的效果:


<?php
function foo (&$var)
{
$var =& $GLOBALS["baz"];
}
foo($bar);
?>



这将使 foo 函数中的 $var 变量在函数调用时和 $bar 绑定在一起,但接着又被重新绑定到了 $GLOBALS["baz"] 上面。不可能通过引用机制将 $bar 在函数调用范围内绑定到别的变量上面,因为在函数 foo 中并没有变量 $bar(它被表示为 $var,但是 $var 只有变量内容而没有调用符号表中的名字到值的绑定)。

引用传递
你可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。语法如下:


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

$a=5;
foo ($a);
// $a is 6 here
?>


注意在函数调用时没有引用符号 - 只有函数定义中有。光是函数定义就足够使参数通过引用来正确传递了。

以下内容可以通过引用传递:


变量,例如 foo($a)

New 语句,例如 foo(new foobar())

从函数中返回的引用,例如:


<?php
function &bar()
{
$a = 5;
return $a;
}
foo(bar());
?>


详细解释见引用返回。


任何其它表达式都不能通过引用传递,结果未定义。例如下面引用传递的例子是无效的:


<?php
function bar() // Note the missing &
{
$a = 5;
return $a;
}
foo(bar());

foo($a = 5) // 表达式,不是变量
foo(5) // 常量,不是变量
?>


这些条件是 PHP 4.0.4 以及以后版本有的。

引用返回
引用返回用在当你想用函数找到引用应该被绑定在哪一个变量上面时。当返回引用时,使用此语法:


<?php
function &find_var ($param)
{
/* ...code... */
return $found_var;
}

$foo =& find_var ($bar);
$foo->x = 2;
?>


本例中 find_var 函数所返回的对象的属性将被设定(译者:指的是 $foo->x = 2; 语句),而不是拷贝,就和没有用引用语法一样。

注: 和参数传递不同,这里必须在两个地方都用 & 符号 - 来指出返回的是一个引用,而不是通常的一个拷贝,同样也指出 $foo 是作为引用的绑定,而不是通常的赋值。

取消引用
当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:


<?php
$a = 1;
$b =& $a;
unset ($a);
?>


不会 unset $b,只是 $a。

再拿这个和 Unix 的 unlink 调用来类比一下可能有助于理解。

引用定位
许多 PHP 的语法结构是通过引用机制实现的,所以上述有关引用绑定的一切也都适用于这些结构。一些结构,例如引用传递和返回,已经在上面提到了。其它使用引用的结构有:

global 引用
当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:


<?php
$var =& $GLOBALS["var"];
?>



这意味着,例如,unset $var 不会 unset 全局变量。

$this
在一个对象的方法中,$this 永远是调用它的对象的引用。

分享到:
评论

相关推荐

    php中函数前加&符号的作用分解

    php变量前面加&符号是什么意思就不用多说了,大家都在用,就是两个变量同时指向一个地址而已,那么,php函数前面加&符号的意义又是什么呢?下面先上两个演示代码,然后再做解释。 function &chhua() { static $b=...

    php中引用&的用法分析【变量引用,函数引用,对象引用】

    在PHP 中引用的意思是:不同的名字访问同一个变量内容. 变量的引用 PHP 的引用允许你用两个变量来指向同一个内容 &lt;?php $a=ABC; $b =&$a; echo $a;//这里输出:ABC echo $b;//这里输出:ABC $b=EFG; echo $a;//...

    php也需要配置环境变量 解决Fatal error Call to undefined function curl_init()

    在PHP开发过程中,有时会遇到“Fatal error: Call to undefined function curl_init()”这样的错误提示,这通常是由于PHP的cURL扩展未正确安装或配置导致的。本文将深入讲解这个问题的解决方案,以及如何配置PHP环境...

    php 变量定义方法

    PHP 变量定义方法 PHP 变量定义方法是 PHP 编程语言中定义变量的各种方法...常量可以简单的通过指定其名字来取得常量的值,不要在常量前面加上 $ 符号。如果常量名是动态的,也可以用函数 constant() 来读取常量的值。

    PHP程序设计-3期(KC016) 拓展知识2-3 全局变量.doc

    非线程安全版本则使用我们在前面提到的`sample4_globals`结构体来声明和使用全局变量。理解并正确处理全局变量在不同环境下的声明和使用是PHP扩展开发中的重要环节,因为它关系到扩展在多线程和单线程环境下的兼容性...

    浅谈PHP变量作用域以及地址引用问题

    在PHP编程语言中,变量的作用域是指变量在代码中可被访问的范围。理解变量作用域对于编写高效、可维护的代码至关重要。本文将详细探讨PHP中的三种主要变量作用域:局部变量、全局变量和静态变量,同时也会涉及到变量...

    php学习心得 php初学者 php

    header already sent 这个错误通常会在使用 HEADER 时出现,可能是因为在使用 HEADER 前 PRING 或者 ECHO 了,或者当前文件前面有空行,或者 INCLUDE 了一个文件,该文件尾部有空行或者输出。 8. PHP.ini 修改后...

    PHP程序设计-3期(KC016) 3.8.1创建和使用类常见问题:成员变量和成员方法.docx

    在PHP中,定义成员方法需要使用`function`关键字,就像在示例2中所示,`fun1()`前面忘记添加`function`导致了错误。正确的代码应为`function fun1() { echo "this is a function!"; }`。成员方法可以访问类的成员...

    PHP中类属性与类静态变量的访问方法示例

    类静态变量需要在前面加上美元符号`$`来访问。 文档还提到了动态类名的使用情况,例如: ```php $str = 'test'; // echo $str::$staticvar; // 这将出错,不能使用变量来动态化类名 ``` 上述代码中,尝试通过变量...

    php:php5.dll

    检查文件路径和系统环境变量设置。 - **版本不兼容**:如果你的操作系统是64位,但安装了32位的php5.dll,会遇到错误。确保php5.dll与操作系统和PHP版本匹配。 - **依赖库缺失**:有时,php5.dll可能依赖于其他...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    在PHP手册中提到:"PHP不支持(也不需要)直接在声明变量时定义变量类型;变量类型将根据其被应用的情况决定。如果你为变量var赋值为一个字符串,那么它变成了一个字符串。如果你又为它赋了整数值,那么它就变成了...

    PHP语法练习题.pdf

    27. 在PHP中,要使用十六进制数,可以在前面加0x。 28. 在PHP中,将变量$paty转换为浮点型变量可以使用floatval()函数。 本资源摘要信息涵盖了PHP语言的基本语法、变量、常量、数据类型、注释符号等方面的知识点,...

    PHP动态网站开发任务-PHP语法基础.pptx

    常量的名称通常使用全部大写字母,前面不加美元符号。例如,可以使用define("PI", 3.1415926, TRUE);来定义一个大小写不敏感的常量PI。 3.1.5 PHP中的变量 PHP中的变量是松散的数据类型,可以存放任何类型的值。...

    php中static 静态变量和普通变量的区别

    在变量的前面加上static 就构成了静态变量(static 变量)。 static变量和普通变量的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而...

    php基础—变量的传值方式

    如果需要将值传递改变成引用传递,要在变量前面加上一个&符号,有此符号那么就是说明他就是引用传递。 引用赋值 和 传值赋值 我们先来看传值赋值: 注意:::: 以下的 变量符号(盗了)谐音 可能没有显示出 均为...

    JDK环境变量设置

    ### JDK环境变量设置详解 #### 一、JDK概述及下载安装 JDK(Java Development Kit),即Java开发工具包,是开发Java程序的基础。它包含了编译、调试和运行Java程序所需的所有工具。为了能够顺利地开发Java应用程序...

    php php_oci8_11g.dll php_oci8_11g.pdb

    在PHP编程中,Oracle数据库是常用的大型企业级数据存储系统,而PHP的OCI8扩展则提供了与Oracle数据库交互的功能。本文将深入探讨标题"php php_oci8_11g.dll php_oci8_11g.pdb"所涉及的知识点,以及如何在PHP环境中...

    php扩展 php_curl

    在Windows系统中,这些文件必须在系统的PATH环境变量所包含的目录下,或者与PHP可执行文件在同一目录下,才能确保PHP能够正确地加载并使用`php_curl`扩展。 **二、php_curl.dll** php_curl.dll是`php_curl`扩展的...

    PHP从入门到精通.docx

    在函数外部定义的变量是全局变量,而在函数内部定义的变量是局部变量。如果想在函数内部访问全局变量,需要使用 global 关键字来声明。 13. 静态变量:PHP 中的静态变量使用 static 关键字来定义。静态变量只能在...

Global site tag (gtag.js) - Google Analytics