Я пытаюсь напрямую вызвать функцию из статического свойства внутри класса.
Вот выдержка из моего класса:
class Uuid {
const VERSION_3 = 3;
const VERSION_5 = 5;
protected static $hash_function = [
self::VERSION_3 => 'md5',
self::VERSION_5 => 'sha1',
];
protected static function get_hash_value($value_to_hash, $version) {
// None of these work:
//$hash = self::$hash_function[$version]($value_to_hash);
//$hash = (self::$hash_function[$version])($value_to_hash);
//$hash = (self::$hash_function)[$version]($value_to_hash);
// Only this works:
$function = self::$hash_function[$version];
$hash = $function($value_to_hash);
return $hash;
}
}
Пока я нашел единственный способ заставить его работать, это сохранить имя функции во временной переменной ($function
) прежде чем звонить. Я попытался обернуть выражение (или биты выражения) в фигурные скобки, ({
,}
), скобки ((
,)
) с префиксом $
и т.д. но пока ничего не получалось.
Есть ли простой способ сделать это без временной переменной? Если да, то для какой минимальной версии PHP это работает?
Да, как вы обнаружили, вам нужно сохранить имя функции в виде полной строки в виде простой переменной, чтобы иметь возможность вызывать ее. Документацию по этой функции можно найти на http://php.net/manual/en/functions.variable-functions.php
http://php.net/manual/en/function.call-user-func.php другая альтернатива.
call_user_func( static::$hash_function[$version], $value_to_hash );
Смотрите также is_callable (), call_user_func (), переменные переменные а также function_exists ().
Других решений пока нет …