]> granicus.if.org Git - php/commitdiff
Fix is_callable() on abstract method via object
authorNikita Popov <nikic@php.net>
Thu, 14 Jul 2016 19:38:10 +0000 (21:38 +0200)
committerNikita Popov <nikic@php.net>
Thu, 14 Jul 2016 19:41:41 +0000 (21:41 +0200)
Zend/zend_API.c
ext/standard/tests/general_functions/is_callable_abstract_method.phpt [new file with mode: 0644]

index 3ba1783f1fb761c9334673a03a225accfab3dae4..55c6be8711e56426407b8a9573bf73269b13f4f7 100644 (file)
@@ -3100,7 +3100,7 @@ get_function_via_handler:
 
        if (retval) {
                if (fcc->calling_scope && !call_via_handler) {
-                       if (!fcc->object && (fcc->function_handler->common.fn_flags & ZEND_ACC_ABSTRACT)) {
+                       if (fcc->function_handler->common.fn_flags & ZEND_ACC_ABSTRACT) {
                                if (error) {
                                        zend_spprintf(error, 0, "cannot call abstract method %s::%s()", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(fcc->function_handler->common.function_name));
                                        retval = 0;
diff --git a/ext/standard/tests/general_functions/is_callable_abstract_method.phpt b/ext/standard/tests/general_functions/is_callable_abstract_method.phpt
new file mode 100644 (file)
index 0000000..0f3d1a6
--- /dev/null
@@ -0,0 +1,19 @@
+--TEST--
+is_callable() on abstract method via object should return false
+--FILE--
+<?php
+
+abstract class A {
+    abstract function foo();
+}
+
+class B extends A {
+    function foo() {}
+}
+
+$foo = [new B, 'A::foo'];
+var_dump(is_callable($foo));
+
+?>
+--EXPECT--
+bool(false)