将 PDO 对象,赋值给 另外变量,会带来额外的开销吗? 连接是复用的吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
OpenYanxi
V2EX    PHP

将 PDO 对象,赋值给 另外变量,会带来额外的开销吗? 连接是复用的吗?

  •  
  •   OpenYanxi 2017-05-20 19:07:21 +08:00 2622 次点击
    这是一个创建于 3115 天前的主题,其中的信息可能已经有所发展或是发生改变。

    举例比如:

    $db = new PDO(参数); $db2 = $db; $db3 = $db; 

    对三个变量进行 var_dump 输出的时候,都显示 object(PDO)[2]

    意思是,都是引用的同一个 PDO 对象吗? 并没有新建立一个链接,对吗?

    还有,为什么 $db 是一个对象,而不是一个资源呢? 对 get_resource_tpe($db); 显示报错:

    get_resource_type() expects parameter 1 to be resource, object given

    Uncaught exception 'PDOException' with message 'You cannot serialize or unserialize PDO instances'

    6 条回复    2017-05-20 19:24:10 +08:00
    OpenYanxi
        1
    OpenYanxi  
    OP
       2017-05-20 19:07:53 +08:00
    PHP 手册:

    当把一个对象已经创建的实例赋给一个新变量时,新变量会访问同一个实例,就和用该对象赋值一样。此行为和给函数传递入实例时一样。可以用克隆给一个已创建的对象建立一个新实例。

    这个的意思是,是同一个 PDO 对象是吗?
    OpenYanxi
        2
    OpenYanxi  
    OP
       2017-05-20 19:09:17 +08:00
    Example #4 对象赋值



    <?php

    $instance = new SimpleClass();

    $assigned = $instance;
    $reference =& $instance;

    $instance->var = '$assigned will have this value';

    $instance = null; // $instance and $reference become null

    var_dump($instance);
    var_dump($reference);
    var_dump($assigned);
    ?>


    以上例程会输出:


    NULL
    NULL
    object(SimpleClass)#1 (1) {
    ["var"]=>
    string(30) "$assigned will have this value"
    }
    bianhua
        3
    bianhua  
       2017-05-20 19:13:24 +08:00
    第一个问题:new PDO 返回的是一个参考( Reference ),在上面的代码中,这个参考被赋值给了$db、$db2 和$db3。现在$db2、$db3 拿到了这个参考,因此通过$db2、$db3 就可以访问 PDO 这个对象。

    第二个问题:PDO 本身就是个 Object,而不是 Resource。你可以将这个 Object 看成一个 Resource Representation,就像你可以建立一个叫 File 的 Object 然后在其中包裹一个 File Handle 和操作这个 Handle 的代码一样。
    bianhua
        4
    bianhua  
       2017-05-20 19:15:10 +08:00
    @bianhua

    其实上面说的不准确,new 出来的是一个 Object 的 Instance。
    lsido
        5
    lsido  
       2017-05-20 19:16:50 +08:00 via Android
    同一个对象,第二个在你的问题意义上等于$user = new User();
    iyaozhen
        6
    iyaozhen  
       2017-05-20 19:24:10 +08:00 via Android
    第一个问题,都是指向同一个实例。不会带来额外的开销。关键字:Copy On Write

    第二个问题我觉得是 pdo 内部封装了 db 连接资源(面向对象嘛),不然像 mysql_xxx 系列函数那样还要把 db 连接资源当参数传来传去,多蛋疼
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2544 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 11:37 PVG 19:37 LAX 03:37 JFK 06:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86