В PHP вы можете иметь необязательные параметры для функции:
public static function test($var = 'default string')
Но я хочу, чтобы значение по умолчанию было возвращенным значением из другой функции. Например, у меня есть метод, называемый generateToken()
который создает случайную строку требуемой длины. Я попытался выполнить следующий код...
public static function sha512($token,$cost = 50000,$salt = self::generateToken(16)) {
$salt = '$6$rounds=' . $cost . '$' . $salt . ' $';
return crypt($token, $salt);
}
Однако это вызывает следующую ошибку...
Parse error: syntax error, unexpected '(', expecting ')' in /var/www/www.domain.com/path/to/cryptography.php on line 11
Строка 11 - это линия замедления метода. Я знаю, что это можно сделать, установив значение по умолчанию на что-то вроде 'NONE'
а затем с помощью оператора if вызывается метод, но я хотел бы сделать это внутри замедления метода. Как я могу это сделать?
Это правильно сказано в документах, это невозможно.
Поэтому вместо этого он должен быть реализован следующим образом...
public static function sha512($token,$cost = 50000,$salt = null) {
$salt = ($salt == null) ? (self::generateToken(16)) : ($salt);
$salt = '$6$rounds=' . $cost . '$' . $salt . ' $';
return crypt($token, $salt);
}
public static function sha512( $token, $cost = 50000, $salt= null )
более конкретно $salt= null
Но я хочу, чтобы значение по умолчанию было возвращенным значением из другой функции.
Сохраняя это намерение, это невозможно в PHP, PHP не поддерживает первоклассные функции. Единственным обходным решением, которое я вижу, как я упоминал в своем комментарии выше, было использование обратных вызовов.
Из того, что я понимаю, параметр $salt
предназначен для использования того, что когда-либо было соль, которое вам может понравиться, или по умолчанию используется по умолчанию в вашем коде.
Итак, вот возможное решение, хотя я считаю, что вы уже ответили на свой вопрос:
public static function sha512( $token, $salt = null, $cost = 50000 ) {
// if a custom salt is provided
if( isset( $salt ) ) {
// calls the callback function passed in as a param
$salt = $salt( 16 );
// assemble the result to your specs
$salt = '$6$rounds=' . $cost . '$' . $salt . ' $';
// return final result
return crypt( $token, $salt );
}
// default if no custom salt is provided
$salt = self::generateToken( 16 );
$salt = '$6$rounds=' . $cost . '$' . $salt . ' $';
// return final result
return crypt( $token, $salt );
}
Переданный в обратном вызове должен быть в текущей области, которая должна быть вызвана успешно.
public static function sha512($token,$cost = 50000,$salt) {
$salt = self::generateToken(16);
$salt = '$6$rounds=' . $cost . '$' . $salt . ' $';
return crypt($token, $salt);
}
The default value must be a constant expression, not (for example) a variable, a class member or a function call.