PHP对象赋值与克隆

Zephyr中断开发实战:从裸机思维到内核调度机制的完整解析 实时操作系统(RTOS)的中断管理是嵌入式开发的核心能力,尤其在Cortex-M等主流架构下,中断处理不仅要响应硬件事件,还需与线程调度、内核对象深度协同。与传统MCU裸机中断仅依赖回调函数不同,RTOS中断模型强调“快进快出”,通过信号量、消息队列、工作队列等机制将耗时逻辑转移到线程上下文,从而兼顾实时性与系统稳定性。在物联网、传感器采集、低功耗设备等场景中,正确配置GPIO外部中断、串口接收中断或定时器中断,并理解ISR与调度器的交互原理,是保障系统可靠运行的关键。本文从Zephyr的IRQ机制、静态与 阅读详情


在php5 的对象编程经常提到的一个关键点是“默认情况下对象是通过引用传递的”。但其实这不是完全正确的。下面通过一些例子来说明。

php的引用是别名,就是两个不同的变量名字指向相同的内容。在php5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。 当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。 
通俗说:普通的赋值操作只是传递了索引,只有在清除传值对象的时候,才会发生写时复制

<?php 
//深入理解PHP对象赋值
echo '<pre>';

$obj = new StdClass;
$obj->name = 'Pig';
var_dump($obj);                     //object(stdClass)#1 (1) { ["name"]=> string(3) "Pig" }

$copy = $obj;                      // $obj ,$copy都是new StdClass返回的同一个标识符的拷贝
var_dump($copy);                   //object(stdClass)#1 (1) { ["name"]=>string(3) "Pig" }

$objRef = &$obj;                   // 此时会将$obj转换成引用,然后赋值给$objRef,因此$obj,$objRef都为引用                
var_dump($objRef);                  //object(stdClass)#1 (1) { ["name"]=>string(3) "Pig" }

$objClone = clone $obj;             //新空间
$obj->name = 'After Clone';
var_dump($objClone);              //object(stdClass)#1 (1) { ["name"]=>string(3) "Pig" }
var_dump($obj);                    //object(stdClass)#1 (1) { ["name"]=>string(11) "After Clone" }

//unset是删除引用效果
$nameRef = &$obj->name;            //$obj->name被转换成引用(& string),然后赋给$nameRef
var_dump($obj);                    //object(stdClass)#2 (1) { ["name"]=>&string(11) "After Clone" }
unset($nameRef);                  //删除引用
var_dump($obj);                    //object(stdClass)#1 (1) { ["name"]=>string(11) "After Clone" }

//null是赋值效果        
$nameRef = &$obj->name;            //恢复name的引用
var_dump($obj);                    //object(stdClass)#2 (1) { ["name"]=>&string(11) "After Clone" }
$nameRef = null;                
var_dump($obj);                    //object(stdClass)#2 (1) { ["name"]=>&NULL }

unset($objRef);                    //仅仅删除了引用
var_dump($obj);                    //object(stdClass)#1 (1) { ["name"]=>&NULL }

$objRef = &$obj;                  //恢复对象引用
$obj->name = 'Lucy';
$obj = null;                     //赋值$obj为null,$obj只是new StdClass的标识拷贝,不会影响其内容。
                                  //$objRef做为$obj的引用,会同时被赋值null
                                  //等价 $objRef = null;

var_dump($obj,$copy,$objRef,$objClone);
// NULL,
// object(stdClass)#1 (1) { ["name"]=>&string(4) "Lucy" },
// NULL,
// object(stdClass)#1 (1) { ["name"]=>string(3) "Pig" }

?>

对象克隆 
有的时候我们需要在一个项目里面使用两个或多个一样的对象,如果使用 new 关键字重新创建对象,再赋值上相同的属性,这样做比较烦琐而且也容易出错。PHP 提供了对象克隆功能,可以根据一个对象完全克隆出一个一模一样的对象,而且克隆以后,两个对象互不干扰。 
使用关键字 clone 来克隆对象。语法:

$object2 = clone $object;
1
例子:

<?php
class Person {
    private $name;
    private $age;

    function __construct($name, $age) {
        $this->name=$name;
        $this->age=$age;
    }

