从 php 源码看 php 中的对象

从一个简单的例子说起:

class Person
{
    public $name;

    public $age;

    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }
}

$person = new Person("php", 20);
echo serialize($person) . PHP_EOL;

$array = [
    ‘name‘ => ‘php‘,
    ‘age‘  => 20,
];
echo serialize($array) . PHP_EOL;

  

输出:

O:6:"Person":2:{s:4:"name";s:3:"php";s:3:"age";i:20;}
a:2:{s:4:"name";s:3:"php";s:3:"age";i:20;}

我们通过上面的例子可以看出,person 对象和下面的数组序列化结果值的部分是相同的,只是类型不一样。

这就涉及到 php 中对象和普通变量之间的关系问题,实际上,在 php 中,对象也是变量的一种。

php 中 zend_value 的定义:

typedef union _zend_value {
	zend_long         lval;				/* long value */
	double            dval;				/* double value */
	zend_refcounted  *counted;
	zend_string      *str;
	zend_array       *arr;
	zend_object      *obj;
	zend_resource    *res;
	zend_reference   *ref;
	zend_ast_ref     *ast;
	zval             *zv;
	void             *ptr;
	zend_class_entry *ce;
	zend_function    *func;
	struct {
		uint32_t w1;
		uint32_t w2;
	} ww;
} zend_value;

  

而对象的类型是 zend_object:

struct _zend_object {
	zend_refcounted_h gc;
	uint32_t          handle; // TODO: may be removed ???
	zend_class_entry *ce;
	const zend_object_handlers *handlers;
	HashTable        *properties;
	zval              properties_table[1];
};

  

也就是说,对象只是一种结构不一样的变量而已,而其结构中,包含了一个对象的所有属性、方法(甚至还有引用计数)。

其中,ce 是存储该对象的类结构,在对象初始化时保存了类的入口,相当于类指针的作用。

properties 是一个 HashTable,用来存放对象属性。

从上图可以看出,对象和数组存在一定的相似,只不过对象还有一个类指针,通过该指针我们可以实现很多数组不具备的功能。

对象与数组:

对象可以转化为数组(get_object_vars()),数组也可以转化为对象(stdClass)。

原文地址:https://www.cnblogs.com/eleven24/p/8998958.html

时间: 2024-11-10 06:13:38

从 php 源码看 php 中的对象的相关文章

从源码看Android中sqlite是怎么读DB的

执行query 执行SQLiteDatabase类中query系列函数时,只会构造查询信息,不会执行查询. (query的源码追踪路径) 执行move(里面的fillwindow是真正打开文件句柄并分配内存的地方) 当执行Cursor的move系列函数时,第一次执行,会为查询结果集创建一块共享内存,即cursorwindow moveToPosition源码路径 fillWindow----真正耗时的地方 然后会执行sql语句,向共享内存中填入数据, fillWindow源码路径 在SQLite

从源码看Android中sqlite是怎么读DB的(转)

执行query 执行SQLiteDatabase类中query系列函数时,只会构造查询信息,不会执行查询. (query的源码追踪路径) 执行move(里面的fillwindow是真正打开文件句柄并分配内存的地方) 当执行Cursor的move系列函数时,第一次执行,会为查询结果集创建一块共享内存,即cursorwindow moveToPosition源码路径 fillWindow----真正耗时的地方 然后会执行sql语句,向共享内存中填入数据, fillWindow源码路径 在SQLite

从源码看java中Integer的缓存问题

在开始详细的说明问题之前,我们先看一段代码 1 public static void compare1(){ 2 Integer i1 = 127, i2 = 127, i3 = 128, i4 = 128; 3 System.out.println(i1 == i2); 4 System.out.println(i1.equals(i2)); 5 System.out.println(i3 == i4); 6 System.out.println(i3.equals(i4)); 7 } 这段代

【从源码看Android】02MessageQueue的epoll原型

1 开头 上一讲讲到Looper,大家对Looper有了大概的了结(好几个月过去了-) 大家都知道一个Handler对应有一个MessageQueue, 在哪个线程上new Handler(如果不指定looper对象),那么这个handler就默认对应于这个线程上的prepare过的Looper 如下图Handler.java代码所示,mLooper由Looper.myLooper()指定, public Handler(Callback callback, boolean async) { i

从源码看Azkaban作业流下发过程——记我的第一次白盒测试

一.Azkaban简介 Azkaban作为开源的调度系统,在大数据中有广泛地使用.它主要有三部分组成:Azkaban Webserver.Azkaban Executor. DB. 图1 Azkaban架构 图1所示的是Azkaban的基本架构:Webserver主要负责权限验证.项目管理.作业流下发等工作:Executor主要负责作业流/作业的具体执行以及搜集执行日志等工作:MySQL用于存储作业/作业流的执行状态信息.图中所示的是单executor场景,但是实际应用中大部分的项目使用的都是多

nginx源码分析--从源码看nginx框架总结

nginx源码总结: 1)代码中没有特别绕特别别扭的编码实现,从变量的定义调用函数的实现封装,都非常恰当,比如从函数命名或者变量命名就可以看出来定义的大体意义,函数的基本功能,再好的架构实现在编码习惯差的人实现也会黯然失色,如果透彻理解代码的实现,领悟架构的设计初衷,觉得每块代码就想经过耐心雕琢一样,不仅仅实现了基本的功能给你,为其他人阅读也会提供很好的支持.细致恰当的命名规则就可以看出作者的功力. 2)更好更高的软件性能体现在架构设计上,好的架构会让软件更加稳定.容易维护.便于扩展.从核心模块

谈谈23种设计模式在Android源码及项目中的应用

本文首发于个人博客:Lam's Blog - 谈谈23种设计模式在Android源码及项目中的应用,文章由MarkDown语法编写,可能不同平台渲染效果不一,如果有存在排版错误图片无法显示等问题,烦请移至个人博客,如果个人博客无法访问可以留言告诉我,转载请声明个人博客出处,谢谢. 前言 本文将结合实际谈谈23种设计模式,每种设计模式涉及 * 定义:抽象化的定义与通俗的描述,尽量说明清楚其含义与应用场景 * 示例:如果项目中有使用过该模式,则会给出项目中的代码,否则会给出尽可能简单好理解的java

解密随机数生成器(二)——从java源码看线性同余算法

Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术的3.2.1节) 如果两个Random实例使用相同的种子,并且调用同样的函数,那么生成的sequence是相同的 也可以调用Math.random()生成随机数 Random实例是线程安全的,但是并发使用Random实例会影响效率,可以考虑使用ThreadLocalRandom变量. Random实

从Vue.js源码看异步更新DOM策略及nextTick

写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出.文章的原地址:https://github.com/answershuto/learnVue.在学习过程中,为Vue加上了中文的注释https://github.com/answershuto/learnVue/tree/master/vue-src,希望可以对其他想学习Vue源码的小伙伴有所帮助.可能会有理解存在偏差的地方,欢迎提issue指出,共同学