首页 php教程 php手册 php变量引用与对象引用详解介绍

php变量引用与对象引用详解介绍

May 25, 2016 pm 04:49 PM
变量 对象 引用

文章总结了关于在php中如何来做变量引用及变量引用是什么东西?怎么来做,下面我们一一介绍php变量引用的用法吧。

引用做什么

PHP 的引用允许用两个变量来指向同一个内容,意思是,当这样做时,代码如下:

,这意味着 $a 和 $b 指向了同一个变量。 

$a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方.如果具有引用的数组被拷贝,其值不会解除引用,对于数组传值给函数也是如此,如果对一个未定义的变量进行引用赋值、引用参数传递或引用返回,则会自动创建该变量。

对未定义的变量使用引用,代码如下:

<?php
function foo(&$var) {
}
foo($a); // $a is "created" and assigned to null
$b = array();
foo($b[&#39;b&#39;]);
var_dump(array_key_exists(&#39;b&#39;, $b)); // bool(true)
$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, &#39;d&#39;)); // bool(true)

?>
登录后复制

同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中(PHP 4.0.4 以及以后版本),代码如下:

<?php
$bar = & new fooclass();
$foo = & find_var($bar);
?>
登录后复制

自 PHP 5 起,new 自动返回引用,因此在此使用 =& 已经过时了并且会产生 E_STRICT 级别的消息,不用 & 运算符导致对象生成了一个拷贝,如果在类中用 $this,它将作用于该类当前的实例,没有用 & 的赋值将拷贝这个实例(例如对象)并且 $this 将作用于这个拷贝上,这并不总是想要的结果,由于性能和内存消耗的问题,通常只想工作在一个实例上面。

尽管可以用 @ 运算符来抑制构造函数中的任何错误信息,例如用 @new,但用 &new 语句时这不起效果,这是 Zend 引擎的一个限制并且会导致一个解析错误。

PHP 的引用允许你用两个变量来指向同一个内容,代码如下:

<?php
$a = "ABC";
$b = & $a;
echo $a; //这里输出:ABC
echo $b; //这里输出:ABC
$b = "EFG";
echo $a; //这里$a的值变为EFG 所以输出EFG
echo $b; //这里输出EFG

?>
登录后复制

函数的传址调用,传址调用我就不多说了,下面直接给出代码:

<?php
function test(&$a) {
    $a = $a + 100;
}
$b = 1;
echo $b; //输出1
test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
echo "<br>";
echo $b; //输出101

?>
登录后复制

要注意的是,在这里test(1);的话就会出错,原因自己去想.

函数的引用返回,先看代码:

<?php
function &test() {
    static $b = 0; //申明一个静态变量
    $b = $b + 1;
    echo $b;
    return $b;
}
$a = test(); //这条语句会输出 $b的值 为1
$a = 5;
$a = test(); //这条语句会输出 $b的值 为2
$a = & test(); //这条语句会输出 $b的值 为3
$a = 5;
$a = test(); //这条语句会输出 $b的值 为6

?>
登录后复制

下面解释下,通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别,至于原因,这是PHP的规定.PHP规定通过$a=&test(); 方式得到的才是函数的引用返回,至于什么是引用返回呢,PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。

用上面的例子来解释就是

$a=test()方式调用函数,只是将函数的值赋给$a而已,而$a做任何改变,都不会影响到函数中的$b

而通过$a=&test()方式调用函数呢,他的作用是将return $b中的$b变量的内存地址与$a变量的内存地址指向了同一个地方,即产生了相当于这样的效果($a=&b;) 所以改变$a的值,也同时改变了$b的值,所以在执行了$a=&test();$a=5; 以后,$b的值变为了5

这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中.

对象的引用,代码如下:

<?php
class a {
    var $abc = "ABC";
}
$b = new a;
$c = $b;
echo $b->abc; //这里输出ABC
echo $c->abc; //这里输出ABC
$b->abc = "DEF";
echo $c->abc; //这里输出DEF

?>
登录后复制

以上代码是在PHP5中的运行效果,在PHP5中,对象的复制是通过引用来实现的,上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b;

PHP5中默认就是通过引用来调用对象,但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本,为了这样的目的,PHP定义了一个特殊的方法,称为__clone.

引用的作用

如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除.其它时候还是用php5的默认方式吧. 另外,php5中对于大数组的传递,建议用 "&" 方式,毕竟节省内存空间使用。

取消引用

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

<?php
$a = 1;
$b = & $a;
unset($a);
?>
登录后复制

不会 unset $b,只是 $a。

global 引用

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

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

$this

在一个对象的方法中,$this 永远是调用它的对象的引用,下面再来个小插曲

php中对于地址的指向(类似指针)功能 不是由用户自己来实现的,是由Zend 核心实现的,php中引用采用的"写时拷贝"的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

通俗的讲,

1:如果有下面的代码

$a="ABC";$b=$a;其实此时$a与$b都是指向同一内存地址,而并不是$a与$b占用不同的内存

2:如果在上面的代码基础上再加上如下代码

$a="EFG";由于$a与$b所指向的内存的数据 要重新写一次了,此时Zend核心会自动判断,自动为$b生成一个$a的数据拷贝,重新申请一块内存进行存储

如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。

在函数内引用全局变量,代码如下:

<?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 &#39;$var2&#39;n"; // var2 is set to &#39;&#39;
global_references(true);
echo "var2 is set to &#39;$var2&#39;n"; // var2 is set to &#39;Example variable&#39;

?>
登录后复制

把 global $var; 当成是 $var =& $GLOBALS['var'];的简写,从而将其它引用赋给 $var 只改变了本地变量的引用。

下在看一个面试题目,代码如下:

<?php
$a = 1;
$x = & $a;
$b = $a++;
?>
登录后复制

问: $b和$x的值分别是什么?php面试题的答案如下: 

$b = 1; $x = 2; 

你看看你算出不是多少呢,看你对面试引用和对象引用了解了多少呢。

本文地址:

转载随意,但请附上文章地址:-)

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1421
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
如何使用Ajax从PHP方法中获取变量? 如何使用Ajax从PHP方法中获取变量? Mar 09, 2024 pm 05:36 PM

使用Ajax从PHP方法中获取变量是Web开发中常见的场景,通过Ajax可以实现页面无需刷新即可动态获取数据。在本文中,将介绍如何使用Ajax从PHP方法中获取变量,并提供具体的代码示例。首先,我们需要编写一个PHP文件来处理Ajax请求,并返回所需的变量。下面是一个简单的PHP文件getData.php的示例代码:

Python 语法的思维导图:深入理解代码结构 Python 语法的思维导图:深入理解代码结构 Feb 21, 2024 am 09:00 AM

python凭借其简单易读的语法,广泛应用于广泛的领域中。掌握Python语法的基础结构至关重要,既可以提高编程效率,又能深入理解代码的运作方式。为此,本文提供了一个全面的思维导图,详细阐述了Python语法的各个方面。变量和数据类型变量是Python中用于存储数据的容器。思维导图展示了常见的Python数据类型,包括整数、浮点数、字符串、布尔值和列表。每个数据类型都有其自身的特性和操作方法。运算符运算符用于对数据类型执行各种操作。思维导图涵盖了Python中的不同运算符类型,例如算术运算符、比

如何将 MySQL 查询结果数组转换为对象? 如何将 MySQL 查询结果数组转换为对象? Apr 29, 2024 pm 01:09 PM

将MySQL查询结果数组转换为对象的方法如下:创建一个空对象数组。循环结果数组并为每一行创建一个新的对象。使用foreach循环将每一行的键值对赋给新对象的相应属性。将新对象添加到对象数组中。关闭数据库连接。

C++ 函数返回引用类型有什么好处? C++ 函数返回引用类型有什么好处? Apr 20, 2024 pm 09:12 PM

C++中的函数返回引用类型的好处包括:性能提升:引用传递避免了对象复制,从而节省了内存和时间。直接修改:调用方可以直接修改返回的引用对象,而无需重新赋值。代码简洁:引用传递简化了代码,无需额外的赋值操作。

什么是Java中的实例变量 什么是Java中的实例变量 Feb 19, 2024 pm 07:55 PM

Java中的实例变量是指定义在类中,而不是方法或构造函数中的变量。实例变量也称为成员变量,每个类的实例都有自己的一份实例变量副本。实例变量在创建对象的过程中被初始化,以及在对象的生命周期中保存并保持其状态。实例变量的定义通常放在类的顶部,可以用任何访问修饰符来声明,可以是public、private、protected或默认访问修饰符。这取决于我们希望这个变

如何使用 C++ 引用和指针传参? 如何使用 C++ 引用和指针传参? Apr 12, 2024 pm 10:21 PM

C++中引用和指针都是传递函数参数的方法,但有区别。引用是变量的别名,修改引用会修改原始变量,而指针存储变量的地址,修改指针值不会修改原始变量。在选择使用引用还是指针时,需要考虑是否需要修改原始变量、是否需要传递空值和性能考虑等因素。

深入理解C语言中的const 深入理解C语言中的const Feb 18, 2024 pm 12:56 PM

C中const的详解及代码示例在C语言中,const关键字用于定义常量,表示该变量的值在程序执行过程中不能被修改。const关键字可以用于修饰变量、函数参数以及函数返回值。本文将对C语言中const关键字的使用进行详细解析,并提供具体的代码示例。const修饰变量当const用于修饰变量时,表示该变量为只读变量,一旦赋值就不能再修改。例如:constint

jQuery使用实践:判断变量是否为空的几种方式 jQuery使用实践:判断变量是否为空的几种方式 Feb 27, 2024 pm 04:12 PM

jQuery是一个广泛应用于Web开发中的JavaScript库,它提供了许多简洁方便的方法来操作网页元素和处理事件。在实际开发中,经常会遇到需要判断变量是否为空的情况。本文将介绍使用jQuery判断变量是否为空的几种常用方法,并附上具体的代码示例。方法一:使用if语句判断varstr="";if(str){co

See all articles