    function say() {
        echo "我的名字叫:".$this->name."<br />";
    echo "我的年龄是:".$this->age;
    }
}

$p1 = new Person("张三", 20);
$p2 = clone $p1;
$p2->say();
?>

运行例子,输出:

我的名字叫:张三
我的年龄是:20
1
2
__clone() 
如果想在克隆后改变原对象的内容,需要在类中添加一个特殊的 __clone() 方法来重写原本的属性和方法。__clone() 方法只会在对象被克隆的时候自动调用。 
例子:

<?php
class Person {
    private $name;
    private $age;

    function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }

    function say() {
        echo "我的名字叫:".$this->name;
    echo " 我的年龄是:".$this->age."<br />";
    }
    function __clone() {
        $this->name = "我是假的".$this->name;
        $this->age = 30;
    }
}

$p1 = new Person("张三", 20);
$p1->say();
$p2 = clone $p1;
$p2->say();
?>

运行例子,输出:

我的名字叫:张三 我的年龄是:20
我的名字叫:我是假的张三 我的年龄是:30
————————————————
版权声明:本文为优快云博主「Shower稻草人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/u013474436/article/details/50773646

LTE随机接入实战:如何通过PRACH前导码优化小区覆盖半径(附计算公式) 本文深入探讨了LTE网络中PRACH前导码格式对小区覆盖半径的关键影响。通过解析不同前导码格式(如Format 0-3)的物理参数与覆盖能力,提供了核心计算公式与实战Python脚本,指导网络工程师根据覆盖需求、环境多径和容量等因素,科学选择前导码格式以优化边缘用户接入成功率,实现精准的网络规划与优化。 阅读详情

相关推荐

Matlab实战:用卡尔曼滤波搞定无人机GPS轨迹优化(附完整代码)

本文详细介绍了如何使用Matlab实现卡尔曼滤波(KF)算法优化无人机GPS轨迹,提供完整代码和工程实践指南。通过线性卡尔曼滤波技术,有效降低定位噪声,提升轨迹平滑度,适用于无人机导航和控制系统开发。

weixin_29061425的博客 253

PHP对象赋值详解

<?php //深入理解PHP对象赋值 echo ''; $obj = new StdClass; $obj->name = 'Pig'; var_dump($obj); //object(stdClass)#1 (1) { ["name"]=> string(3) "Pig" } $copy = $obj; //$obj ,$copy都是new StdClass返回的同一个标识符的

risingsun001的专栏 6057

STM32 HAL库驱动BMP388:从寄存器配置到高精度气压温度采集

本文详细介绍了如何使用STM32 HAL库驱动BMP388气压温度传感器,实现高精度数据采集。内容涵盖从硬件连接到STM32CubeMX配置、关键寄存器解析、驱动源码编写,到核心补偿算法与海拔换算的完整流程,并提供了针对不同应用场景的优化配置与调试技巧,帮助开发者快速构建稳定可靠的测量方案。

weixin_29299807的博客 171

php 对象赋值_php引用是个坑

去年我参加了很多次会议,其中八次会议里我进行了相关发言,这其中我多次谈到了 PHP 的引用问题,因为很多人对它的理解有所偏差。在深入讨论这个问题之前,我们先回顾一下引用的基本概念,明确什么是“引用传递”。在 PHP 中引用意味着用不同的名字访问同一个变量内容,不论你用哪个名字对变量做出了运算,其他名字访问的内容也将改变。让我们通过代码来加深对此的理解。 首先我们写几个简单的语句,把一个变量赋值给另...

weixin_39916758的博客 444

Quartus II 13.0安装避坑指南:从下载到破解的完整流程(附常见错误解决方案)

本文提供Quartus II 13.0软件的详细安装与破解指南,涵盖从下载准备、路径设置、主程序安装到授权配置的全流程。重点解析了破解过程中生成和修改license.dat文件的核心步骤,并针对“无法找到有效的License文件”等常见错误提供了实用的解决方案,帮助用户快速构建稳定的FPGA开发环境。

weixin_29291863的博客 760

QMT中ContextInfo的使用注意

QMT中ContextInfo下声明的全局变量的使用注意事项

路在何方 2810

