Возьмем следующую функцию:
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()
и все еще можно перезаписать его строковым значением?
Почему бы не принять значения 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(); } }