点击蓝字关注我们!每天获取最新的编程小知识!

源 / php中文网      源 / www.php.cn

面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,既然我们类会声明了,下一步就是实例化对象了。下面我们就给大家介绍如何实例化对象。

当定义好类后,我们使用new关键字来生成一个对象。

$对象名称 = new 类名称();

class Person

{

    //下面是人的成员属性

    var $name; //人的名字

    var $sex; //人的性别

    var $age; //人的年龄

    //下面是人的成员方法

    function say() { //这个人可以说话的方法

        echo "这个人在说话";

    }

    function run() { //这个人可以走路的方法

        echo "这个人在走路";

    }

}

$p1=new Person();

$p2=new Person();

$p3=new Person();

?>

$p1=new Person();

这条代码就是通过类产生实例对象的过程,$p1就是我们实例出来的对象名称, 同理,$p2, $p3也是我们实例出来的对象名称,一个类可以实例出多个对象,每个对象都是独立的,上面的代码相当于实例出来3个人来, 每个人之间是没有联系的, 只能说明他们都是人类, 每个人都有自己的姓名, 性别和年龄的属性,每个人都有说话和走路的方法,只要是类里面体现出来的成员属性和成员方法,实例化出来的对象里面就包含了这些属性和方法。

对像在PHP里面和整型、浮点型一样,也是一种数据类,都是存储不同类型数据用的,在运行的时候都要加载到内存中去用, 那么对象在内存里面是怎么体现的呢?

内存从罗辑上说大体上是分为4段, 栈空间段堆空间段代码段初使化静态段

①.栈空间段

栈的特点是空间小但被CPU访问的速度快,是用户存放程序中临时创建的变量。由于栈的后进先出特点,所以栈特别方便用来保存和恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个临时数据寄存、交换的内存区。用于存储占用空间长度不变并且占用空间小的数据类型的内存段,例如整型1、100、10000等在内存中占用空间是等长的,占用空间都是32位的4个字节。还有double、boolean等都可以存储在栈空间段中。

②.堆空间段

堆是用于存放进程运行中被动态分配的内存段,它大小并不固定,可动态扩张或缩减。用于存储数据长度可变或占用内存比较大的数据。例如,字符串、数组和对象就存储在这段内存中。

③.数据段

数据段用来存放可执行文件中初始化全局变量,换句话说就是存放程序静态分配的变量。

④.代码段

代码段是用来存放可执行文件的操作指令,也就是说它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作。例如程序中的函数就存储在这段内存中。

对象类型的数据就是一种占用空间比较大的数据类型,并且是占用的空间不定长的数据类型,所以对象创建完成以后被存放在对内存中,但对象的引用还是存放在栈里面的。程序在运行时,占内存中的数据是可以直接存取的,而堆内存是不可以直接存取的内存,但可以通过对象的引用名称访问对象中的成员。

程序里面不同的声明放在不同的内存段里面,

栈空间段是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1, 10, 100, 1000, 10000, 100000等等,在内存里面占用空间是等长的,都是64位4个字节。

那么数据长度不定长,而且占有空间很大的数据类型的数据放在那内存的那个段里面呢?这样的数据是放在堆内存里面的。

栈内存是可以直接存取的,而堆内存是不 可以直接存取的内存。

对于我们的对象来说就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,但对象名称是放在栈里面的,这样通 过对象名称就可以使用对象了。

$p1=new Person();

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

从上图可以看出$p1=new Person();等号右边是真正的对象实例, 在堆内存里面的实体,上图一共有3次new Person(),所以会在堆里面开辟3个空间,产生3个实例对象,每个对象之间都是相互独立的,使用自己的空间,在PHP里面,只要有一个new这个关键字出现就会实例化出来一个对象,在堆里面开辟一块自己的空间。

每个在堆里面的实例对象是存储属性的,比如说,现在堆里面的实例对象里面都存有姓名、性别和年龄。每个属性又都有一个地址。

$p1=new Person();等号的左边$p1是一个引用变量,通过赋值运算符“=”把对象的首地址赋给“$p1“这个引用变量, 所以$p1是存储对象首地址的变量,$p1放在栈内存里边,$p1相当于一个指针指向堆里面的对象, 所以我们可以通过$p1这个引用变量来操作对象, 通常我们也称对象引用为对象。

验证:

class Person{

  public $name;

}

$obj1 = new Person();

$obj1->name = "test1";

echo $obj1->name;

$obj2 = $obj1;

$obj2->name = "test2";

echo $obj1->name;

echo $obj2->name;

通过测试结果来看,解释是对的。

$p1 是对象的指针而不是对象本身 obj2 obj1都指向同一块内存同一个对象这一点和OOP语言是一样

object(Person)[2]

public 'name' => string 'test2' (length=5)

object(Person)[2]

public 'name' => string 'test2' (length=5)

可见对象的ID号是一个

如果想得到一个对象的副本,用$obj2 =clone $obj1;  用了clone后会产生一个新对象,分配内存,独立于原来的obj1参见手册此页

http://www.php.net/manual/zh/language.oop5.cloning.php

$obj2 = $obj1;

$obj2 = &$obj1;

一样的效果,一样的解释?对于object来说,是一样的。对于普通的变量是不一样的。

$a = 1;

$b = $a;

$c = &$a;

