PHP функция как параметр по умолчанию - PullRequest
5 голосов
/ 05 января 2012

Возьмите следующую функцию, например:

private function connect($method, $target = $this->_config->db()) {
    try {
        if (!($this->_pointer = @fopen($target, $method)))
            throw new Exception("Unable to connect to database");
    }  catch (Exception $e) {
            echo $e->getMessage();
    }
}

Как видите, я вставил функцию $this->_config->db() в параметр $target в качестве значения по умолчанию. Я понимаю, что это неправильный синтаксис, и я просто пытаюсь объяснить мою цель.

$this->_config->db() - функция получения.

Теперь я знаю, что могу использовать анонимную функцию и вызывать ее через $target позже, но я хочу, чтобы $target также принимал прямые строковые значения.

Как я могу дать ему значение по умолчанию того, что возвращается $this->_config->db(), и при этом иметь возможность перезаписать его строковым значением?

Ответы [ 3 ]

7 голосов
/ 05 января 2012

Почему бы не принять значения NULL по умолчанию (проверить с помощью is_null()) и, если это так, вызвать функцию по умолчанию?

2 голосов
/ 05 января 2012

Вы можете использовать is_callable() и is_string().

private function connect($method, $target = NULL) {
    if (is_callable($target)) {
        // We were passed a function
        $stringToUse = $target();
    } else if (is_string($target)) {
        // We were passed a string
        $stringToUse = $target;
    } else if ($target === NULL) {
        // We were passed nothing
        $stringToUse = $this->_config->db();
    } else {
        // We were passed something that cannot be used
        echo "Invalid database target argument";
        return;
    }
    try {
        if (!($this->_pointer = @fopen($stringToUse, $method)))
            throw new Exception("Unable to connect to database");
    }  catch (Exception $e) {
            echo $e->getMessage();
    }
}
1 голос
/ 05 января 2012

Я бы проверил, было ли передано значение, и вызвал бы мою функцию в простой проверке внутри метода:

private function connect($method, $target = '') {
    try {
        if ($target === '') {
            $target = $this->_config->db()
        }

        if (!($this->_pointer = @fopen($target, $method))) {
            throw new Exception("Unable to connect to database");
        }
    } catch (Exception $e) {
        echo $e->getMessage();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...