PHP中XML的依赖注入

PHP中XML的依赖注入,php,xml,oop,dependency-injection,Php,Xml,Oop,Dependency Injection,我目前正在尝试实现一个简单的依赖项注入容器,它使用XML定义类依赖项。我的问题主要与设计有关 下面是我正在考虑使用的XML模式示例: <?xml version="1.0"> <classes> <class name="MySQLDatabase"> <namespace>MyLib\Database\</namespace> <dependency type="constant">

我目前正在尝试实现一个简单的依赖项注入容器,它使用XML定义类依赖项。我的问题主要与设计有关

下面是我正在考虑使用的XML模式示例:

<?xml version="1.0">
<classes>
    <class name="MySQLDatabase">
        <namespace>MyLib\Database\</namespace>
        <dependency type="constant">my_db_username</dependency>
        <dependency type="constant">my_db_password</dependency>
        <dependency type="constant">my_db_database</dependency>
    </class>
        <class name="LoginManager">
        <namespace>MyLib\Authentication\</namespace>
        <dependency type="class">MySQLDatabase</dependency>
    </classes>
</classes>

MyLib\数据库\
我的\u db\u用户名
我的密码
我的数据库
MyLib\身份验证\
MySQLDatabase
我的第一个问题是,是否有人预见到类似于上述模式的任何问题

我的第二个问题是,我应该如何将其转换为My definitions数组?这个问题不是关于如何解析XML,而是关于在解析后保存信息的数组的设计

如果我是用Java编写的,我会想到类似的东西,但我不确定这是否太庞大,以及如何将其转换为PHP,因为PHP似乎没有Java那么多的数据结构

class DIClass {

    public HashMap<String, ClassDefinition> definitions;

    // example
    // definitions = map of the classes below
    // ...
}

class ClassDefinition {

    private String name;
    private String namespace;
    private List<Dependency> dependencies;

    // example
    // name = MySQLDatabase
    // namespace = MyLib\Database\
    // dependencies = list of the class below, ordered
    // ...
}

class Dependency {

    private String name;
    private String type;

    // example
    // name = my_db_username
    // type = constant
    // ...
}
类二类{
公共哈希映射定义;
//范例
//定义=以下类别的地图
// ...
}
类定义{
私有字符串名称;
私有字符串名称空间;
私有列表依赖关系;
//范例
//name=MySQLDatabase
//namespace=MyLib\Database\
//依赖项=下面的类列表,按顺序排列
// ...
}
类依赖{
私有字符串名称;
私有字符串类型;
//范例
//name=my_db_用户名
//类型=常数
// ...
}
我的最后一个问题是,添加持久性的定义怎么样?例如,数据库类应该是单例的。我是否应该在XML文件的类定义中添加一个额外的
标记

谢谢你的关注

我的第一个问题是,是否有人预见到类似于上述模式的任何问题

你在重新发明轮子。PHP是一种脚本语言,因此您也可以使用PHP文件来代替XML文件,因为-well-PHP:)更具表现力

我的第二个问题是,我应该如何将其转换为My definitions数组?这个问题不是关于如何解析XML,而是关于在解析后保存信息的数组的设计

您可以通过先模拟数组,然后向后思考来实现这一点,比如如何将数组中的信息存储到XML文件中,或者干脆完全删除XML,然后加载数组(参见上面的要点)

我的最后一个问题是,添加持久性的定义怎么样?例如,数据库类应该是单例的。我应该在XML文件的类定义中添加一个额外的标记吗

如果你需要一个单例,实例化它们一次就可以了。在PHP中通常不需要单例持久性。这是一个很大的误解(如果您来自Java背景,这会提供一个很好的见解:(必读)

也可参见以下相关问题:


您需要某种指示,说明如何注入依赖项(构造函数或setter),或者即使对象是通过新调用或工厂方法调用创建的。嗨,Orangepill,谢谢您的评论。依赖项将通过构造函数注入,对象通过DIClass创建(类似于工厂的方式)。我本来打算编辑代码以反映这一点,但我被卡住了。我的印象是PHP的eval()或类似的东西能够解析带有参数的函数字符串,在其中我将循环遍历依赖项列表,并通过在工厂中添加依赖项作为参数来“创建”函数(字符串),但情况似乎并非如此。如果您决定允许静态实例化(单例,抽象工厂),您可能希望将ReflectionClass::newInstanceArgs作为一种从字符串定义创建新对象的方法,而不是eval。感谢Orangepill,这正是我在本文档的实现部分所需要的:)然后可以使用call\u user\u func\u数组,并将数组作为第一个参数。我还建议您创建容器时要足够灵活,以支持构造函数注入以外的其他创建模式/注入方法,如果没有其他原因,只允许您的容器管理第三方类。我在其他PHPDI实现中看到的另一个特性(我认为可能有用)是为某些类型指定共享实例的概念。