Merge branch 'MDL-62891-master-callable_name' of git://github.com/mudrd8mz/moodle

This commit is contained in:
Eloy Lafuente (stronk7) 2018-10-10 23:29:40 +02:00
commit 19456c3956
3 changed files with 74 additions and 2 deletions

View 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());
}
}

View 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;
}
}

View 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',
],
];
}
}