使用Foreach循环访问依赖项

时间:2016-08-03 16:20:27

标签: php arrays oop multidimensional-array dependency-injection

我正在努力做一个简单的依赖' mapper',我不认为我甚至可以把它称为依赖注入器...所以我试图在下面做一个最小的概念证明

在我的index.php页面上我有以下内容......

// >>> psr-4 autoloader here

// instantiating the container
$container = new Container;

// getting an instance of 'A' with an object tree of A->B->C
$a = $container->get('A');

在我的简单容器中,我有这个...

class Container
{
    public $dependencies = []; // an array of dependencies from the dependency file

    public function __construct()
    {
        // include list of dependencies
        include 'Dependencies.php';

        foreach ($dependency as $key => $value) {
            $this->dependencies[$key] = $value; // e.g. dependency['A'] = ['B'];
        }
    }

    /**
     * gets the dependency to instantiate
     */
    public function get($string)
    {

        if (isset($this->dependencies[$string])) {

            $a = $string;

            foreach ($this->dependencies[$string] as $dependency) {

                $b = $dependency;

                if (isset($this->dependencies[$dependency])) {

                    foreach ($this->dependencies[$dependency] as $dependency);

                    $c = $dependency;

                }

            }

        }

        $instance = new $a(new $b(new $c));
        return $instance;

    }
}

我将我的依赖关系映射到一个看起来像这样的单独文件中......

/**
 * to add a dependency, write the full namespace
 */

$dependency['A'] = [
    'B' // A depends on B
];

$dependency['B'] = [
    'C' // which depends on C
];

一组依赖于彼此的A,B和C类......

class A
{
    public function __construct(B $b)
    {
        echo 'Hello, I am A! <br>';
    }
}



class B
{
    public function __construct(C $c)
    {
        echo 'Hello, I am B!<br>';
    }
}



class C
{
    public function __construct()
    {
        echo 'Hello, I am C! <br>';
    }
}

我整个下午都试着去上班,但我担心要么我的想法不够清楚

问题

所以在我的get()函数中,如何自动加载这些依赖项,以便我的get函数不仅仅是 foreach ifelse的永无止境的嵌套语句...我需要添加某种回调吗?我真的不清楚,我必须强调,我已经尝试了很多不同的方法,这些方法不起作用,包含的内容太多了。

1 个答案:

答案 0 :(得分:1)

你做错了。您的容器旨在仅与该依赖项结构一起使用。例如,$container->get('B')不起作用,$container->get('C')也不起作用,因为$c将为空,第三嵌套new将失败。

我建议您将容器设为http://accraze.info/testing-angular-services-using-jasmine/函数。

顺便说一下,第三个foreach是什么?你想要获得最后的依赖吗?

您可以阅读我的recursive