Browse Source

Add getClass for php Descriptor in c extension (#3443)

Paul Yang 8 years ago
parent
commit
25672c1757

+ 11 - 0
php/ext/google/protobuf/def.c

@@ -184,6 +184,7 @@ void gpb_type_init(TSRMLS_D) {
 // -----------------------------------------------------------------------------
 
 static zend_function_entry descriptor_methods[] = {
+  PHP_ME(Descriptor, getClass, NULL, ZEND_ACC_PUBLIC)
   PHP_ME(Descriptor, getFullName, NULL, ZEND_ACC_PUBLIC)
   PHP_ME(Descriptor, getField, NULL, ZEND_ACC_PUBLIC)
   PHP_ME(Descriptor, getFieldCount, NULL, ZEND_ACC_PUBLIC)
@@ -234,6 +235,16 @@ static void descriptor_init_c_instance(Descriptor *desc TSRMLS_DC) {
   desc->json_serialize_handlers_preserve = NULL;
 }
 
+PHP_METHOD(Descriptor, getClass) {
+  Descriptor *intern = UNBOX(Descriptor, getThis());
+#if PHP_MAJOR_VERSION < 7
+  const char* classname = intern->klass->name;
+#else
+  const char* classname = ZSTR_VAL(intern->klass->name);
+#endif
+  PHP_PROTO_RETVAL_STRINGL(classname, strlen(classname), 1);
+}
+
 PHP_METHOD(Descriptor, getFullName) {
   Descriptor *intern = UNBOX(Descriptor, getThis());
   const char* fullname = upb_msgdef_fullname(intern->msgdef);

+ 1 - 0
php/ext/google/protobuf/protobuf.h

@@ -508,6 +508,7 @@ PHP_PROTO_WRAP_OBJECT_START(Descriptor)
   const upb_handlers* json_serialize_handlers_preserve;
 PHP_PROTO_WRAP_OBJECT_END
 
+PHP_METHOD(Descriptor, getClass);
 PHP_METHOD(Descriptor, getFullName);
 PHP_METHOD(Descriptor, getField);
 PHP_METHOD(Descriptor, getFieldCount);

+ 4 - 1
php/tests/descriptors_test.php

@@ -75,9 +75,12 @@ class DescriptorsTest extends TestBase
     public function testDescriptor()
     {
         $pool = DescriptorPool::getGeneratedPool();
-        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
+        $class = get_class(new TestDescriptorsMessage());
+        $this->assertSame('Descriptors\TestDescriptorsMessage', $class);
+        $desc = $pool->getDescriptorByClassName($class);
 
         $this->assertSame('descriptors.TestDescriptorsMessage', $desc->getFullName());
+        $this->assertSame($class, $desc->getClass());
 
         $this->assertInstanceOf('\Google\Protobuf\FieldDescriptor', $desc->getField(0));
         $this->assertSame(7, $desc->getFieldCount());