2012-01-05 18 views
5

Tome la siguiente función, por ejemplo:función de PHP por defecto de parámetros

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

Como se puede ver me inserta la función $this->_config->db() en el parámetro $target ya que es el valor por defecto. Entiendo que esta no es la sintaxis correcta y estoy tratando de explicar mi objetivo.

$this->_config->db() es una función getter.

Ahora sé que puedo usar una función anónima y llamarla a través de $target más tarde, pero quiero $target para aceptar también valores de cadena directa.

¿Cómo podría darle un valor predeterminado de lo que devuelve $this->_config->db() y aún así poder sobreescribirlo con un valor de cadena?

Respuesta

7

Por qué no aceptar valores NULL por defecto (prueba con is_null()) y si es así llamar a su función por defecto?

+0

Esto es lo que usé y el método menos ofensivo proporcionado, gracias. 'if (is_null ($ target)) $ target = $ this -> _ config-> db();' –

1

Me gustaría realizar una comprobación para ver si se pasa un valor y llamar a mi función en un simple control dentro del método:

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

En cualquier otro lugar me parece "nulo" como valor predeterminado y usted utilizó una cadena vacía. ¿Puedo preguntar por qué? ¿Es porque quieres que esté en el mismo tipo (cadena) que el valor personalizado? ¿Alguna razón en PHP para hacer eso? Tengo curiosidad. – TheFrost

2

Puede utilizar is_callable() y 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

¿Pero el OP quiere llamar a un método específico por defecto en lugar de aceptar llamadas arbitrarias? – user268396

+1

Bueno, simplemente puedes eliminar la primera sección del árbol 'elseif'. Esta versión todavía lo hace, solo da la opción adicional de pasar una función. – DaveRandom

Cuestiones relacionadas