【HHVM】HHVM中类型和PHP类型的转换

66. 实例化hiphop 已有的hiphop类对象,并调用构造函数
如:
Php 中定义了一个类:
Class A {
Public $a;
Public $b;
Public function __construct($a,$b){
$this->a=$a;
$this->b=$b
}
}
当通过hhvm转换后,这个A的类会生成一个hiphop的类为:c_A

Hiphop 实例化A并且通过构造函数对其进行成员变量的封装:
Object f_getObjectClass(CVarRef v) {

Object *obj = new Object();
HPHP::CStrRef ss = v.toCStrRef();
Array* params=new Array();
 params->append(Variant("aaaaaa"));
 params->append(Variant("bbbbbb"));
/*第一个参数是类的名称如:c_A
  第二个参数是构造函数的参数,这个必须得有带参的构造函数,否则值是设置不进去的,
  而且参数是按顺序进行遍历的;
  第三个参数是对对象进行构造函数初始化
*/
Object aa=create_object(ss,*params,true);
return aa; 
}

在头文件中需要引入
#include <runtime/base/externals.h>
这个头文件,create_object函数在这个文件中进行声明的

Create_Object实现是在bytecode.cpp文件中1365行,这个是hhvm的实现
create_object在builtin_functions.cpp的1012行是对外的create_object接口函数,分支是走hhvm还是走hphp


object调用php类的成员方法和使用类的成员变量
class AA {
public $a;
public $b;
function __construct($a, $b) {
  $this->a = $a;
  $this->b = $b;
}
function print_members() {
  echo "a: $this->a\nb: $this->b\n";
  echo "hello\n";
}
function print_string($str) {
  echo "print: $str\n";
}
}
1)使用类的成员变量
Object aa = create_object(className, *params, true);
 Variant vars = f_get_object_vars(aa); //获取 通过传入对象获取对象的成员集合
Array varNames = f_get_class_vars(className); // 通过类名获取类下的所有成员名称
for(ArrayIter iter(varNames); iter; ++iter) {
  Variant vKey = iter.first();
  cout << vKey.toString().c_str() << ":" << vars[vKey].toString().c_str() << endl;
}

2)object调用php类的成员方法
Object aa = create_object(className, *params, true); // hhvm中创建的object(这个object的类是在php代码中定义的)
f_call_user_method(0, "print_members", aa); // print_members是object所属类的方法(这个例子是不带参数的)
Array* arr_string = new Array();
arr_string->append(Variant("hello world"));
f_call_user_method(1, "print_string", aa, *arr_string);


遍历Array的几种方法
1)Array* params = new Array();
     params->append(Variant(a));
2)Array value = Array::create();
     value.set(this->result_field, this->result[key]);


类型转换
1)Variant -> Object:
    void c_Processor::t_follow(CVarRef followee) {
      c_Processor* m_followee = followee.toObject().getTyped<c_Processor>();
    }
2)Object -> Variant


HHVM中返回一个自定义类型(如return c_TestClass类型的返回值)
1)可以参照ext_xmlwriter.cpp中的f_xmlwriter_open_uri来实现
2)声明返回值类型为Object
3)c_TestClass* x = new c_TestClass();
     Object ret(x)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值