PHP实例化对象在内存中的交互过程,发生了什么。

代码


class Person
{
    //下面是人的成员属性
    var $name; //人的名子
    var $sex; //人的性别
    var $age; //人的年龄

    //下面是人的成员方法
    function say() //这个人可以说话的方法
    {
        echo "这个人在说话";
    } 

    function run() //这个人可以走路的方法
    {
        echo "这个人在走路";
    }
    }

    $p1=new Person();
    $p2=new Person();
    $p3=new Person();
?>

p 1 = n e w P e r s o n ( ) ;     这 条 代 码 就 是 通 过 类 产 生 实 例 对 象 的 过 程 , p1=new Person();   这条代码就是通过类产生实例对象的过程, p1=newPerson();  p1就是我们实例出来的对象名称, 同理,$p2, $p3也是我们实例出来的对象名称,一个类可以实例出多个对象,每个对象都是独立的,上面的代码相当于实例出来3个人来, 每个人之间是没有联系的, 只能说明他们都是人类, 每个人都有自己的姓名, 性别和年龄的属性,每个人都有说话和走路的方法,只要是类里面体现出来的成员属性和成员方法,实例化出来的对象里面就包含了这些属性和方法。
  对像在PHP里面和整型、浮点型一样,也是一种数据类,都是存储不同类型数据用的,在运行的时候都要加载到内存中去用, 那么对象在内存里面是怎么体现的呢?内存从罗辑上说大体上是分为4段, 栈空间段, 堆空间段,代码段, 初使化静态段,程序里面不同的声明放在不同的内存段里面,栈空间段是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1, 10, 100, 1000, 10000, 100000等等,在内存里面占用空间是等长的,都是64位4个字节。 那么数据长度不定长,而且占有空间很大的数据类型的数据放在那内存的那个段里面呢?这样的数据是放在堆内存里面的。栈内存是可以直接存取的,而堆内存是不可以直接存取的内存。对于我们的对象来说就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,但对象名称是放在栈里面的,这样通过对象名称就可以使用对象了。

$p1=new Person();

对于这个条代码, $p1是对象名称在栈内存里面,new Person()是真正的对象是在堆内存里面的,具体的请看下图:

PHP实例化对象在内存中的交互过程,发生了什么。_第1张图片

从上图可以看出 p 1 = n e w P e r s o n ( ) ; 等 号 右 边 是 真 正 的 对 象 实 例 , 在 堆 内 存 里 面 的 实 体 , 上 图 一 共 有 3 次 n e w P e r s o n ( ) , 所 以 会 在 堆 里 面 开 辟 3 个 空 间 , 产 生 3 个 实 例 对 象 , 每 个 对 象 之 间 都 是 相 互 独 立 的 , 使 用 自 己 的 空 间 , 在 P H P 里 面 , 只 要 有 一 个 n e w 这 个 关 键 字 出 现 就 会 实 例 化 出 来 一 个 对 象 , 在 堆 里 面 开 辟 一 块 自 己 的 空 间 .     每 个 在 堆 里 面 的 实 例 对 象 是 存 储 属 性 的 , 比 如 说 , 现 在 堆 里 面 的 实 例 对 象 里 面 都 存 有 姓 名 、 性 别 和 年 龄 。 每 个 属 性 又 都 有 一 个 地 址 。     p1=new Person();等号右边是真正的对象实例, 在堆内存里面的实体,上图一共有3次new Person(),所以会在堆里面开辟3个空间,产生3个实例对象,每个对象之间都是相互独立的,使用自己的空间,在PHP里面,只要有一个new这个关键字出现就会实例化出来一个对象,在堆里面开辟一块自己的空间.   每个在堆里面的实例对象是存储属性的,比如说,现在堆里面的实例对象里面都存有姓名、性别和年龄。每个属性又都有一个地址。    p1=newPerson();3newPerson()33使PHPnew.    p1=new Person();等号的左边 p 1 是 一 个 引 用 变 量 , 通 过 赋 值 运 算 符 “ = ” 把 对 象 的 首 地 址 赋 给 “ p1是一个引用变量,通过赋值运算符“=”把对象的首地址赋给“ p1=p1“这个引用变量, 所以 p 1 是 存 储 对 象 首 地 址 的 变 量 , p1是存储对象首地址的变量, p1p1放在栈内存里边, p 1 相 当 于 一 个 指 针 指 向 堆 里 面 的 对 象 , 所 以 我 们 可 以 通 过 p1相当于一个指针指向堆里面的对象, 所以我们可以通过 p1p1这个引用变量来操作对象, 通常我们也称对象引用为对象。

参考文献:https://www.cnblogs.com/mityaya/p/4418408.html
链接:https://segmentfault.com/q/1010000002558760#answer-1020000002558782

你可能感兴趣的:(PHP)