在php中我们常看到在在php变量前面加个&符号,这个即是php中引证符号了,它可以用于各种变量、函数、目标了下面我来给各位详细介绍php&符号用法.在 PHP 中引证意味着用不相同的名字访问同一个变量内容.这并不像 C 的指针,它们是符号表别号.注意在 PHP 中,变量名和变量内容是不相同的,因而相同的内容可以有不相同的名字.PHP的引证是经过在变量名或者函数名前加&符号来实现的.下面解释一下引证的几种用法:
先来看官办法的说明:
引证做什么
PHP 的引证允许用两个变量来指向同一个内容.意思是,当这样做时:
$a =& $b;
?>
这意味着 $a 和 $b 指向了同一个变量.
Note:
$a 和 $b 在这里是彻底相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个当地.
Note:
如果具有引证的数组被复制,其值不会解除引证.对于数组传值给函数也是如此.
Note:
如果对一个未界说的变量进行引证赋值、引证参数传递或引证回来,则会主动创建该变量.Example #1 对未界说的变量运用引证:
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 以及以后版别)
$bar =& new fooclass();
$foo =& find_var($bar);
?>
自 PHP 5 起,new 主动回来引证,因而在此运用 =& 现已过期了并且会发生 E_STRICT 等级的音讯.
Note:
不用 & 运算符致使目标生成了一个复制.如果在类中用 $this,它将作用于该类当时的实例.没有用 & 的赋值将复制这个实例(例如目标)并且 $this 将作用于这个复制上,这并不总是想要的结果.因为性能和内存耗费的问题,一般只想工作在一个实例上面.尽管可以用 @ 运算符来抑制构造函数中的任何错误信息,例如用 @new,但用 &new 句子时这不起效果.这是 Zend 引擎的一个约束并且会致使一个解析错误.
首先是变量的简单引证,允许你用两个变量来指向同一个内容,举个简单的比如:
$a = 5;
$b = &$a;
echo $b;
$a++;
echo $b;
?>
运转这段代码是让$b来引证$a的内容,然后改动$a的内容,$b的内容也会随之变化.相同的语法可以用在函数中,它回来引证,以及用在new 运算符中:
$bar =& new fooclass();
$foo =& find_var ($bar);
?>
引证做的第二件事是用引证传递变量.这是经过在函数内建立一个本地变量,并且该变量在呼叫范围内引证了同一个内容来实现的.
说的通俗点即是一个函数的参数是一个本地变量的引证.下面再举例说明一下:
function foo(&$val1, $val2) {
$val1 += 1;
$val2 += 1;
}
$a=5;
$b=10;
foo($a,$b);
echo $a;
echo $b;
?>
运转这段代码是给函数传递两个参数,一个是引证$a的内容,一个是$b的值,在执行此函数后,发现$a的内容改动了,而$b的内容则没有变化.PHP引证的第三个用法是引证回来,这个用法了解起来有点难度,引证回来用在当你想用函数找到引证应该被绑定在哪一个变量上面时.当回来引证时,运用此语法:说的简单点,就还是引证函数的回来.但和参数传递不相同,必须在函数界说和函数引证这两个当地都用 & 符号.下面举个比如:
function &find_var ($param)
{
/* ...code... */
return $found_var;
}
$foo =& find_var ($bar);
$foo->x = 2;
?>
这个比如给$foo 赋值是函数find_var的回来引证,所以在给$foo->x赋值时即是给find_var的回来引证赋值,而不是简单的赋值.PHP引证的最后一个用法是引证定位,主要有两个应用:一个是global 引证,当用 global $var 声明一个变量时实际上建立了一个到全局变量的引证.也即是和$var =& $GLOBALS["var"];是相同的.别的一个是$this的用法,在一个目标的办法中,$this 永远是调用它的目标的引证.与指针的差异引证与指针很像,可是其并不是指针.
看如下的代码:
$a = 0;
$b = &a;
echo $a; //0
unset($b);
echo $a; //0
因为$b只是$a的别号,所以即使$b被释放了,$a没有任何影响,可是指针可不是这样的.
看如下代码:
#include
int main(int argc, char const *argv[]) {
int a = 0;
int* b = &a;
printf("%in", a); //0
free(b);
printf("%in", a); //*** error for object 0x7fff6350da08:
pointer being freed was not allocated
}
因为b是指向a的指针,所以释放了b的内存之后,再访问a就会出现错误,比较显着的说明晰PHP引证与C指针的差异.
目标与引证
在PHP中运用目标的时候,大家总是被告知"目标是依照引证传递的",其实这是个误区.PHP的目标变量存储的是此目标的一个标示符,在传递目标的时候,其实传递的即是这个标示符,而并不是引证.
看如下代码:
$a = new A;
$b = $a;
$b->testA = 2;
/*
* 此刻$a,$b的联系:
* +-----------+ +-----------------+
* $a --> | object id | ---> | object(Class A) |
* +-----------+ +-----------------+
* ^
* +-----------+ |
* $b --> | object id | ---------+
* +-----------+
*
*
*/
$c = new B;
$a = $c;
$a->testB = "Changed Class B";
/*
* 此刻$a,$b,$c的联系:
* +-----------+ +-----------------+
* $b --> | object id | ---> | object(Class A) |
* +-----------+ +-----------------+
*
* +------------+
* $a --> | object id2 | -------------+
* +------------+ |
* v
* +------------+ +-----------------+
* $c --> | object id2 | ---> | object(Class B) |
* +------------+ +-----------------+
*/
echo "object a: "; var_dump($a); //["testB"]=> string(15)
"Changed Class B"
echo "object b: "; var_dump($b); //["testA"] => int(2)
echo "object c: "; var_dump($c); //["testB"]=> string(15)
"Changed Class B"
如果目标是依照引证传递的,那么$a,$b, $c输出的内容应该相同,事实上结果并非如此.看下面经过引证传递目标的列子:
$aa = new A;
$bb = &$aa; // 引证
$bb->testA = 2;
/*
* 此刻$aa, $bb的联系:
*
* +-----------+ +-----------------+
* $bb --> | object id | ---> | object(Class A) |
* +-----------+ +-----------------+
* ^
* |
* $aa ---------+
*
*
*/
$cc = new B;
$aa = $cc;
$aa->testB = "Changed Class B";
/*
* 此刻$aa, $bb, $cc的联系:
*
* +-----------+ +-----------------+
* | object id | ---> | object(Class A) |
* +-----------+ +-----------------+
*
* $bb ---->-----+
* |
* $aa ---->-----+
* |
* v
* +------------+
* | object id2 | --------------+
* +------------+ |
* v
* +------------+ +-----------------+
* $cc --> | object id2 | ---> | object(Class B) |
* +------------+ +-----------------+
*/
echo "object aa: "; var_dump($aa); //["testB"]=>string(15)
"Changed Class B"
echo "object bb: "; var_dump($bb); //["testB"]=>string(15)
"Changed Class B"
echo "object cc: "; var_dump($cc); //["testB"]=>string(15)
"Changed Class B"
此刻$aa,$bb,$cc三者内容彻底相同,所以可以看出目标并不是依照引证传递,要尽快走出这个误区.
(责任编辑:最模板) |