如何解决这个重名错误?
How to resolve this duplicate name error?
我想创建一个本机原始数据类型扩展,这对强类型很有用。我首先定义了一个名为 ObjectInterface
的接口,然后是一个名为 Object 的 class。显然,Object 实现了 ObjectInterface
,我有以下代码:
/* {{{ scalarclass_functions[]
*
* Every user visible function must have an entry in scalarclass_functions[].
*/
const zend_function_entry scalarclass_functions[] = {
PHP_ABSTRACT_ME(ObjectInterface, equals, arginfo_object)
PHP_ABSTRACT_ME(ObjectInterface, getClass, arginfo_void)
PHP_ABSTRACT_ME(ObjectInterface, getClassName, arginfo_void)
PHP_ABSTRACT_ME(ObjectInterface, hashCode, arginfo_void)
PHP_ABSTRACT_ME(ObjectInterface, __toString, arginfo_void)
PHP_ME(Object, equals, arginfo_object, ZEND_ACC_PUBLIC)
PHP_ME(Object, getClass, arginfo_void, ZEND_ACC_PUBLIC)
PHP_ME(Object, getClassName, arginfo_void, ZEND_ACC_PUBLIC)
PHP_ME(Object, hashCode, arginfo_void, ZEND_ACC_PUBLIC)
PHP_ME(Object, __toString, arginfo_void, ZEND_ACC_PUBLIC)
PHP_FE_END /* Must be the last line in scalarclass_functions[] */
};
当然,这只是代码的一部分,我没有显示对象 class' 方法的方法定义,因为代码可能有点长且分散注意力。然后我 运行 遇到了一个问题,它给了我对象 class 方法的重复名称错误。
PHP Warning: Function registration failed - duplicate name - equals in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - getClass in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - getClassName in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - hashcode in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - __toString in Unknown on line 0
编译器似乎无法分辨方法 Object::equals()
和 ObjectInterface::equals()
是不同的方法,而是假定它们是相同的并抛出重名警告。我该如何解决这个问题?
我试图定义第二个 zend_function_entry
结构,但它也不起作用,因为第二个 zend_function_entry
只是被编译器忽略了。我看到 PHP 内置的 DateTime 和 Reflection 扩展能够解决这个问题,但这怎么可能?
您必须将这两个 zend_function_entries 与 INIT_CLASS_ENTRY 宏一起用作相应 class 条目的方法条目,并在 MINIT 中注册您的 class。
模块结构的 zend_function_entry 只能有函数,不能有方法。
我想创建一个本机原始数据类型扩展,这对强类型很有用。我首先定义了一个名为 ObjectInterface
的接口,然后是一个名为 Object 的 class。显然,Object 实现了 ObjectInterface
,我有以下代码:
/* {{{ scalarclass_functions[]
*
* Every user visible function must have an entry in scalarclass_functions[].
*/
const zend_function_entry scalarclass_functions[] = {
PHP_ABSTRACT_ME(ObjectInterface, equals, arginfo_object)
PHP_ABSTRACT_ME(ObjectInterface, getClass, arginfo_void)
PHP_ABSTRACT_ME(ObjectInterface, getClassName, arginfo_void)
PHP_ABSTRACT_ME(ObjectInterface, hashCode, arginfo_void)
PHP_ABSTRACT_ME(ObjectInterface, __toString, arginfo_void)
PHP_ME(Object, equals, arginfo_object, ZEND_ACC_PUBLIC)
PHP_ME(Object, getClass, arginfo_void, ZEND_ACC_PUBLIC)
PHP_ME(Object, getClassName, arginfo_void, ZEND_ACC_PUBLIC)
PHP_ME(Object, hashCode, arginfo_void, ZEND_ACC_PUBLIC)
PHP_ME(Object, __toString, arginfo_void, ZEND_ACC_PUBLIC)
PHP_FE_END /* Must be the last line in scalarclass_functions[] */
};
当然,这只是代码的一部分,我没有显示对象 class' 方法的方法定义,因为代码可能有点长且分散注意力。然后我 运行 遇到了一个问题,它给了我对象 class 方法的重复名称错误。
PHP Warning: Function registration failed - duplicate name - equals in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - getClass in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - getClassName in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - hashcode in Unknown on line 0
PHP Warning: Function registration failed - duplicate name - __toString in Unknown on line 0
编译器似乎无法分辨方法 Object::equals()
和 ObjectInterface::equals()
是不同的方法,而是假定它们是相同的并抛出重名警告。我该如何解决这个问题?
我试图定义第二个 zend_function_entry
结构,但它也不起作用,因为第二个 zend_function_entry
只是被编译器忽略了。我看到 PHP 内置的 DateTime 和 Reflection 扩展能够解决这个问题,但这怎么可能?
您必须将这两个 zend_function_entries 与 INIT_CLASS_ENTRY 宏一起用作相应 class 条目的方法条目,并在 MINIT 中注册您的 class。
模块结构的 zend_function_entry 只能有函数,不能有方法。