不一样的

-END-

声明:本文选自「 php中文网 」,搜索「 phpcnnew 」即可关注!

php 对象里还有哪些对象_PHP面向对象(OOP)之实例化对象的方法相关推荐

  1. java怎样用类模板创建对象_java入门(十四) | 面向对象(OOP)之类和对象

    上一期是变量,在java中变量总是无处不在,而变量其意就是可以改变的数,在一般情况下我们可以以变量类型,变量名,变量值来描述它 这一期是给面向对象(OOP)开了一个头,对他的概念,三大特征有了一个基础 ...

  2. java 构造方法和析构方法_PHP面向对象程序设计之构造方法和析构方法详解

    本文实例讲述了PHP面向对象程序设计之构造方法和析构方法.分享给大家供大家参考,具体如下: 构造方法和析构方法是对象中的两个特殊方法,它们都与对象的生命周期有关.构造方法是对象创建完成后第一个被对象自 ...

  3. 面向对象(一) 类和对象

    .面向对象的介绍  (面向对象编程(OOP)) (1)面向对象(Object Oriented)是软件开发方法,一种编程范式. (2)面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一 ...

  4. JS高级进阶总结day01---面向对象编程介绍,new的工作原理以及构造函数,原型对象,实力函数三者之间的关系

    02-面向对象编程 1.1-面向对象编程介绍 本小节知识点 1.理解什么是面向对象编程 面向对象不是一门技术,而是一种解决问题的思维方式 面向对象的本质是对面向过程的一种封装 2.理解什么是对象 对象 ...

  5. 类,实例,对象,生成对象,实例化对象的区别(精讲)

    问题简述 什么是类? 什么是实例? 什么是对象? 什么是生成对象? 什么是实例化对象? 分析问题: 在面向对象程序设计中,"类"在实例化之后叫做一个"实例"(P ...

  6. 如何销毁一个实例化对象_基于脚本的游戏对象系统(1) 实例化、组件及生命周期...

    前置说明:这是2016年在开发 CreateX Engine 2 时写的文章,这个专栏也开了两年,一直空着,最近有时间慢慢填写内容,两年多过去了,对于引擎的理念也有了一些变化,可能会不一致,甚至是颠覆 ...

  7. 实例化对象时的()什么意思?

    不实例化的类,被命名为静态类.为什么呢? 这样理解 实例化是什么 把一个抽象实例化 抽象是什么 是一堆相同特种的物品的集合 静态 就是唯一 他是真实的, 不是抽象, 怎么能由他实例化出来. 静态类在加 ...

  8. Python 进阶_OOP 面向对象编程_实例属性和方法

    目录 目录 构造器和解构器 构造器 __init__ 真构造器 __new__ 解构器 __del__ 实例方法 Python 中的 抽象方法 实例属性 查看实例属性 实例属性和类属性的区别 访问不可 ...

  9. 【转载】PHP面向对象(OOP)编程入门教程

    面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持. 如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们 ...

最新文章

  1. Struts+2权威指南--基于WebWork核心的MVC开发源码下载
  2. 多线程导出excel_【开源资讯】MyExcel 3.7.0 发布,屏蔽多线程处理细节
  3. Vue组件实现函数防抖
  4. 【产品】阿里产品经理内训:能力模型解读
  5. 主成分分析原理解释(能力工场小马哥)
  6. python爬虫知乎图片_Python爬虫入门教程 25-100 知乎文章图片爬取器之一
  7. oracle ins-30131错误
  8. 【pytorch】torch.range() 和 torch.arange() ==>以step为间隔输出从start到end的张量列表
  9. 诊断案例:Failed parse elapsed time引发db time过高的案例
  10. 5、UmbracoNewsSite:添加css和js文件
  11. php 文件服务器,GitHub - RainmanJin/PSFS: PHP Simple File Server 极简版PHP文件服务器
  12. C#实现简单的网页爬虫
  13. 【转】目前为止最详细、最简单的亚马逊Kindle Fire破解ROOT方法教程(增加一键root方法)2011.12.19...
  14. 大型公建能耗监管系统
  15. CSS界面样式(悬浮在元素上时将鼠标改为小手)
  16. 魅族路由器极速版刷机_魅族路由器极速版最真实的体验评测
  17. 计算机wps文字基础知识,计算机基础及WPS Office应用常见考试内容
  18. HTPPS加密对网站有什么好处
  19. 百度文心一言推出内测专用独立 App;暴雪回应被网易起诉:未收到相关诉状;iOS 17或支持第三方应用商店 | 极客头条
  20. CloudFlare域名管理系统

热门文章

  1. python与excel的差别-python3与Excel的完美结合
  2. python小程序-【Python精华】100个Python练手小程序
  3. pythonis啥意思-isinstance在python中的意思是什么?
  4. python语言及其应用-Python语言及其应用.PDF
  5. 大学生学python到底有没有有-大学生该不该学Python?太纠结了?
  6. 可以考的python方面的证书-python有证书的加密解密实现方法
  7. python与c语言在语法上的区别-论c++/java/c 与python的语法上的区别
  8. 小学生python入门-小学生都开始学的Python编程到底是什么?
  9. python拼音怎么写-Python 中拼音库 PyPinyin 的用法
  10. xmind快速上手使用教程,提高工作效率