GET_REFLECTION_OBJECT_PTR(mptr);
- if ((!(mptr->common.fn_flags & ZEND_ACC_PUBLIC)
- || (mptr->common.fn_flags & ZEND_ACC_ABSTRACT))
- && intern->ignore_visibility == 0)
- {
- if (mptr->common.fn_flags & ZEND_ACC_ABSTRACT) {
- zend_throw_exception_ex(reflection_exception_ptr, 0,
- "Trying to invoke abstract method %s::%s()",
- ZSTR_VAL(mptr->common.scope->name), ZSTR_VAL(mptr->common.function_name));
- } else {
- zend_throw_exception_ex(reflection_exception_ptr, 0,
- "Trying to invoke %s method %s::%s() from scope %s",
- mptr->common.fn_flags & ZEND_ACC_PROTECTED ? "protected" : "private",
- ZSTR_VAL(mptr->common.scope->name), ZSTR_VAL(mptr->common.function_name),
- ZSTR_VAL(Z_OBJCE_P(getThis())->name));
- }
+ if (mptr->common.fn_flags & ZEND_ACC_ABSTRACT) {
+ zend_throw_exception_ex(reflection_exception_ptr, 0,
+ "Trying to invoke abstract method %s::%s()",
+ ZSTR_VAL(mptr->common.scope->name), ZSTR_VAL(mptr->common.function_name));
+ return;
+ }
+
+ if (!(mptr->common.fn_flags & ZEND_ACC_PUBLIC) && intern->ignore_visibility == 0) {
+ zend_throw_exception_ex(reflection_exception_ptr, 0,
+ "Trying to invoke %s method %s::%s() from scope %s",
+ mptr->common.fn_flags & ZEND_ACC_PROTECTED ? "protected" : "private",
+ ZSTR_VAL(mptr->common.scope->name), ZSTR_VAL(mptr->common.function_name),
+ ZSTR_VAL(Z_OBJCE_P(getThis())->name));
return;
}
--- /dev/null
+--TEST--
+ReflectionMethod::invoke() on an abstract method should fail even after calling setAccessible(true)
+--FILE--
+<?php
+
+abstract class Test {
+ abstract static function foo();
+}
+
+$rm = new ReflectionMethod('Test', 'foo');
+$rm->setAccessible(true);
+try {
+ var_dump($rm->invoke(null));
+} catch (ReflectionException $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Trying to invoke abstract method Test::foo()