77-创建对象实例

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

77-创建对象实例

为了操作一个对象,我们需要先获取这个对象的实例,而这有肯定会涉及调用对象的构造方法。首先我们先了解下一个object在PHP内核中到底是如何实现的。

typedef struct _zend_object_value {
    zend_object_handle handle;
    zend_object_handlers *handlers;
} zend_object_value;

//此外再回顾一下zval的值value的结构。
typedef union _zvalue_value {
    long lval;                  /* long value */
    double dval;                /* double value */
    struct {
        char *val;
        int len;
    } str;
    HashTable *ht;              /* hash table value */
    zend_object_value obj;
} zvalue_value;

如果我们有一个zval *tmp,那么tmp->value.obj来访问到最终保存对象实例的zend_object_value结构体,它包含两个成员:

  • zend_object_handle handle:最终实现是一个unsigned int值,Zend会把每个对象放进数组里,这个handle就是此实例的索引。所以我们在把对象当作参数传递时,只不过是传递的handle罢了,这样对性能有利,同时也是对象的引用机制的原理。
  • zend_object_handlers *handlers:这个里面是一组函数指针,我们可以通过它来对象进行一些操作,比如:添加引用、获取属性等。此结构体在Zend/zend_object_handlers.h里定义。

下面我给出这个类的PHP语言实现,让我们在扩展中实现它,并生成它。

<?php
class baby
{
    public function __construct()
    {
        echo "a new baby!\n";
    }   

    public function hello()
    {
        echo "hello world!\n";
    }
}

function test_call()
{
    $obj = new baby();
    $obj->hello();
}
?>

下面我们在扩展中实现以上test_call函数。

zend_class_entry *baby_ce;

ZEND_FUNCTION(test_call)
{
    zval *obj;
    MAKE_STD_ZVAL(obj);
    object_init_ex(obj, baby_ce);

    //如果确认此类没有构造函数就不用调用了。
    walu_call_user_function(NULL, obj, "__construct", "");

    walu_call_user_function(NULL, obj, "hello", "");
    zval_ptr_dtor(&obj);
    return;
}

ZEND_METHOD(baby, __construct)
{
    printf("a new baby!\n");
}

ZEND_METHOD(baby, hello)
{
    printf("hello world!!!!!\n");
}

static zend_function_entry baby_method[]={
    ZEND_ME(baby, __construct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
    ZEND_ME(baby, hello, NULL, ZEND_ACC_PUBLIC)
    {NULL, NULL, NULL}
};

ZEND_MINIT_FUNCTION(test)
{
    zend_class_entry ce;
    INIT_CLASS_ENTRY(ce, "baby", baby_method);
    baby_ce = zend_register_internal_class(&ce TSRMLS_CC);
    return SUCCESS;
}

创建对象(实例))的4种方式

public class Dog{ public Dog(){ super(); } } 1、创建对象有什么难的,我们new一个就是的………………对,没错,这只是其中一种 Dog j...
  • cadi2011
  • cadi2011
  • 2016年06月17日 10:38
  • 3742

Java创建对象实例的三种方法

Java创建对象实例的三种方法(2009-11-24 01:01:07)转载标签:杂谈Java有一下三种方法可以创建对象实例。1.new通常都是使用java的关键字new来创建对象实例。若有一个Som...
  • zdy32032319861105
  • zdy32032319861105
  • 2010年11月12日 09:35
  • 1090

Java反射机制创建对象

package lxf; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang...
  • smartboy_01
  • smartboy_01
  • 2014年04月08日 18:48
  • 30343

对象类的创建和实例化

Object实例化、访问对象属性使用对象字面量表示法,JavaScript定义类的五种方式...
  • darical
  • darical
  • 2016年03月11日 16:25
  • 194

c#根据字符串创建对象实例

在做项目中,有时候需要根据类的完全限定字符串,动态的实例化对象,在c#中有4种途径,下面的代码都是测试通过的 新建一个控制台应用程序,命名成ConsoleApplication1,添加HelloWo...
  • XuWei_XuWei
  • XuWei_XuWei
  • 2014年07月01日 12:11
  • 3349

Asp.net中使用对象的实例

public class Key { private int shape; public Key(int newshape) { shape = newshape; } public int Sh...
  • web718
  • web718
  • 2005年03月21日 16:49
  • 617

C# 根据对象类完整名称,创建对象实例

/// /// 根据指定的类全名,返回对象实例 /// /// 对象完整名称(包名和类名),如:com.xxx.Test publi...
  • mm33211
  • mm33211
  • 2012年11月03日 16:23
  • 7358

用关键字new创建对象 new都做了什么(随笔)

深入讨论new操作符创建新实例对象的过程。
  • h15882065951
  • h15882065951
  • 2017年04月09日 20:33
  • 848

java中有些特殊的类不需要或不能创建实例对象!

一, 不能创建对象的类抽象类(abstract)不能创建对象。这个大家应该都知道,所以在这里就不班门弄斧了。 简单回顾需要注意的几点: 包含抽象方法的类,必须声明为抽象类。 声明为抽象类的类,不一定...
  • gao_zhennan
  • gao_zhennan
  • 2017年11月11日 18:02
  • 256

java加载类创建对象的过程以及静态代码段的执行时机

静态代码段只有在需要的时候才会引发: 什么时候需要呢? Outer.Inner inner;或Outer.Inner innner=null;只是定义变量而已不会引发静态代码段,但是应该会检查这个...
  • u010476739
  • u010476739
  • 2014年11月23日 12:05
  • 760
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:77-创建对象实例
举报原因:
原因补充:

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