首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未找到的类:注入依赖项的递归反射

未找到的类:注入依赖项的递归反射
EN

Stack Overflow用户
提问于 2017-04-09 04:50:53
回答 1查看 955关注 0票数 1

我试图在php中理解mvc架构的一些高级概念,比如使用psr-4的autoload和依赖注入容器,我使用composer autoload制作了一个依赖注入容器和加载类。每当我运行这段代码时,我都会得到以下错误:

致命错误:在C:\xampp\htdocs\practice\reflection\Container\Container.php:15堆栈跟踪:#0 C:\xampp\htdocs\practice\reflection\Container\Container.php(15):ReflectionClass->_ C:\xampp\htdocs\practice\reflection\index.php(9):(‘Test’) #1 C:\xampp\htdocs\practice\reflection\index.php(9):容器\Container::newInstanceOf(‘Test’) #2 {main}中抛出的带有消息“类测试不存在”的未命名异常“ReflectionException”C:\xampp\htdocs\practice\reflection\Container\Container.php

似乎Container.php没有从控制器直接得到类,我无法找出这个问题的原因。

我的目录结构如下:

代码语言:javascript
复制
-reflection Directory
  -Controller folder
    -Test.php
    -Test2.php
  -Container Directory
    -Container.php
-vendor Directory
-index.php

index.php:

代码语言:javascript
复制
require 'vendor/autoload.php';

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

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

$test->testHi();

Container.php:

代码语言:javascript
复制
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:

代码语言:javascript
复制
namespace Controller;

class Test
{

    private $test2;

    public function __construct(Test2 $test2)
    {

        $this->test2 = $test2;

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

    }


}

Test2.php:

代码语言:javascript
复制
namespace Controller;

class Test2
{

    public function __construct()
    {

    }

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

Composer.json:

代码语言:javascript
复制
{
    "autoload":{

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

            }

    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-09 06:02:26

更改行文:

代码语言:javascript
复制
$test = Container::newInstanceOf('Test');

至:

代码语言:javascript
复制
$test = Container::newInstanceOf('Controller\Test');
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43303165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档