2010-12-08 11 views
2

Salut dans ma classe d'utilisateurs Je passe les variables dans le constructeur au lieu de passer des variables que je veux passer en tant que tableau.passer une variable en tant que tableau

Class User{ 

    var $userid; 
    var $alias; 
    var $firstname; 
    var $password; 
    var $email; 
    var $photo; 
    var $avatar_url; 
    var $thumb; 
    var $crop_url; 
    var $crop_position; 

    protected $db; 


    function User($userid='',$alias='',$firstname='',$lastname='',$password='',$email='',$photo='',$avatar_url='',$thumb='',$crop_url='',$crop_position='',PDO $db){ 
     $this->userid=$userid; 
     $this->alias= $alias; 
     $this->firstname=$firstname; 
     $this->lastname=$lastname; 
     $this->password= $password; 
     $this->email=$email; 
     $this->photo= $photo; 
     $this->avatar_url= $avatar_url; 
     $this->thumb= $thumb; 
     $this->crop_url= $crop_url; 
     $this->crop_position= $crop_position; 
     $this->db = $db; 

    } 
} 

et la variable à venir dans le constructeur

$user=new User($id,$alias,$firstname,$lastname,$password,$email,$photo='',$avatar_url='',$thumb='',$crop_url='',$crop_position='',$db); 

tout cela viennent par la variable de demande.

help.Thanks Please

+2

Iis t-il une raison pour laquelle vous utilisez ancienne syntaxe PHP4 ('var' et pour classname cteur)? Aussi, voulez-vous clarifier votre question, car il n'y a pas de question pour le moment? Si vous voulez passer un tableau, passez un tableau. – Gordon

Répondre

0

création de votre tableau:

$Usr_info = array('id' => 0, 'alias' => 'value'); //add all the values you want like that 

Et puis dans votre constructeur, vous pouvez accéder à chaque élément du tableau:

function User($Usr_info) 
{ 
    $this->userid = $Usr_info['id']; 
    //and so on... 
} 
+0

J'aurais dû noter que vous passeriez alors juste le tableau plutôt que chaque variable individuelle lorsque vous appelez le constructeur. – CrowderSoup

1

User.php Classe:

// define your default values here. so that you will not have to pass them 
// everytime when you pass the array to `AssignVal` function. 


Class User{ 
     var $userid = ''; 
     var $alias = ''; 
     var $firstname = ''; 
     var $password = ''; 
     var $email = ''; 
     var $photo = ''; 
     var $avatar_url = ''; 
     var $thumb = ''; 
     var $crop_url = ''; 
     var $crop_position = ''; 

     protected $db; 

     function User(PDO $db) { 
      $this->db = $db; 
     } 
    } 

index.php (où vous voulez que l'objet à créer):

$user = assignVal('User',$arr); 

functions.php (un endroit où vous placez toutes vos fonctions):

// the following function creates an object with the array you send it. 
// this is specially useful if your class contains a lot of variables 
// thus minimizing the manual work of defining constructors again and again... 

    function assignVal($obj,$arr,$child=null) { 
     if (is_string($obj)) $obj = new $obj(); 
     $applyon = $child == null ? $obj : $obj->$child; 
     if(!empty($arr)) { 
     foreach ($arr as $name => $val) { 
      $applyon->$name = $val; 
     } 
     } 
     if ($child != null) $obj->$child = $applyon; 
     else $obj = $applyon; 
     return $obj; 
    } 
+0

Nice Fonction où dois-je placer cette fonctionnalité je veux dire dans quelle classe – XMen

+0

ajouter cela à la zone 'includes' de votre site .. qui est dans une classe 'functions.php' commune, de sorte qu'il est disponible sur toutes vos pages .. J'ai fait cette fonction, spécifiquement, pour une utilisation dans mes API Wrappers :) – Stoic

+2

+0 c'est illisible et trop compliqué et il va créer des propriétés publiques. Tout simplement parce que l'OP utilise PHP4 pour des raisons inconnues ne signifie pas que le code comme ceci devrait être promu. La définition d'un objet dans un état valide devrait avoir lieu dans une usine ou par injection de ctor/setter. – Gordon

0
Version

pour

class User { 
    private $userid; 
    ... 

    public function assign ($class_member, $value) { 
     $this->$class_member = $value; 
    } 

    public function __construct ($db) { 
     $this->db = $db; 
    } 
} 

... 
$user = new User($db); 
$user->assign('userid', 1); 
PHP5
+0

Gordon, merci pour votre commentaire. Ofcource, la classe 'Assigner' est superflue. – r92

1

Vous n'avez pas clarifié votre problème. Si vous voulez passer un tableau, passez un tableau. Si vous ne pouvez pas modifier votre API pour le ctor pour des raisons BC, vous pouvez ajouter une autre méthode à votre classe User, par ex.

class User 
{ 
    // other code … 

    public function populateFromArray(array $data) 
    { 
     foreach ($data as $property => $value) { 
      if (property_exists($this, $property)) { 
       $user->$property = $value; 
      } 
     } 
    } 
} 

Ensuite, vous pouvez faire

$user = new User('','','','','','','','','','','',$db); 
$user->populateFromArray(array(
    'id' => 'johndoe', 
    'email' => '[email protected]', 
    // other … 
)); 

L'appel cteur semble assez laid, donc si vous pouvez vous permettre de changer l'API, je suggère de déplacer les arguments nécessaires au début de la signature. This is suggested good practise in the PHP Manual anyway, par ex. changez votre ctor en

public function __construct(PDO $pdo, $id = '', $email = '', …) { 

Notez que je l'ai changé pour le nouveau constructeur de style PHP5. Nommer le ctor après le nom de la classe est de style PHP4 et est not compatible with namespaces as of PHP5.3.3.. Vous pouvez également changer votre mot-clé var en public (ou mieux encore protected et ajouter un getter et un setter appropriés).

Puisque tout mais l'instance PDO est facultative, vous pouvez tout aussi bien supprimer tous les arguments optionnels et toujours utiliser votre nouveau lieu méthode populateFromArray, ce qui réduit l'instanciation à

$user = new User($db); 
$user->populateFromArray($dataArray); 

Si vous souhaitez implémenter la populateFromArray fonctionnalité dans d'autres classes, vous pouvez envisager d'ajouter une interface IPopulate, par exemple

interface IPopulate 
{ 
    public function populateFromArray(array $data); 
} 

Mais vos cours de mise en œuvre de cette interface devrait ajouter le corps de la méthode à chaque fois, ce qui est un peu redondant étant donné que notre code est assez générique peuplement.With php.next there will be traits for an elegant solution for horizontal reuse comme ça.


Une autre solution possible serait de simplement utiliser l'API de réflexion pour passer le tableau à votre cteur régulière (bien que vous devriez lui donner une référence après que l'API de réflexion est considérée comme lente). Voir

Questions connexes