从一个简单的例子说起:

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)。

最新文章

  1. Java多线程基础——对象及变量并发访问
  2. 用C#实现封装
  3. 2016-2017-2 《Java程序设计》课程学生博客和代码托管链接
  4. ACM:SCU 4437 Carries - 水题
  5. [.net 面向对象编程基础] (4) 基础中的基础——数据类型转换
  6. 迭代器iterator(三):Listlterator遍历arraylist,并用逆序输出结果
  7. SQL Server 2005 安装图解教程(Windows)
  8. sql:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询
  9. Terminal的快捷键 for Terminal for Mac OS 10.10, Linux/GNU(Ubuntu, deepin, elementory os,CentOS)
  10. Log4j等级测试
  11. js 遍历json对象
  12. Python之路【第十篇】:HTML -暂无等待更新
  13. jsonp Ajax跨域请求
  14. gui线程
  15. C++ Primer 5th 第15章 面向对象程序设计
  16. hdu 4393 Throw nails(STL之优先队列)
  17. 功能间(两个form)数据交互的编程方法
  18. js验证15位或18位身份证
  19. linux存储管理之交换分区
  20. ssm 整合 redis(进阶教程)

热门文章

  1. lsmod命令详解
  2. ES6----Proxy(一)
  3. java的第二个实验——JAVA面向对象程序设计
  4. static 继承
  5. 对网络助手的NABCD分析心得
  6. iOS-UICollectionViewLayout方法介绍
  7. typedef struct bit0 : 1
  8. sprint1
  9. Spring 2.0
  10. PAT 甲级 1001 A+B Format