2014-06-20 122 views
0

我有一个关于PHP中的依赖注入的问题。依赖注入和传递参数

我现在有这3类:

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

这些类实例化像这个:

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

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

上述工作,但我希望做的是这样的:

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

我如何处理的依赖,以实现这一目标?

回答

0

你可以简单地添加一组函数类的工作人员,并呼吁它在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

这是现货。谢谢。 – 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(); 

为了避免混淆,我也建议前缀其中的一些功能与get(如$app->getStaff()->getFromId(#)

另外,一定要修改staff()->name(#)实际上返回一个对象而不是字符串。

+0

一切顺利,当我做$ APP-> getStaff() - >的getId($ ID),但如果我想做:$ app-> getStaff() - > getId($ id) - > name(),它不再工作。选择记录的变量必须位于最后一个对象上,因为 - > name必须是传递给 - > getId($ id)的类的方法,并且必须知道它正在选择记录$ id。 – user2599347

+0

请从'getId($ id)'发布实际方法以及它通过的对象类的定义(如果有的话)。 –

+0

感谢您的建议和帮助。我最终使用Vaidas提供的解决方案。 – user2599347