78-对象属性读写

原创 2016年04月27日 13:32:42

78-对象属性读写

这一节主要描述与对象属性有关的东西。有关如何对它进行定义的操作我们已经在上一章中描述过了,这里不再叙述,只讲对其的操作。

读取对象的属性

ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, char *name, int name_length, zend_bool silent TSRMLS_DC);

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则用于读取静态属性。可以看出,静态属性是直接保存在类上的,用具体的对象无关。

silent参数:

  • 0: 如果属性不存在,则抛出一个notice错误。
  • 1: 如果属性不存在,不报错。

如果所查的属性不存在,那么此函数将返回IS_NULL类型的zval。

更新对象的属性:

ZEND_API void zend_update_property(zend_class_entry *scope, zval *object, char *name, int name_length, zval *value TSRMLS_DC);
ZEND_API int zend_update_static_property(zend_class_entry *scope, char *name, int name_length, zval *value TSRMLS_DC);

zend_update_property用来更新对象的属性,zend_update_static_property用来更新类的静态属性。如果对象或者类中没有相关的属性,函数将自动的添加上。

读写对象与类属性的实例

假设我们已经在扩展中定义好下面的类:

class baby
{
    public $age;
    public static $area;

    public function __construct($age, $area)
    {
        $this->age = $age;
        self::$area = $area;

        var_dump($this->age, self::$area);
    }
}

ZEND_METHOD(baby, __construct)
{
    zval *age, *area;
    zend_class_entry *ce;
    ce = Z_OBJCE_P(getThis());
    if( zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &age, &area) == FAILURE )
    {
        printf("Error\n");
        RETURN_NULL();
    }
    zend_update_property(ce, getThis(), "age", sizeof("age")-1, age TSRMLS_CC);
    zend_update_static_property(ce, "area", sizeof("area")-1, area TSRMLS_CC);

    age = NULL;
    area = NULL;

    age = zend_read_property(ce, getThis(), "age", sizeof("age")-1, 0 TSRMLS_DC);
    php_var_dump(&age, 1 TSRMLS_CC);

    area = zend_read_static_property(ce, "area", sizeof("area")-1, 0 TSRMLS_DC);
    php_var_dump(&area, 1 TSRMLS_CC);

}

一些其它的快捷函数

ZEND_API void zend_update_property_null(zend_class_entry *scope, zval *object, char *name, int name_length TSRMLS_DC);
ZEND_API void zend_update_property_bool(zend_class_entry *scope, zval *object, char *name, int name_length, long value TSRMLS_DC);
ZEND_API void zend_update_property_long(zend_class_entry *scope, zval *object, char *name, int name_length, long value TSRMLS_DC);
ZEND_API void zend_update_property_double(zend_class_entry *scope, zval *object, char *name, int name_length, double value TSRMLS_DC);
ZEND_API void zend_update_property_string(zend_class_entry *scope, zval *object, char *name, int name_length, const char *value TSRMLS_DC);
ZEND_API void zend_update_property_stringl(zend_class_entry *scope, zval *object, char *name, int name_length, const char *value, int value_length TSRMLS_DC);


ZEND_API int zend_update_static_property_null(zend_class_entry *scope, char *name, int name_length TSRMLS_DC);
ZEND_API int zend_update_static_property_bool(zend_class_entry *scope, char *name, int name_length, long value TSRMLS_DC);
ZEND_API int zend_update_static_property_long(zend_class_entry *scope, char *name, int name_length, long value TSRMLS_DC);
ZEND_API int zend_update_static_property_double(zend_class_entry *scope, char *name, int name_length, double value TSRMLS_DC);
ZEND_API int zend_update_static_property_string(zend_class_entry *scope, char *name, int name_length, const char *value TSRMLS_DC);
ZEND_API int zend_update_static_property_stringl(zend_class_entry *scope, char *name, int name_length, const char *value, int value_length TSRMLS_DC);

php对象属性读写

读取对象的属性 ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, char *name, int nam...
  • zkaipmoo
  • zkaipmoo
  • 2014年01月11日 13:23
  • 1385

js对象的继承以及公有私有属性的定义和读写

最近想写一些js工具,有些方面需要用到面向对象的方法,比如继承父类属性和方法、通过私有化隐藏某些对象的属性等,因为没有系统的学习js,所以不知道怎么做,觉得很伤脑筋。 今天受到技术群里朋友的提示,并...
  • foren_whb
  • foren_whb
  • 2016年09月21日 14:53
  • 773

Js基础--属性读写操作

今天刚好学习Js的基础知识部分中的属性读写操作,所以进行了整理,这样也帮助自己总结和归纳。      HTML的属性操作分为读和写操作,基本的操作方法就是属性名.属性值。        1)属性读操作...
  • u010297791
  • u010297791
  • 2016年11月27日 10:02
  • 487

Objective-c:属性

简介 属性(property)是Objective-C的一项特性,用于封装对象中的数据。Objective-C对象通常会把其所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”(access ...
  • Hierarch_Lee
  • Hierarch_Lee
  • 2015年11月17日 13:31
  • 1437

什么是类、对象、属性、方法、成员?

日常生活中的所有东西都是对象,而具有同种属性的一类事物被称为类,人、动物、植物、车都是类(是抽象的),而姚明这个人就是一个具体的对象。 对象是类的实例化,比如唐伯虎点秋香里面的小强是蟑螂的实例化。 ...
  • u012767263
  • u012767263
  • 2013年11月28日 10:39
  • 4375

JS 动态删除对象属性

JS中动态删除,用关键字delete var objtest = { prop: 'delete me' }; //或者这么声明的对象 var objtest = new Array...
  • yh88356656
  • yh88356656
  • 2016年10月12日 12:33
  • 1345

JS/jQuery 遍历对象属性

For/In 循环: 循环遍历对象的属性 var person={fname:"John",lname:"Doe",age:25}; for (x in person) { txt=t...
  • enter89
  • enter89
  • 2014年02月25日 10:34
  • 29141

Literacy 快速反射读写对象属性,字段

Literacy 说明 Literacy使用IL指令生成方法委托,性能方面,在调用次数达到一定量的时候比反射高很多 当然,用IL指令生成一个方法也是有时间消耗的,所以在只使用一次或少数...
  • liurong1420
  • liurong1420
  • 2016年07月22日 21:45
  • 197

es6 javascript对象属性的简洁表示法

ES6 允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。 var foo = 'bar'; var baz = {foo}; baz // {foo: "bar"} // 等同于...
  • qq_30100043
  • qq_30100043
  • 2016年12月01日 10:58
  • 1187

moongoose对象无法新增删除属性

昨天用nodes中的moongoose去查询一个结果遇到一个大坑,这个坑貌似用moongoose可能会遇到。背景是这样的,我在nodejs中去查询document,得到的可以看作是一个对象list。在...
  • neal1991
  • neal1991
  • 2016年06月30日 21:40
  • 611
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:78-对象属性读写
举报原因:
原因补充:

(最多只允许输入30个字)