zoukankan      html  css  js  c++  java
  • [学习]php 赋值

    php赋值

    普通赋值

    通过=进行赋值。

    对于数字,字符串,布尔值,null,数组等,用=将原变量的值拷贝到新变量中(传值赋值),所以改变其中一个并不影响另一个。

    但是对于对象,用=赋值,不是拷贝,而是对对象的引用(也不是引用赋值,类似于js中的对象赋值)。

    例子

    // php 版本5.6.9
    $a = 123;
    $b = $a;
    $a = 456;
    print $b; // 123
    
    $aa = array( 0 => 123);
    $bb = $aa;
    $aa[0] = 456;
    print $bb[0]; // 123
    
    
    // 对象赋值 -- 使用php手册中的例子
    class SimpleClass {}
    $instance = new SimpleClass(); // new 操作符返回的是对所创建对象的引用
    
    $assigned   =  $instance; // 普通赋值 
    $reference  =& $instance; // 引用赋值
    
    $instance->var = '$assigned will have this value';
    
    $instance = null; // $instance and $reference become null. 改变$instance的值,$assigned的值并没有变化,所以对象的普通赋值不能说就是引用赋值。$reference的赋值才是真正的引用赋值:改变$instance的值,$reference的值跟着变。
    
    var_dump($instance); // null
    var_dump($reference); // null
    var_dump($assigned); // SimpleClass 对象
    
    

    对于对象的赋值可以这么理解

    首先,将PHP中的变量看成是一个一个的数据槽。这个数据槽可以保存一个基本类型(int、string、bool等)。创建引用时,这个槽里保存的是内存地址,或者说是指向引用对象的一个指针,引用没有拷贝操作,仅仅是将指针指向了原变量(参考数据结构)。创建普通赋值时,则是拷贝的基本类型。
    而对象则与基本类型不同,它不能直接保存在数据槽中,而是将对象的“句柄”保存在了数据槽。这个句柄是指向对象特定实例的标识符。虽然句柄不是我们所能直观操作的类型,但它也属于基本类型。
    当你获取一个包含对象句柄的变量,并将其分配给另一个变量时,另一个变量获取的是这个对象的句柄。(注意,不是引用!不是引用!不是引用!!)。通过句柄,两个变量都可以修改同一个对象。但是,这两个变量并没有直接关系,它们是两个独立的变量,其中一个变量修改为其他值时,并不会对另一个变量产生影响。只有该变量在修改对象内部的内容时,另一个变量因为持有相同的句柄,所以它的对象内容也会相应地发生改变。

    php官方手册中关于对象和引用的解释。

    引用赋值

    使用=&进行引用赋值。

    php手册的例子:

    // php 版本5.6.9
    $a = 3;
    $b = &$a; // $b 是 $a 的引用
    
    print "$a
    "; // 输出 3
    print "$b
    "; // 输出 3
    
    $a = 4; // 修改 $a
    
    print "$a
    "; // 输出 4
    print "$b
    "; // 也输出 4,因为 $b 是 $a 的引用,因此也被改变
    
    
  • 相关阅读:
    demo04-默认标签
    demo03-段落标签
    demo02-标题标签
    demo01-注释标签
    前端基础介绍
    xadmin的详细使用
    设置Linux环境变量中文显示乱码
    ES应用
    HTTP协议
    jboss
  • 原文地址:https://www.cnblogs.com/fogwind/p/15190716.html
Copyright © 2011-2022 走看看