2012-01-05 19 views
5

Prendere la seguente funzione per esempio:funzione PHP come parametri di default

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

Come potete vedere ho inserito la funzione $this->_config->db() nel parametro $target come valore di default. Capisco che questa non sia la sintassi corretta e sto solo cercando di spiegare il mio scopo.

$this->_config->db() è una funzione getter.

Ora so che posso utilizzare una funzione anonima e chiamarla tramite $target in seguito, ma desidero che lo $target accetti anche i valori di stringa diretta.

Come potrei assegnargli un valore predefinito di quello che viene restituito da $this->_config->db() ed essere ancora in grado di sovrascriverlo con un valore stringa?

risposta

7

Perché non accetta i valori NULL per default (test con is_null()) e in tal caso chiamare la funzione di default?

+0

Questo è quello che ho usato e il metodo meno invadente fornito, grazie. 'if (is_null ($ target)) $ target = $ this -> _ config-> db();' –

1

vorrei eseguire un controllo per vedere se è stato passato un valore e chiamare la mia funzione in un semplice controllo all'interno del metodo:

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

Ovunque altro trovo "null" come valore predefinito e hai usato una stringa vuota. Posso chiedere perchè? È perché vuoi che sia nello stesso tipo (stringa) come potrebbe essere il valore personalizzato? Qualche ragione in PHP per farlo? Sono solo curioso. – TheFrost

2

È possibile utilizzare is_callable() e 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

Ma l'OP vuole chiamare un metodo specifico per impostazione predefinita piuttosto che accettare un chiamabile arbitrario? – user268396

+1

Bene, puoi semplicemente rimuovere la prima sezione dell'albero 'elseif'. Questa versione lo fa ancora, offre solo l'opzione extra di passare una funzione. – DaveRandom

Problemi correlati