如何从配置文件中最好地创建对象?

时间:2010-07-29 10:35:31

标签: php object configuration-files

我有一组PHP类,可以使用构造函数传统地实例化。现在我想添加使用YAML配置文件实例化这些对象的功能。

以下是描述Web表单的配置文件示例:

title: Contact
fields:
    message:
        type: text
        required: true
    topic:
        type: dropdown
        options: ["HTML", "CSS", "PHP"]

这应该会导致Form对象具有两个相应的Field对象。换句话说,配置文件有时会描述包含其他对象的对象。

我不想只是从YAML键/值对到PHP属性的映射,因为我想在配置文件中允许简写语法。例如,我想缩写一些属性名称,并且能够键入类似default: today的内容,其中“today”不会被解释为字符串文字,而是转换为当前时间戳。

由于许多类都是子类,我正在寻找一种解决方案,它也让我以某种方式从超类“继承”配置逻辑。

我想避免修改现有的类,但如果它允许更简单的解决方案,我愿意这样做。再想一想,我真的不介意修改现有的类;我只对最佳解决方案感兴趣。

如何以这种方式最好地从配置文件创建对象?

5 个答案:

答案 0 :(得分:3)

您可以采取以下方法:

要从配置文件中填充的每个模型类都应该实现一个接口,例如方法fromArray($data)

在顶层,您知道要创建的对象(表单)的类型。此对象是instanciated,并且配置文件中的数据传递给fromArray方法。然后,对象遍历配置数据并“知道”如何处理每个条目。

对于'fields'数组的每个元素,它可以将数据传递给子对象 可以自己遍历并正确处理配置(包括为接受日期的任何字段以特殊方式解释“今天”)。

将创建对象的责任分解为知道如何处理此类对象的特殊方法。

答案 1 :(得分:1)

我要做的第一件事就是看看这个轮子是否已经被某人发明 - 这可能涉及到查看这里提供的一些ORM建议: Good PHP ORM Library?

编辑:或者在这种情况下看看YAML Symfony可能更有用:http://components.symfony-project.org/yaml/ - 这也允许你在配置文件中嵌入PHP,这也应该绕过速记字段名称。

我不会详细介绍自己实现的内容,因为有很多不同的方法可以选择这样做,而不是自己实现它们我不想让你错,但我会建议如果您使用这样的速记语法,您将需要某种方式来标记它是简写语法 - 编码default: todaydefault : %%today%%或其他更专业的标记更容易出错

答案 2 :(得分:1)

我自己没有写过很多PHP,但是如果你在Symfony的YAML的帮助下推出自己的PHP,我可以看到这样的工作。您可以使用PHP Reflection类获取对象和子对象的所有属性,然后使用Symfony YAML代码将YAML映射到数组,然后将数组映射到属性。在将数组映射到PHP对象属性的代码中,您可以查找像“今天”这样的特殊内容,并让它们做特殊的事情。

您可能需要一种标记属性的方法,以便以某种方式对不同的输入作出反应。我不知道它是否可以在PHP中使用,但在.NET中,您可以使用Attribute类标记属性,让属性知道做特殊的事情。

答案 3 :(得分:0)

用PHP编写配置。

$ContactConfig=array(
  $title='Contact',
  $fields=array(
    'message'=>array(
      'type'=>'text',
      'required'=>true
    ),
    'topic'=>array(
      'type'=>'dropdown',
      'options'=>array('HTML','CSS','PHP')
    )
  )
);

答案 4 :(得分:0)

编写一个PHP代码生成器,它实质上将YAML配置转换为PHP代码。当你这样做时,操作码缓存(APC,eAccelerator,XCache等)将使脚本在运行时更有效,而不是PHP必须在每次加载时解释YAML文件。