前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于php对象的引用传值与cow问题记录

关于php对象的引用传值与cow问题记录

作者头像
躺平程序员老修
发布2023-09-05 15:57:10
2100
发布2023-09-05 15:57:10
举报
文章被收录于专栏:躺平程序员老修

php

问题缘起

发这篇文章其实挺羞愧的,应该是自己的基础不够扎实,我记得好久之前(应该是初学的时候)是知道这个事情的,各种赋值引用都自己测试过,但是苦于一直没有使用到,忘光了。于是写下这篇文章给自己个教训。

测试数据:

mysql.png
mysql.png

这里我只用这三条数据进行测试,来说明php对象的引用传值。

代码案例:

代码语言:javascript
复制
class Litblc {

    private $init;

    public function index ()
    {
        $this->init = Classroom::where('school_id', 6);
        $tree = $this->init;

        $a = $tree->where('name', 101)->get();
        $b = $tree->where('name', 102)->get();

        return $a;
    }
}

Output:

代码语言:javascript
复制
[{"id":19,"school_id":6,"building_id":10,"name":"101","created_at":"2016-04-19 09:33:51","updated_at":"2016-04-19 09:33:51","grade_name":""}]

那么此时如果return b会返回什么呢? 我们先注销a的赋值查看输出:

代码语言:javascript
复制
class Litblc {

    private $init;

    public function index ()
    {
        $this->init = Classroom::where('school_id', 6);
        $tree = $this->init;

        //$a = $tree->where('name', 101)->get();
        $b = $tree->where('name', 102)->get();

        return $b;
    }
}

Output:

代码语言:javascript
复制
[{"id":20,"school_id":6,"building_id":10,"name":"102","created_at":"2016-04-19 09:34:11","updated_at":"2016-04-19 09:34:11","grade_name":""}]

到此都是正常的,那么最后我们把a的注释打开,输出b :

代码语言:javascript
复制
class Litblc {

    private $init;

    public function index ()
    {
        $this->init = Classroom::where('school_id', 6);
        $tree = $this->init;

        $a = $tree->where('name', 101)->get();
        $b = $tree->where('name', 102)->get();

        return $b;
    }
}

Output :

代码语言:javascript
复制
[]

为什么会这样呢?其实这个时候的b已经变成了b =

总结:

一般我们在普通赋值中,都会触发php的cow机制,但是:

  1. 在php5以后,所有对象都是引用传递,除非显式调用clone $object。
  2. 即使赋值给其它变量,也是引用。
  3. 所以,应尽量避免函数内操作外部对象。

课后作业:

请问下面代码会输出什么?欢迎在下方评论写下你的答案。

代码语言:javascript
复制
class Litblc {

    private $init;

    public function index ()
    {
        $this->init = Classroom::where('school_id', 6);
        $tree = $this->init;
        $tree2 = clone $this->init;

        $a = $tree->where('name', 101)->get();
        $b = $tree2->where('name', 102)->get();

        return $b;
    }
}

扩展 : PHP底层分析: 关于写时复制(cow) php manual: 对象和引用

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题缘起
  • 总结:
  • 课后作业:
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档