background image

php 函数或变量名前面加@或者&

  以前就看见过函数前加@运算符的,也考虑过它的作用,但是就是没记住,现在记

下来以后好回顾,也给有相同疑问的朋友看看!

@ 运算符只对表达式有效。对新手来说一个简单的规则就是:如果能从某处得到值,

 

就能在它前面加上 @ 

 

运算符。例如,可以把它放在变量,函数和 include() 调用,常量,

 

等等之前。不能把它放在函数或类的定义之前,也不能用于条件结构例如 if   

和 foreach 

等。

目前的 @”错误控制运算符前缀甚至使导致脚本终止的严重错误的错误报告也失效。

这意味着如果在某个不存在或类型错误的函数调用前用了 @”来抑制错误信息,那脚本
会没有任何迹象显示原因而死在那里。

 

简单来说就是抑制该语句输出错误,有些错误不能让用户看到 就在前面加@

比如:@mysql_connect(...);
在 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 引擎的一个限制并且会导致一个解析错误.

引用做的第二件事是用引用传递变量.这是通过在函数内建立一个本地变量并且该变

量在呼叫范围内引用了同一个内容来实现的.例如: