发布网友 发布时间:2022-04-10 10:46
共4个回答
懂视网 时间:2022-04-10 15:07
Note:
如果具有引用的数组被拷贝,其值不会解除引用。对于数组传值给函数也是如此。
Note:
如果对一个未定义的变量进行引用赋值、引用参数传递或引用返回,则会自动创建该变量。
Example #1 对未定义的变量使用引用
<?php
function foo(&$var) { }
foo($a); // $a is "created" and assigned to null
$b = array();
foo($b[‘b‘]);
var_dump(array_key_exists(‘b‘, $b)); // bool(true)
$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, ‘d‘)); // bool(true)
?>
同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中(PHP 4.0.4 以及以后版本):
<?php
$bar =& new fooclass();
$foo =& find_var($bar);
?>
自 PHP 5 起,new 自动返回引用,因此在此使用 =& 已经过时了并且会产生 E_STRICT 级别的消息。
Note:
不用 & 运算符导致对象生成了一个拷贝。如果在类中用 $this,它将作用于该类当前的实例。没有用 & 的赋值将拷贝这个实例(例如对象)并且 $this将作用于这个拷贝上,这并不总是想要的结果。由于性能和内存消耗的问题,通常只想工作在一个实例上面。
尽管可以用 @ 运算符来抑制构造函数中的任何错误信息,例如用 @new,但用 &new 语句时这不起效果。这是 Zend 引擎的一个限制并且会导致一个解析错误。
Warning如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。
Example #2 在函数内引用全局变量
<?php
$var1 = "Example variable";
$var2 = "";
function global_references($use_globals)
{
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // visible only inside the function
} else {
$GLOBALS["var2"] =& $var1; // visible also in global context
}
}
global_references(false);
echo "var2 is set to ‘$var2‘
"; // var2 is set to ‘‘
global_references(true);
echo "var2 is set to ‘$var2‘
"; // var2 is set to ‘Example variable‘
?>
把 global $var; 当成是 $var =& $GLOBALS[‘var‘]; 的简写。从而将其它引用赋给 $var 只改变了本地变量的引用。
Note:
如果在 foreach 语句中给一个具有引用的变量赋值,被引用的对象也被改变。
Example #3 引用与 foreach 语句
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// do something
}
echo $ref; // 3 - last element of the iterated array
?>
引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量并且该变量在呼叫范围内引用了同一个内容来实现的。例如:
<?php
function foo(&$var)
{
$var++;
}
$a=5;
foo($a);
?>
将使 $a 变成 6。这是因为在 foo 函数中变量 $var 指向了和 $a 指向的同一个内容。更多详细解释见引用传递。
引用做的第三件事是引用返回。
数组引用的一个bug(后来仔细推敲,其实不是bug)
摘自:http://www.php.net/manual/zh/language.references.whatdo.php
It appears that references can have side-effects. Below are two examples. Both are simply copying one array to another. In the second example, a reference is made to a value in the first array before the copy. In the first example the value at index 0 points to two separate memory locations. In the second example, the value at index 0 points to the same memory location.
I won‘t say this is a bug, because I don‘t know what the designed behavior of PHP is, but I don‘t think ANY developers would expect this behavior, so look out.
An example of where this could cause problems is if you do an array copy in a script and expect on type of behavior, but then later add a reference to a value in the array earlier in the script, and then find that the array copy behavior has unexpectedly changed.
<?php输出:
before:// Example two
$arr3=array(1);
$a=&$arr3[0];
echo"
before:
";
echo"$a == $a
";
echo"$arr3[0] == {$arr3[0]}
";
$arr4=$arr3;
$arr4[0]++;
echo"
after:
";
echo"$a == $a
";
echo"$arr3[0] == {$arr3[0]}
";
echo"$arr4[0] == {$arr4[0]}
";
输出:
before:?>
分析说明:对于“Example two”,刚开始还以为是个bug,其实仔细推敲,非也,分析如下,
在赋值(拷贝)
$arr4=$arr3;之前,还有个对$arr3的第一个元素建立引用的过程,即
$a=&$arr3[0];所以在后来的赋值拷贝( $arr4=$arr3; ),会把这个引用一并拷贝过去,所以说
$a、$arr3[0]、$arr4[0] 三者其实是引用关系,指向同一个地方。
mysql引用并不是指针
标签:any link 处理 back rate 原因 工作 外部 对象
热心网友 时间:2022-04-10 12:15
引用与指针区别:引用只是取得数据,无权修改,句柄就是一种引用的方式;指针是直接指向内存的,可以修改数据的。热心网友 时间:2022-04-10 13:33
习惯问题……用const修饰,那么在你的函数体里就不可以对其进行更改,否则报错!这是为了使有些指针要想被其它函数调用,但又不希望由于失误被其它函数意外更改而设置的。如果你本意就是要做指针的更改,那当然就别加const了。热心网友 时间:2022-04-10 15:08
简单的说:就是为了安全,为了简便。。因为c++将面临大型程序,必须把安全放在第一位,否则一旦程序庞大到一定程度,如果因某个指针错误而造成的整个程序崩溃,哪怕差错都可能需要几天甚至几周时间了。。c++语言就是c语言走向高级语言的升级版。