]> granicus.if.org Git - php/commitdiff
Fix #79462: method_exists and property_exists incoherent behavior
authorChristoph M. Becker <cmbecker69@gmx.de>
Thu, 9 Apr 2020 08:55:53 +0000 (10:55 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Thu, 9 Apr 2020 09:38:47 +0000 (11:38 +0200)
Both functions are closely related, so should behave the same for wrong
input types, i.e. both should throw a TypeError.

NEWS
Zend/zend_builtin_functions.c
ext/standard/tests/class_object/method_exists_variation_001.phpt

diff --git a/NEWS b/NEWS
index 1c25db5f0889af10bdebecfa9d09d89154fdbed0..2d1cc8a15c49720599f9a4fe7f2e70817fb2cac9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,8 @@ PHP                                                                        NEWS
     abstract trait function). (Nikita)
   . Fixed bug #62609 (Allow implementing Traversable on abstract classes).
     (Nikita)
+  . Fixed bug #79462 (method_exists and property_exists incoherent behavior).
+    (cmb)
 
 - CURL:
   . Bumped required libcurl version to 7.29.0. (cmb)
index 3b0e05c21283e2714b880f9d1c2475c79fc4762a..4753e9b7c1cb3a2b0faffd8af8f3135bb8bb74a5 100644 (file)
@@ -1107,7 +1107,8 @@ ZEND_FUNCTION(method_exists)
                        RETURN_FALSE;
                }
        } else {
-               RETURN_FALSE;
+               zend_argument_type_error(1, "must be of type object|string, %s given", zend_zval_type_name(klass));
+               RETURN_THROWS();
        }
 
        lcname = zend_string_tolower(method_name);
index 3ad49456c63acfd35abf2cf8e76fb772ad621d06..b408b8eb0dcbc0ebb9a30b9d527b6efed10a475c 100644 (file)
@@ -78,7 +78,11 @@ $values = array(
 
 foreach($values as $value) {
       echo "\nArg value $value \n";
-      var_dump( method_exists($value, $method) );
+      try {
+        var_dump( method_exists($value, $method) );
+      } catch (TypeError $e) {
+        echo $e->getMessage(), PHP_EOL;
+      }
 };
 
 echo "Done";
@@ -89,69 +93,69 @@ Error: 2 - Undefined variable $undefined_var
 Error: 2 - Undefined variable $unset_var
 
 Arg value 0 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, int given
 
 Arg value 1 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, int given
 
 Arg value 12345 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, int given
 
 Arg value -2345 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, int given
 
 Arg value 10.5 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, float given
 
 Arg value -10.5 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, float given
 
 Arg value 101234567000 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, float given
 
 Arg value 1.07654321E-9 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, float given
 
 Arg value 0.5 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, float given
 Error: 2 - Array to string conversion
 
 Arg value Array 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, array given
 Error: 2 - Array to string conversion
 
 Arg value Array 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, array given
 Error: 2 - Array to string conversion
 
 Arg value Array 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, array given
 Error: 2 - Array to string conversion
 
 Arg value Array 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, array given
 Error: 2 - Array to string conversion
 
 Arg value Array 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, array given
 
 Arg value  
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, null given
 
 Arg value  
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, null given
 
 Arg value 1 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, bool given
 
 Arg value  
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, bool given
 
 Arg value 1 
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, bool given
 
 Arg value  
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, bool given
 
 Arg value  
 bool(false)
@@ -168,8 +172,8 @@ In autoload(String)
 bool(false)
 
 Arg value  
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, null given
 
 Arg value  
-bool(false)
+method_exists(): Argument #1 ($object_or_class) must be of type object|string, null given
 Done