PHP, установить параметр функции по умолчанию для результата функции

0

В 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 вызывается метод, но я хотел бы сделать это внутри замедления метода. Как я могу это сделать?

  • 1
    Смотрите ответ на этот вопрос
  • 2
    Документация ясна: The default value must be a constant expression, not (for example) a variable, a class member or a function call.
Показать ещё 3 комментария
Теги:
function

3 ответа

4
Лучший ответ

Это правильно сказано в документах, это невозможно.

Поэтому вместо этого он должен быть реализован следующим образом...

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);
}
  • 1
    Это тоже правильно, молодец.
0

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

Переданный в обратном вызове должен быть в текущей области, которая должна быть вызвана успешно.

0
public static function sha512($token,$cost = 50000,$salt) {
    $salt = self::generateToken(16);
    $salt = '$6$rounds=' . $cost . '$' . $salt . ' $';
    return crypt($token, $salt);
}
  • 1
    Добро пожаловать в переполнение стека! Настоятельно рекомендуется включить некоторую прозу, которая поможет другим понять, почему или как ваше решение решает вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню