2009-05-05 8 views
9

Donc, fondamentalement, je comprends ...PHP Class construit avec trois paramètres facultatifs mais un requis?

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

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

Je veux être en mesure de faire un utilisateur regarde avec l'un des paramètres suivants, mais au moins est nécessaire, tout en gardant l'erreur par défaut de manipulation PHP fournit si aucun paramètre n'est passé ...

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

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

Existe-t-il un moyen de le faire?

+0

Comment voudriez-vous construire une instance d'utilisateur avec juste le paramètre d'email? Passer null pour id? –

Répondre

24

Vous pouvez utiliser un tableau pour répondre à un paramètre spécifique:

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']; 
     } 
    } 
} 

Et comment vous pouvez utiliser ceci:

// 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

Cela empêcherait de courir et d'écrire une erreur en fonction de votre 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

Cela ne permettrait pas d'obtenir l'instruction if à l'intérieur, $ u = new User() échouera parce que vous n'avez pas fourni de paramètres qui n'ont pas de valeurs par défaut. – seanmonstar

+0

@seanmonstar oui en effet. C'est ce que l'OP voulait: $ u = new User(); // PHP permettrait cela –

+0

Cela n'a pas fonctionné pour moi. Selon http://php.net/manual/en/functions.arguments.php vous devez implicitement définir une valeur par défaut comme ceci:'__construit ($ id = null, $ email = null, $ username = null) 'et maintenant je suis capable d'appeler 'new user();' - PHP Version 5.6.24 – DerpyNerd