Функция PHP как параметр по умолчанию

Возьмем следующую функцию:

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() и все еще можно перезаписать его строковым значением?

Related of "Функция PHP как параметр по умолчанию"

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

Вы можете использовать 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(); } } 

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

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