2014-06-20 3 views
0

J'ai une question à propos de Dependency Injection en PHP.Injection de dépendances et arguments de passage

J'ai actuellement ces 3 classes:

Staff.php

<?php 
class Staff 
{ 
    public function name($id) 
    { 
     return 'returning staff with id ' . $id; 
    } 
} 

Projects.php

<?php 
class Projects 
{ 
..... projects related functions 
} 

ProjectsManager.php

<?php 

class ProjectsManager 
{ 
    private $staff = null; 
    private $projects = null; 

    public function __construct(Staff $staff, Projects $projects) 
    { 
     $this->staff = $staff; 
     $this->projects = $projects; 
    } 

    public function staff() 
    { 
     return $this->staff; 
    } 

    public function projects() 
    { 
     return $this->projects; 
    } 
} 

Ces classes sont instanciés comme ce :

$staff = new Staff; 
    $projects = new Projects; 
    $app  = new ProjectsManager($staff, $projects); 

    echo $app->staff()->name(5); 

ci-dessus fonctionne, mais ce que je voudrais faire est quelque chose comme ceci:

$employee = $app->staff(5); 
echo $employee->name(); 
echo $employee->position(); 
echo $employee->email(); 

Comment puis-je gérer la dépendance à atteindre cet objectif?

Répondre

0

Vous pouvez simplement ajouter la fonction de jeu en classe du personnel et l'appeler en ProjectsManager:

<?php 

class Staff 
{ 
    private $id = null; 

    public function name() 
    { 
     return 'returning staff with id ' . $this->id; 
    } 

    public function setId($id) 
    { 
     $this->id = $id; 
    } 
} 


class Projects 
{ 
//..... projects related functions 
} 

class ProjectsManager 
{ 
    private $staff = null; 
    private $projects = null; 

    public function __construct(Staff $staff, Projects $projects) 
    { 
     $this->staff = $staff; 
     $this->projects = $projects; 
    } 

    public function staff($id = null) 
    { 
     $this->staff->setId($id); 
     return $this->staff; 
    } 

    public function projects($val = null) 
    { 
     return $this->projects; 
    } 
} 


$staff = new Staff; 
$projects = new Projects; 
$app  = new ProjectsManager($staff, $projects); 

$employee = $app->staff(5); 
echo $employee->name(); 
+0

C'est sur. Merci. – user2599347

0
$employee = $app->staff()->name(5); 
//$app is the ProjectsManager 
//$app->staff() returns it's Staff object 
//staff()->name(5) Invokes the Staff object's name function 
//Returns 'Returning staff with id 5'  

echo $employee->name(); 
echo $employee->position(); 
echo $employee->email(); 

Pour éviter toute confusion, je suggère également préfixe certaines de ces fonctions avec get (par exemple. $app->getStaff()->getFromId(#))

Aussi, assurez-vous de modifier staff()->name(#)- fait retourner un objet et non une chaîne.

+0

tout va bien quand je fais $ app-> getStaff() -> getId ($ id), mais si je vouloir faire: $ app-> getStaff() -> getId ($ id) -> name(), cela ne fonctionne plus. La variable qui sélectionne l'enregistrement doit toujours être sur le dernier objet, car -> name doit être une méthode de la classe transmise à -> getId ($ id) et doit déjà savoir qu'il sélectionne record $ id. – user2599347

+0

Veuillez publier la méthode réelle à partir de 'getId ($ id)' et la définition de la classe de l'objet qu'il transmet le cas échéant. –

+0

Merci pour la suggestion, et l'aide. J'ai fini par utiliser la solution fournie ci-dessous par Vaidas. – user2599347