图文解析PHP对象的赋值操作是“传值”还是“传址”

简介: 通过本文,我们一起分享了在PHP中对象的赋值操作,传递的是对象地址,而不是复制对象。PHP中可以使用clone操作符来复制对象。

我们知道,变量默认总是传值赋值。也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量。这意味着,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。


举个简单例子:


1
2
3
4
5
6
7
8
<?php 
$a  'hello world' ;
$b  $a ;
$a  'bey world' ;
 
var_dump( $a );
var_dump( $b );
?>


此时的$b = $a,在内存中的存贮大致是这样子的:

001.png


但是当一个对象被实例化后,对象的传递并非传值,而是传递该对象的地址。也就是说,不会复制整个对象,因为这样做既耗时又耗内存。

同样举个简单例子:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class  Person
{
     public  $name ;
     public  $age ;
}
 
$a  new  Person();
$b  $a ;
$c  = & $a ;
$a ->name =  'gavin' ;
$a  = null;
 
var_dump( $b );
var_dump( $a );
var_dump( $c );


执行结果:


object(Person)#1 (2) { ["name"]=> string(5) "gavin" ["age"]=> NULL } 
NULL 
NULL


上面例子中变量的操作过程大致如下:


$b = $a;
$c =& $a;


当把一个对象实例赋给一个新变量时,新变量会访问同一个实例。

引用赋值(&)意味着新的变量引用了原始变量,换言之,成为其"别名" 或者 "指向"。改动新的变量将影响到原始变量,反之亦然。


002.png


$a = null;


003.png


也许你会问,既然直接赋值不是复制对象,那如何才能复制对象呢?PHP里克隆复制对象使用clone操作符:


1
2
$f  new  Person();
$b  clone  $f //创建一个对象副本


小结


1Q2Ph6Om5UzKFF.gif
目录
相关文章
|
13天前
|
缓存 安全 PHP
【PHP开发专栏】Symfony框架核心组件解析
【4月更文挑战第30天】本文介绍了Symfony框架,一个模块化且高性能的PHP框架,以其可扩展性和灵活性备受开发者青睐。文章分为三部分,首先概述了Symfony的历史、特点和版本。接着,详细解析了HttpFoundation(处理HTTP请求和响应)、Routing(映射HTTP请求到控制器)、DependencyInjection(管理依赖关系)、EventDispatcher(实现事件驱动编程)以及Security(处理安全和认证)等核心组件。
|
21天前
|
SQL 存储 数据库
数据库开发表操作案例的详细解析
数据库开发表操作案例的详细解析
10 0
|
21天前
|
SQL 存储 关系型数据库
数据库开发之图形化工具以及表操作的详细解析
数据库开发之图形化工具以及表操作的详细解析
33 0
|
3天前
|
XML JavaScript 数据格式
Beautiful Soup 库的工作原理基于解析器和 DOM(文档对象模型)树的概念
Beautiful Soup 使用解析器(如 html.parser, lxml, html5lib)解析HTML/XML文档,构建DOM树。它提供方法查询和操作DOM,如find(), find_all()查找元素,get_text(), get()提取信息。还能修改DOM,添加、修改或删除元素,并通过prettify()输出格式化字符串。它是处理网页数据的利器,尤其在处理不规则结构时。
7 2
|
13天前
|
PHP 开发者
深入解析PHP的命名空间与自动加载机制
【4月更文挑战第30天】 在现代PHP开发实践中,命名空间和自动加载机制是模块化和代码复用的关键。本文旨在提供一个全面的视角来理解这两个概念如何协同工作以优化项目结构。我们将探讨命名空间解决代码冲突的方式,以及自动加载机制如何智能地按需加载类,从而减少内存占用和提升性能。
|
13天前
|
PHP 开发者
PHP中的命名空间深入解析
【4月更文挑战第30天】在PHP的编程世界中,命名空间是一个强大而灵活的工具,用于解决代码中的名称冲突问题。本文将深入探讨PHP命名空间的核心概念、实现原理以及在实际开发中的应用技巧,帮助开发者更好地理解和运用这一特性,提升代码的可维护性和复用性。
|
13天前
|
存储 数据库连接 PHP
【PHP开发专栏】深入解析PHP数据类型与运算符
【4月更文挑战第30天】本文深入探讨了PHP的编程基础——数据类型和运算符。PHP支持整型、浮点型、字符串、布尔型、数组、对象、资源等数据类型。运算符包括算术、字符串、赋值、比较、逻辑、位、错误控制及范围运算符。通过示例展示了如何计算圆面积、判断素数和求斐波那契数列,以帮助读者更好地理解和应用这些概念。
|
14天前
|
前端开发 JavaScript 数据安全/隐私保护
前端javascript的DOM对象操作技巧,全场景解析(二)
前端javascript的DOM对象操作技巧,全场景解析(二)
|
14天前
|
移动开发 缓存 JavaScript
前端javascript的DOM对象操作技巧,全场景解析(一)
前端javascript的DOM对象操作技巧,全场景解析(一)
|
14天前
|
设计模式 算法 搜索推荐
【PHP开发专栏】PHP设计模式解析与实践
【4月更文挑战第29天】本文介绍了设计模式在PHP开发中的应用,包括创建型(如单例、工厂模式)、结构型和行为型模式(如观察者、策略模式)。通过示例展示了如何在PHP中实现这些模式,强调了它们在提升代码可维护性和可扩展性方面的作用。设计模式是解决常见问题的最佳实践,但在使用时需避免过度设计,根据实际需求选择合适的设计模式。

推荐镜像

更多