php 对象赋值_PHP基础及实例

一、PHP中的编码规范1. 表述在PHP的正常表述中,每一句PHP语句都是以“;”结束。echo “php是以分号表示语句的结束和执行。”;?>2. 指令分隔符在PHP代码中,每个语句需要用分号结束。一段PHP代码中的结束标记隐含表示了一个分号,所以在PHP代码中的最后一行可以不用分号结束。、 echo “这是第一个语句”; echo “这是第二个语句”; echo “这是最后一个语句”?&...

weixin_39622225的博客 784

uniapp 使用摄像头 live-pusher (APP)

uniapp 中开发 app 时使用live-pusher踩过的坑

随身笔记 1万+

php如何使用对象数组赋值,php 对象和数组的赋值过程

$a = ['a'=>array('b'=>1)];var_dump($a);/$b = $a;$b['a'] = 2;var_dump($b);var_dump($a);两次输出的$a 一致 说明默认的赋值过程是深度拷贝调用class A {public $a = array('a'=>'2');};$a = new A();var_dump($a);$b = $a;$b-&g...

weixin_29782509的博客 568

NVIDIA GR00T SONIC - 人形机器人强化学习全身控制入门教程(一)

SONIC 是一个类人行为基础模型,它为机器人提供了一套从大规模人类动作数据中学习而来的核心运动技能。与为每个动作单独构建控制器不同,SONIC 将动作追踪作为可扩展的训练任务,因此单一套统一策略即可产生自然的全身运动,并支持多种多样的行为。         🎯 主要特点: 🚶 自然的全身运动(行走、爬行、动态动作) 🎮 支持实时 VR 遥操作 🤖 高级规划与交互的基础 📦 即用型 C++ 推理栈

2506_90492529的博客 840

[特殊字符] RK3588 平台上基于 Panfrost 的 Mesa 驱动编译全过程

摘要: 本文详细记录了在RK3588平台(Ubuntu 20.04 aarch64)上编译基于Panfrost的Mesa驱动的全过程。内容包括:1)系统依赖安装;2)libdrm编译;3)Mesa配置参数优化;4)LLVM 15与SPIRV工具链的安装方法;5)SPIRV-Tools版本问题的解决方案;6)最终编译命令及常见错误处理。关键点在于正确设置工具链路径(PKG_CONFIG_PATH)和版本匹配(LLVM 15对应SPIRV-LLVM-Translator v15.0.0),推荐将组件安装在/op

梁俊星的博客 941

php对象赋值

