2013-06-24 114 views
0

我正在创建自己的MVC框架,只是为了学习新东西并最近遇到了这个问题。 可以说我有这样的:实例化有很多参数的类

Class Post extends \application\BaseClass 
{ 
    private $objPostDetail = null; 
    private $objAuthor = null 
    private $objCategory = null; 
    private $objType = null; 
    private $objTitlePicture = null; 

    public function __construct(PostDetail $objPostDetail, 
           Author $objAuthor, 
           Category $objCategory, 
           Type $objType, 
           TitlePicture $objTitlePicture) 
    { 
     $this->objPostDetail = $objPostDetail; 
     $this->objAuthor = $objAuthor; 
     $this->objCategory = $objCategory; 
     $this->objType = $objType; 
     $this->objTitlePicture = $objTitlePicture; 
    } 
} 

然后在constuctor使用的一些物品也可以COMLEX创建。 我从PostDAO类获取数据,它返回数据数组。 现在的问题是如何创建这个类的新实例,因为它可能在应用程序的许多地方。 我想到处创建$ objAuthor,然后$ objCategory等等,最后创建$ objPost并不好。所以我创造了什么,我认为可称为厂:

Class PostFactory extends \application\BaseFactory 
{ 
    private $arrData = null; 
    private $objPostDetail = null; 
    private $objCategory = null; 
    private $objType = null; 
    private $objTitlePicture = null; 

    public function __construct($arrData) 
    { 
     $this->arrData = $arrData; 
    } 

    public function build() 
    { 
     $this->objPostDetail = $this->buildPostDetail(); 
     $this->objCategory = $this->buildCategory(); 
     $this->objType = $this->buildType(); 
     $this->objTitlePicture = $this->buildTitlePicture(); 

     return $this->buildPost(); 
    } 

    private function buildPostDetail() 
    { 
     $objPostDetail = new \includes\classes\factories\PostDetailFactory($this->arrData); 
     return $objPostDetail->build(); 
    } 

    private function buildCategory() 
    { 
     $objCategory = new \includes\classes\factories\CategoryFactory($this->arrData); 
     return $objCategory->build(); 
    } 

    private function buildType() 
    { 
     $objType = new \includes\classes\factories\TypeFactory($this->arrData); 
     return $objType->build(); 
    } 

    private function buildTitlePicture() 
    { 
     $objTitlePicture = new \includes\classes\factories\TitlePictureFactory($this->arrData); 
     return $objTitlePicture->build(); 
    } 

    private function buildPost() 
    { 
     return new \includes\classes\Post($this->objPostDetail, $this->objCategory, 
         $this->objType, $this->objTitlePicture); 
    } 
} 

它运作良好,但我不喜欢,我有两倍多类,我不知道是什么参数,我需要实例化后因为我将数组传递给Factory类(因为我想避免构造函数中的许多参数)。 所以,我的问题是如何创建这样的类的实例的最佳方式是什么?

在此先感谢您的帮助。

回答

1

如果你想创建你自己的MVC框架,我强烈建议从某种容器中持有服务类的实例(只需要初始化一次的类,例如请求或响应)。

使用反射类自动注入构造函数需要的参数,方法是遍历构造函数的函数参数。

请参阅以下我通常使用的想法示例。它非常可靠,速度也相当快。如果你的框架有很多不同的类,并且你依赖于这个功能,我强烈推荐你用一些方法来缓存来自反射类的参数列表。

<?php 
class SomeClass 
{ 
    public function __construct(Request $request, Response $response, $title = '') 
    { 
     echo get_class($request); 
     // will output "Request" 

     echo $title; 
     // will output "Hello World" 
    } 
} 

// This function will handle the dynamic dependency injection to make sure the constructor gets the arguments passed that it needs, with optional named arguments passing. 
$some_class = YourFrameworkDispatcherClass->createInstance('SomeClass', array('title' => 'Hello World')); 
?> 

我已经在我的博客上写了一篇关于此的博文。 http://harold.info/engineering/php-dynamic-dependency-injection/

我认为这可以帮助你解决这个结构性问题。

+0

我的问题是如何从模型中获取数据后创建对象,我知道如何将它传递给模型,因为它通常只有很少的参数。 – Petr

+0

那么,同样的解决方案适用。你已经知道你从模型得到的回报。按照我的博客文章中的描述在命名参数样式中使用它。只要将构造函数的参数命名为与模型相同的名称,它就会自动传递给构造函数;) – Harold