Skip to content

Commit

Permalink
第十一章校对完毕
Browse files Browse the repository at this point in the history
  • Loading branch information
wenjun1055 committed Jan 5, 2013
1 parent 2517922 commit 30f04d2
Show file tree
Hide file tree
Showing 4 changed files with 5 additions and 5 deletions.
4 changes: 2 additions & 2 deletions 11.1.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 11.1 PHP中的面向对象(二)

为了操作一个对象,我们需要先获取这个对象的实例,而这有肯定会涉及调用对象的构造方法。有关如何在扩展中调用PHP的函数与对象的方法这里不展开描述了,大家可以看我的另一篇博文: [在PHP扩展中通过C语言调用PHP函数与方法](http://walu.sinaapp.com/?p=159)
为了操作一个对象,我们需要先获取这个对象的实例,而这肯定会涉及调用对象的构造方法。有关如何在扩展中调用PHP的函数与对象的方法这里不展开描述了,大家可以看我的另一篇博文: [在PHP扩展中通过C语言调用PHP函数与方法](http://walu.sinaapp.com/?p=159)
首先我们先了解下一个object在PHP内核中到底是如何实现的。
````c
typedef struct _zend_object_value {
Expand All @@ -24,7 +24,7 @@ typedef union _zvalue_value {
如果我们有一个zval *tmp,那么tmp->value.obj来访问到最终保存对象实例的zend_object_value结构体,它包含两个成员:
<ul>
<li>zend_object_handle handle:最终实现是一个unsigned int值,Zend会把每个对象放进数组里,这个handle就是此实例的索引。所以我们在把对象当作参数传递时,只不过是传递的handle罢了,这样对性能有利,同时也是对象的引用机制的原理。</li>
<li>zend_object_handlers *handlers:这个里面是一组函数指针,我们可以通过它来对象进行一些操作,比如:添加引用、获取属性等。此结构体在Zend/zend_object_handlers.h里定义。</li>
<li>zend_object_handlers *handlers:这个里面是一组函数指针,我们可以通过它来对对象进行一些操作,比如:添加引用、获取属性等。此结构体在Zend/zend_object_handlers.h里定义。</li>
</ul>
下面我给出这个类的PHP语言实现,让我们在扩展中实现它,并生成它。
````php
Expand Down
2 changes: 1 addition & 1 deletion 11.2.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, char *n
ZEND_API zval *zend_read_static_property(zend_class_entry *scope, char *name, int name_length, zend_bool silent TSRMLS_DC);

````
zend_read_property函数用于读取对象的属性,而zend_read_static_property则用于读取静态属性。可以看出,静态属性是直接保存在类上的,用具体的对象无关
zend_read_property函数用于读取对象的属性,而zend_read_static_property则用于读取静态属性。可以看出,静态属性是直接保存在类上的,与具体的对象无关
silent参数:
<ul>
<li>0: 如果属性不存在,则抛出一个notice错误。</li>
Expand Down
2 changes: 1 addition & 1 deletion 11.3.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# 11.3 PHP中的面向对象(二)


有关面向对象的对象实在是太多了,我也是才学而已,没有办法给出非常系统、完整的阐述,但以后我会陆陆续续的在博客里写出来的。此外,强烈建议大家看看php官方的这篇wiki。
有关面向对象的资料实在是太多了,我也是才学而已,没有办法给出非常系统、完整的阐述,但以后我会陆陆续续的在博客里写出来的。此外,强烈建议大家看看php官方的这篇wiki。
[internals:engine:objects](https://wiki.php.net/internals/engine/objects)


Expand Down
2 changes: 1 addition & 1 deletion 11.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* [2. 读写对象的属性](11.2.md)
* [3. 小结](11.3.md)

上一章里,我们看了一下如何在PHP扩展里定义类与接口,那这一章里我们将入手一下如何在PHP扩展中操作类的实例————对象。
上一章里,我们看了一下如何在PHP扩展里定义类与接口,那这一章里我们将入手学习一下如何在PHP扩展中操作类的实例————对象。
PHP语言中的面向对象其实是分为三个部分来实现的,class、object、refrence。class就是我们所说的类,可以直观的理解为前面章节中所描述的zend_class_entry。object就是实际的对象。每一个zval并不直接包含具体的object,而是通过一个索引--refrence与其联系。也就是说,每个class都有很多个object实例,并把他们统一的放在一个数组里,每个zval只要记住自己相应的key就行了。如此一来,我们在传递zval时候,实际上传递的是一个索引,而不是内存中具体的对象数据。


Expand Down

0 comments on commit 30f04d2

Please sign in to comment.