php对象赋值对象赋值 对象赋值 php中,关于对象的赋值,默认使用引用传参的,如下面的代码: Class Test { public $test; } $object = new Test(); $objects = [$object]; foreach ($objects as $key => $value) { $value->test = 'test'; ...

也无风雨也无晴 4366

如何使用 Python 爬虫爬取滴滴打车信息:获取司机和乘客数据

滴滴打车作为中国最大的打车平台之一,提供了丰富的司机和乘客数据,包括司机的车辆信息、乘客的评价、行程数据等。公开的司机和车辆信息(如司机的名字、车辆类型、评价等)可以通过网页直接获取,而乘客的个人信息和具体行程数据通常会受到隐私保护。在滴滴打车的网页中,司机的信息可能以特定的 HTML 标签存在,例如包含司机名称、车辆类型、车辆等级等信息。我们需要分析网页的 HTML 结构,找到这些数据所在的标签。同时,对于涉及到隐私的用户数据(如乘客的行程信息、用户评价等),我们必须特别谨慎,避免侵犯他人的隐私。

2201_76125261的博客 1917

Php面向对象学习笔记 – 构造、析构、对象赋值、克隆

Php面向对象学习笔记 – 构造、析构、对象赋值、克隆   class student {        public  $stu_id;       // 定义成员变量        public  $stu_name;               public  function sayName()   // 成员函数        {               echo

Y_23k_bug的专栏 1590

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

PHP对象赋值测试帮助理解

/**  * 深入理解PHP对象赋值  *  * @author 50882007@qq.com  */ class testAB {     public $a = "";     public $b = ""; } /**  * 方法传值测试  */ class testRefAb {      public static function p

green945的博客 359

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

php面向对象——对象的传递方式

对象的传值赋值 传值赋值 (赋值运算)将原变量的值拷贝到新变量中,所以改变其中一个并不影响另一个,适合于在密集循环中拷贝一些值例如大数组 引用赋值,使用 $var= &$othervar 语法,引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西 在php5中,一个对象变量并不是保存整个对象的值,而是保存一个对象标识符来访问真正的对象内容,因此,当对象作为参数传递,作为结果返回,或者...

沉梦昂志 1050

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

php循环遍历对象赋值_图文解析PHP对象的赋值操作是“传值”还是“传址”

​​我们知道,变量默认总是传值赋值。也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量。这意味着,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。举个简单例子:此时的$b = $a,在内存中的存贮大致是这样子的:但是当一个对象被实例化后,对象的传递并非传值,而是传递该对象的地址。也就是说,不会复制整个对象,因为这样做既耗时又耗内存。同样...

weixin_39981624的博客 334

php 对象赋值_PHP的类对象的赋值和clone的区别

1. 类对象的赋值方式PHP的类的赋值方式,有3种情况,一种是$a = new class()操作,创建类;一种是普通的对象赋值$a = $b; 一种取地址的赋值方式$a = &$b。那么,这三种赋值,指向的内存是否是同一块呢?好吧,我们一起来做一个实验。代码如下:...

weixin_39652869的博客 186

php克隆和赋值

PHP:类的赋值和克隆的区别 类的赋值其实就和变量的引用差不多是一个意思,都是直接指向类的地址。克隆和变量的赋值是差不多一个意思,互不干扰。 赋值 <?php class test{ public $a=1; public function plus(){ $this->a=$this-&...

abc9365的博客 597

php对象循环赋值,深入理解PHP对象赋值

//深入理解PHP对象赋值echo '';$obj = new StdClass;$obj->name = 'Pig';var_dump($obj);  //object(stdClass)#1 (1) { ["name"]=> string(3) "Pig" }$copy = $obj;   // $obj ...

weixin_36158843的博客 731

PHP面向对象——clone关键字

clone关键字用于克隆对象,克隆完的对象和源对象保持独立,对该对象的所做的修改不会影响源对象。赋值引用的方式产生的对象和源对象指向的同一个内存地址,所以对新对象所做的修改会影响到源对象,举例: <?php class NbaPlayer{ public $name = ''; } $james = new NbaPlayer(); $james->name = 'james'; echo

这样的霍少楠 580

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

我们知道,变量默认总是传值赋值。也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量。这意味着,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。举个简单例子:$a='helloworld';$b=$a;$a='beyworld';var_dump($a);var_dump($b);?>此时的$b = $a,在内存中的...

weixin_34811804的博客 88

php 克隆的作用与使用方法

php 类有一个魔术方法__clone() 该魔术fang

vspeter的专栏 1631

php--对象的赋值与clone的区别

//对象的赋值与clone的区别 class Fruit { protected $a; public $b = 'bb'; } $obj = new Fruit; $obj2 = $obj; $obj3 = clone $obj; $obj4 = &$obj; $obj->b = 'aa'; echo $obj2->b; //aa echo $obj3->b; //bb

难得溜达到此 969

AD7768驱动开发实战:STM32H5 SPI+DMA帧同步采集全解析

从串行外设接口(SPI)的基础概念出发,理解标准SPI的寄存器读写与数据流传输差异,是掌握高速同步采样系统的关键。SPI协议本身定义了主机与从机间的时钟、数据线及片选机制,但在多通道高精度ADC应用中,数据输出往往采用帧同步方式,由数据就绪信号触发连续读取。本文基于STM32H5平台,结合直接存储器访问(DMA)技术,详细解析如何利用外部中断与DMA协同工作,准确捕获AD7768的8通道24位数据。从MCLK主时钟、电源基准到SCLK连续性问题,再到OCTOSPI四线提速方案,系统阐述工程实践中容易踩坑的时

weixin_34174422的博客 410
上一篇: PHP取整,四舍五入取整、向上取整、向下取整、小数截取
下一篇: 前端chrome浏览器调试总结
firstcode666
博客等级 码龄5年 53粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值