2012-01-05 20 views
5

podjąć następujące funkcje na przykład:funkcja PHP jako domyślna parametru

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

Jak widać I dodaje funkcję $this->_config->db() do parametru $target jak to wartość domyślna. Rozumiem, że to nie jest poprawna składnia i próbuję wyjaśnić mój cel.

$this->_config->db() to funkcja pobierająca.

Teraz wiem, że mogę użyć anonimowej funkcji i zadzwonić później przez $target, ale chcę, aby $target zaakceptować również bezpośrednie wartości ciągów.

W jaki sposób mogę nadać mu wartość domyślną tego, co jest zwracane przez $this->_config->db() i nadal można go zastąpić wartością ciągu?

Odpowiedz

7

Dlaczego nie może przyjmować wartości NULL domyślnie (test z is_null()), a jeśli tak nazywają domyślną funkcję?

+0

To jest to, czego użyłem i najmniej natarczywa metoda, dzięki. 'if (is_null ($ target)) $ target = $ this -> _ config-> db();' –

1

chciałbym wykonać test, aby sprawdzić, czy wartość została przyjęta i zadzwonić do mojego funkcji w prosty check wewnątrz metody:

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

Wszędzie jeszcze znajduję "null" jako wartość domyślną i używałeś pustego ciągu. Czy mogę zapytać dlaczego? Czy to dlatego, że chcesz, aby był w tym samym typie (łańcuch), jak może być wartość niestandardowa? Każdy powód w PHP to zrobić? Jestem po prostu ciekawy. – TheFrost

2

Można użyć is_callable() i 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(); 
    } 
} 
+0

Ale OP chce nazywać konkretną metodę domyślnie, a nie akceptować arbitralne wywoływanie? – user268396

+1

Cóż, możesz po prostu usunąć pierwszą sekcję drzewa 'elseif'. Ta wersja nadal to robi, po prostu daje dodatkową opcję przejścia funkcji. – DaveRandom

Powiązane problemy