您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

PHP引用传递与引用&一些用法介绍_PHP教程

2025/1/14 8:55:23发布12次查看
在php中引用是使用&来做,下面我来给大家介绍在php引用一些用法与引用问题与事项实例,欢迎各位朋友进入参考。
引用是什么
在 php 中引用意味着用不同的名字访问同一个变量内容。这并不像 c 的指针,替代的是,引用是符号表别名。注意在 php 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 unix 文件系统中的 hardlink。
引用做什么
php 的引用允许用两个变量来指向同一个内容。
当 $a =& $b; 时 $a 和 $b 指向了同一个变量。
提示:$a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方。
可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。语法如下:
 代码如下 复制代码
function foo(&$var)
{
    $var++;
}
$a=5;
foo($a);
echo $a;
// 输出的是:6
php引用符&
关于php的引用(就是在变量或者函数、对象等前面加上&符号)的作用,我们先看下面这个程序。
 代码如下 复制代码
程序运行结果:
100
100
101
101
很多人误解php中的引用跟c当中的指针一样,事实上并非如此,而且很大差别。c语言中的指针除了在数组传递过程中不用显式申明外,其他都需要使用*进行定义,而php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。
php默认为传值传递:
 代码如下 复制代码
程序运行结果:
30 and 20
要是想变为地址传递需要加&,既:
 代码如下 复制代码
程序运行结果:
就是说,&把$a的地址传给了$b,这样的话这两个变量现在共享一个内存的存储区域,就是说它们的值是一样的。
同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中:
 代码如下 复制代码
view sourceprint?
1
引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量,并且该变量在呼叫范围内引用了同一个内容来实现的。说的通俗点就是一个函数的参数是一个本地变量的引用。下面再举例说明一下:
 代码如下 复制代码
运行这段代码是给函数传递两个参数,一个是引用$a的内容,一个是$b的值,在执行此函数后,发现$a的内容改变了,而$b的内容则没有变化。
php引用以及误区
php中的引用可以理解成变量的别名。由于php的变量名是存储在符号表(symbol table)中的,变量内容是存储在堆中,引用就是用符号表中的不同符号(symbol)名称来访问同一存储内容,和unix文件系统中的hardlink是同一个概念,比如:
 代码如下 复制代码
$a = 1;
$b = &$a; //$a与$b指向同一内容
$b = 2;
echo $b; //2
echo $a; //2
传递引用
引用传递很简单,就是一个「&」符号,比如:
getvalue(); // 还需要一个&,$myvalue是对class foo中的$value的引用
$obj->value = 2;              // 修改对象的$value属性
echo $myvalue;                // 输出2,$myvalue与class foo中的$value值相同
与指针的区别
引用与指针很像,但是其并不是指针,看如下的代码:
 代码如下 复制代码
| 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输出的内容应该一样,事实上结果并非如此。 看下面通过引用传递对象的列子:
 代码如下 复制代码
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三者内容完全一样,所以可以看出对象并不是按照引用传递,要尽快走出这个误区。
http://www.bkjia.com/phpjc/628637.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/628637.htmltecharticle在php中引用是使用mdash;变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 unix 文件系统中的 hardlink。 引用做什么 php 的引用...
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product