2009-05-05 5 views
9

Así que, básicamente, lo entiendo ...constructo PHP de clase con tres parámetros opcionales pero uno requerido?

class User 
{ 
    function __construct($id) {} 
} 

$u = new User(); // PHP would NOT allow this 

Quiero ser capaz de hacer un usuario mira para arriba con cualquiera de los siguientes parámetros, pero al menos uno está obligado, mientras se mantiene el manejo de errores por defecto PHP provee si no se pasa ningún parámetro ...

class User 
{ 
    function __construct($id=FALSE,$email=FALSE,$username=FALSE) {} 
} 

$u = new User(); // PHP would allow this 

¿Hay alguna manera de hacerlo?

+0

¿Cómo le gustaría construir una instancia de usuario con solo el parámetro de correo electrónico? Pasar nulo por id? –

Respuesta

24

Se podría utilizar una matriz para hacer frente a un parámetro específico:

function __construct($param) { 
    $id = null; 
    $email = null; 
    $username = null; 
    if (is_int($param)) { 
     // numerical ID was given 
     $id = $param; 
    } elseif (is_array($param)) { 
     if (isset($param['id'])) { 
      $id = $param['id']; 
     } 
     if (isset($param['email'])) { 
      $email = $param['email']; 
     } 
     if (isset($param['username'])) { 
      $username = $param['username']; 
     } 
    } 
} 

Y cómo se puede utilizar la siguiente:

// ID 
new User(12345); 
// email 
new User(array('email'=>'[email protected]')); 
// username 
new User(array('username'=>'John Doe')); 
// multiple 
new User(array('username'=>'John Doe', 'email'=>'[email protected]')); 
1

Esto dejaría que se ejecute y escribe un error en función de su config.

class User 
{ 
    function __construct($id,$email,$username) 
    { 
     if($id == null && $email == null && $username == null){ 
      error_log("Required parameter on line ".__LINE__." in file ".__FILE__); 
      die(); 
     } 
    } 
} 

$u = new User(); 
+0

Eso no llegaría a la instrucción if inside, $ u = new User() fallará porque no proporcionó parámetros que no tengan valores predeterminados. – seanmonstar

+0

@seanmonstar sí de hecho. Eso es lo que el OP quería: $ u = new User(); // PHP permitiría esto –

+0

Esto no funcionó para mí. Según http://php.net/manual/en/functions.arguments.php, debe establecer implícitamente un valor predeterminado como este:'__construct ($ id = null, $ email = null, $ username = null) 'y ahora puedo llamar 'new User();' - PHP Version 5.6.24 – DerpyNerd

Cuestiones relacionadas