2017-04-09 49 views
0

我想了解一些mvc架构的先进概念在PHP中,像自动加载与psr-4和依赖注入容器。我做了一个依赖注入容器和加载类使用作曲家自动加载。 每当我运行此代码我收到以下错误:类没有找到:递归反射注入依赖

Fatal error: Uncaught exception 'ReflectionException' with message 'Class Test does not exist' in C:\xampp\htdocs\practice\reflection\Container\Container.php:15 Stack trace: #0 C:\xampp\htdocs\practice\reflection\Container\Container.php(15): ReflectionClass->__construct('Test') #1 C:\xampp\htdocs\practice\reflection\index.php(9): Container\Container::newInstanceOf('Test') #2 {main} thrown in C:\xampp\htdocs\practice\reflection\Container\Container.php

好像Container.php没有得到来自控制器directory.I班查不出这个问题背后的原因。

我的目录结构如下:

-reflection Directory 
    -Controller folder 
    -Test.php 
    -Test2.php 
    -Container Directory 
    -Container.php 
-vendor Directory 
-index.php 

的index.php:

require 'vendor/autoload.php'; 

use Container\Container; 
use Controller\Test; 
use Controller\Test2; 

$test = Container::newInstanceOf('Test'); 

$test->testHi(); 

Container.php:

namespace Container; 

class Container 
{ 

    public static function newInstanceOf($class) 
    { 

     $reflection = new \ReflectionClass($class); 

     $constructor = $reflection->getConstructor(); 

     if (! $constructor) 
     { 

      return new $class; 

     } 
     $params = $constructor->getParameters(); 

     if (count($params) === 0) 
     { 

      return new $class; 

     } 

     $newInstanceParams = []; 

     foreach($params as $param) 
     { 
      if(is_null($param->getClass())) 
      { 
       $newInstanceParam[] = null; 

       continue; 
      } 

      $newInstanceParams[] = self::newInstanceOf($param->getClass()->getName()); 

     } 

     return $reflection->newInstanceArgs($newInstanceParams); 

    } 

} 

test.php的:

namespace Controller; 

class Test 
{ 

    private $test2; 

    public function __construct(Test2 $test2) 
    { 

     $this->test2 = $test2; 

    } 
    public function testHi() 
    { 
     $this->test2->test2Hi(); 

    } 


} 

Test2.php:

namespace Controller; 

class Test2 
{ 

    public function __construct() 
    { 

    } 

    public function test2Hi() 
    { 
     echo 'hi from test 2 !'; 
    } 
} 

Composer.json:

{ 
    "autoload":{ 

      "psr-4":{ 
        "Controller\\" : "Controller", 
        "Container\\" : "Container" 

      } 

    } 

} 
+0

把你composer.json这里 –

+0

@ AminAlizade抱歉! composer.json被添加到帖子中。 –

回答

1

更改行:

$test = Container::newInstanceOf('Test'); 

到:

$test = Container::newInstanceOf('Controller\Test'); 
+0

看起来像是在工作!你能解释它为什么这样工作吗?我已经'使用Controller \ Test'namepsace。为什么我需要将命名空间传递给容器? –

+0

是的,容器知道控制器命名空间的位置,但我认为ReflectionClass不知道命名空间参数$ class居住时,您将它作为参数传递。而ReflectionClass没有像'use Controller \ Test'这样的声明...... – hcheung

+0

好!从Test类的构造函数中,实现了Test2类。当'Test2'传递给$ class变量时,这次我们没有像第一次那样传递名称空间。那么反射类怎么能够解决Test2类呢? –