PHP中的动态对象创建


Dynamic objects creation in PHP

我用'model'目录下的一些核心文件和模型制作了自定义框架。现在我只在需要的时候才从模型中创建对象,这是可行的。但是我想从所有的模型类自动创建对象。例如,在"models"目录下有三个模型类,

//-----------[ ObjectOneModel.php ]-------------------
class ObjectOneModel
{
}
//-----------[ ObjectTwoModel.php ]-------------------
class ObjectTwoModel
{
}
//-----------[ ObjectThreeModel.php ]-------------------
class ObjectThreeModel
{
}

和一个主控制器

class Controller 
{
    public function __construct()
    { 
        $files  = scandir('models/');
        foreach ($files as $file)
        {
            if (preg_match('/^[A-Z]{1}[A-Za-z]*Model.php/', $file))
            {
                $object_name    = str_replace('Model.php', '', $file);
                $class_name     = str_replace('.php', '', $file);
                $this->{$object_name} = new $class_name();
            }
        }
    }
}

这工作得很好,但例如ObjectThreeModel需要访问ObjectOne,因为ObjectOne的数据在ObjectThreeModel中使用。我想我应该在这里创建一个新对象

//-----------[ ObjectThreeModel.php ]-------------------
class ObjectThreeModel
{
    public function __construct()
    {
        $ObjectOne = new ObjectOneModel();
    }
}

,但我认为这是丑陋的解决方案,因为在内存中有两个相同的对象。我需要找到一种方法告诉构造函数我在创建对象中需要哪些对象,构造函数会将这些对象作为参数传递给它自己?这很难描述,但我希望你能理解我的问题。

我认为您当前方法的丑陋之处在于您正在扫描整个模型目录并加载它找到的任何内容。相反,您应该考虑使用某种类型的工厂模式来根据需要加载对象。参考:

  • PHP的正确方式
  • 维基百科

简单的例子:

class SimpleFactory
{
    public function build($model)
    {
        $obj = __NAMESPACE__ . '''models''' . $model . '.php';
        if (class_exists($obj)) {
            return new $obj();
        }
    }
}
class Controller 
{
    private $factory;
    public function __construct()
    {
        $this->factory = new SimpleFactory();
    }
    public function someMethod()
    {
        // this method has a dependency
        $oneModel = $this->factory->build('oneModel');
    }
}

这样更简洁,因为您只在需要时加载对象。