php-di

时间:2017-10-07 23:14:31

标签: php php-di

我正在尝试使用PHP-DI,但我没有成功。 在我的简单scanario中, Wordpress主题中的控制器需要在构造函数中注入PostService和CategoryService:

class IndexController extends ChesterBaseController {
    private $_postservice;
    private $_categoryService;
    public function __construct(PostService $postservice, CategoryService $categoryService){
        var_dump($postservice);
        var_dump($categoryService);
        parent::__CONSTRUCT();
        $this->$_categoryService = $categoryService;
        $this->$_postservice = $postservice;
        var_dump($this->$_postservice);
        var_dump($this->$_categoryService);

    }
    public function Index(){
        $firstRowPost = $this->$_postservice->GetLastPostByCategory('video');
        // ...
        echo $this->renderPage('index', $vm);
    }
}

这是我在Index.php中的容器的入口点:

require_once 'vendor/autoload.php';
require_once dirname(__FILE__).'/mvc/controllers/index_controller.php';
require_once dirname(__FILE__).'/mvc/services/categoryService.php';
require_once dirname(__FILE__).'/mvc/services/postService.php';
use DI\Container;
use DI\ContainerBuilder;

$builder = new DI\ContainerBuilder();
$builder->addDefinitions(['config.php']);
$container = $builder->build();
$indexController = $container->get('IndexController');
$indexController->Index();

包含定义的'config.php':

return [
    'PostService' => \DI\object('PostService'),
    'CategoryService' => \DI\object('CategoryService'),
    'IndexController' => \DI\object()->constructor(DI\get('PostService'),DI\get('CategoryService'))
];

这是执行结果:

  

C:\ XAMPP \应用\ wordpress的\ htdocs中\可湿性粉剂内容\主题\切斯特-nanalab \ MVC \控制器\ index_controller.php:10:   对象(PostService)[3005]   C:\ XAMPP \应用\ wordpress的\ htdocs中\可湿性粉剂内容\主题\切斯特-nanalab \ MVC \控制器\ index_controller.php:11:   对象(CategoryService)[3006]   C:\ XAMPP \应用\ wordpress的\ htdocs中\可湿性粉剂内容\主题\切斯特-nanalab \ MVC \控制器\ index_controller.php:15:   对象(CategoryService)[3006]   C:\ XAMPP \应用\ wordpress的\ htdocs中\可湿性粉剂内容\主题\切斯特-nanalab \ MVC \控制器\ index_controller.php:16:   对象(CategoryService)[3006]

所以:

  

致命错误:未捕获错误:调用未定义的方法   CategoryService :: GetLastPostByCategory()in   C:\ XAMPP \应用\ wordpress的\ htdocs中\可湿性粉剂内容\主题\切斯特-nanalab \ MVC \控制器\ index_controller.php   第19行

ლ(ಠ益ಠლ)╯

但是,如果我改变作业的顺序:

public function __construct(PostService $postservice,CategoryService $categoryService){
    var_dump($postservice);
    var_dump($categoryService);
    parent::__CONSTRUCT();
    $this->$_categoryService = $categoryService;
    $this->$_postservice = $postservice;
    var_dump($this->$_postservice);
    var_dump($this->$_categoryService);
}

我可以读到:

  

C:\ XAMPP \应用\ wordpress的\ htdocs中\可湿性粉剂内容\主题\切斯特-nanalab \ MVC \控制器\ index_controller.php:10:   对象(PostService)[3005]   C:\ XAMPP \应用\ wordpress的\ htdocs中\可湿性粉剂内容\主题\切斯特-nanalab \ MVC \控制器\ index_controller.php:11:   对象(CategoryService)[3006]   C:\ XAMPP \应用\ wordpress的\ htdocs中\可湿性粉剂内容\主题\切斯特-nanalab \ MVC \控制器\ index_controller.php:17:   对象(PostService)[3005]   C:\ XAMPP \应用\ wordpress的\ htdocs中\可湿性粉剂内容\主题\切斯特-nanalab \ MVC \控制器\ index_controller.php:18:   对象(PostService)[3005]

enter image description here

(╯°□°)╯︵ ┻━┻?有用! 谁能向我解释发生了什么?

提前致谢。

1 个答案:

答案 0 :(得分:3)

问题是您正在将对象属性称为$this->$property。属性的访问方式与此$this->property类似,但定义为VISIBILITY $property;

因此,您应该将代码更改为此

class IndexController extends ChesterBaseController {
    private $_postservice;
    private $_categoryService;
    public function __construct(PostService $postservice, CategoryService $categoryService){
      var_dump($postservice);
      var_dump($categoryService);
      parent::__construct();
      $this->_categoryService = $categoryService;
      $this->_postservice = $postservice;
      var_dump($this->_postservice);
      var_dump($this->_categoryService);

    }
    public function Index(){
        $firstRowPost = $this->_postservice->GetLastPostByCategory('video');
       // ...
        echo $this->renderPage('index', $vm);
    }
}

对于parent它是不同的,因为您正在使用static访问者(您没有将该属性视为静态,但它是这样做的方式)parent::$property

请记住,对于任何magic method,它都是__construct小写。

您可以获得有关类和对象here的更多信息。