Merge branch 'MDL-62891-master-callable_name' of git://github.com/mudrd8mz/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 10 Oct 2018 21:29:40 +0000 (23:29 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Wed, 10 Oct 2018 21:29:40 +0000 (23:29 +0200)
lib/classes/shutdown_manager.php
lib/moodlelib.php
lib/tests/moodlelib_test.php

index 2a11ae2..b1c71ad 100644 (file)
@@ -80,10 +80,10 @@ class core_shutdown_manager {
                     call_user_func_array($callback, $params);
                 }
             } catch (Exception $e) {
-                error_log('Exception ignored in shutdown function '.var_export($callback, true).':'.$e->getMessage());
+                error_log('Exception ignored in shutdown function '.get_callable_name($callback).': '.$e->getMessage());
             } catch (Throwable $e) {
                 // Engine errors in PHP7 throw exceptions of type Throwable (this "catch" will be ignored in PHP5).
-                error_log('Exception ignored in shutdown function '.var_export($callback, true).':'.$e->getMessage());
+                error_log('Exception ignored in shutdown function '.get_callable_name($callback).': '.$e->getMessage());
             }
         }
 
index 65923f0..ef21b05 100644 (file)
@@ -10178,3 +10178,22 @@ class lang_string {
         return $this->component;
     }
 }
+
+/**
+ * Get human readable name describing the given callable.
+ *
+ * This performs syntax check only to see if the given param looks like a valid function, method or closure.
+ * It does not check if the callable actually exists.
+ *
+ * @param callable|string|array $callable
+ * @return string|bool Human readable name of callable, or false if not a valid callable.
+ */
+function get_callable_name($callable) {
+
+    if (!is_callable($callable, true, $name)) {
+        return false;
+
+    } else {
+        return $name;
+    }
+}
index ef256b4..a228754 100644 (file)
@@ -4082,4 +4082,57 @@ class core_moodlelib_testcase extends advanced_testcase {
             ],
         ];
     }
+
+    /**
+     * Test that {@link get_callable_name()} describes the callable as expected.
+     *
+     * @dataProvider callable_names_provider
+     * @param callable $callable
+     * @param string $expectedname
+     */
+    public function test_get_callable_name($callable, $expectedname) {
+        $this->assertSame($expectedname, get_callable_name($callable));
+    }
+
+    /**
+     * Provides a set of callables and their human readable names.
+     *
+     * @return array of (string)case => [(mixed)callable, (string|bool)expected description]
+     */
+    public function callable_names_provider() {
+        return [
+            'integer' => [
+                386,
+                false,
+            ],
+            'boolean' => [
+                true,
+                false,
+            ],
+            'static_method_as_literal' => [
+                'my_foobar_class::my_foobar_method',
+                'my_foobar_class::my_foobar_method',
+            ],
+            'static_method_of_literal_class' => [
+                ['my_foobar_class', 'my_foobar_method'],
+                'my_foobar_class::my_foobar_method',
+            ],
+            'static_method_of_object' => [
+                [$this, 'my_foobar_method'],
+                'core_moodlelib_testcase::my_foobar_method',
+            ],
+            'method_of_object' => [
+                [new lang_string('parentlanguage', 'core_langconfig'), 'my_foobar_method'],
+                'lang_string::my_foobar_method',
+            ],
+            'function_as_literal' => [
+                'my_foobar_callback',
+                'my_foobar_callback',
+            ],
+            'function_as_closure' => [
+                function($a) { return $a; },
+                'Closure::__invoke',
+            ],
+        ];
+    }
 }