如何使用PHP将数组中的2个对象自动传递给构造函数

如何使用PHP将数组中的2个对象自动传递给构造函数,php,dependency-injection,Php,Dependency Injection,我有一个问题: <?php class A { } class B { } $objectsInArray = array(); $objectsInArray[] = new A(); $objectsInArray[] = new B(); class C { private $a; private $b; public function __construct(A $a, B $b) { $this->a = $a;

我有一个问题:

<?php

class A {
}

class B {
}

$objectsInArray = array();
$objectsInArray[] = new A();
$objectsInArray[] = new B();

class C {
    private $a;
    private $b;
    public function __construct(A $a, B $b) {
        $this->a = $a;
        $this->b = $b;
    }
}
如果没有此错误消息:

Catchable fatal error: Argument 1 passed to C::__construct() must be an instance of A, array given...
我不想要这个理由:

class C {
    private $a;
    private $b;
    public function __construct(array $arguments) {
        foreach ($arguments as $argument) {
            if ($argument instanceof A) {
                $this->a = $argument;
            } elseif ($argument instanceof B) {
                $this->b = $argument;
            } else {
                throw new exception('Arguments are bad!');
            }
        }
    }
}

谢谢您的回答。

您可以按照已经声明的方式声明类C,但我建议您实现A和B,它们将具有数组属性,该属性将保存所有需要的值。然后你就可以创建A和B的实例,得到合适的值,e。g、 :$a->getElements()

B班也一样。甚至可以为A和B创建具有公共功能的父类

所以A和B将只封装数组功能,您只需通过这些实例进行操作,而不是数组


然后,您可以毫无问题地将A和B的实例传递给C的构造函数。

我认为您需要反射,我的同事告诉我,这是一个缓慢的解决方案。这是真的吗?如果是真的,那么多少是慢的?你的同事是对的。反射很慢。而且,在没有特殊需要的情况下使用反射也是不好的做法。你为什么需要反思?据我所知,您可以将$objectsInArray封装到新的类D中,创建两个对象,比如D和e,然后向它们添加新的A和B,并将它们传递给构造函数。问题是什么?我会在特殊情况下使用反射,我不需要这么多。我读过任何关于这个问题的文章,当我使用更多的时候,它的速度明显变慢了。我只需要可装配的小物件。使用其他东西更好吗?我试图实现对框架的反射,并发现它的解决方案不适合我。因为我需要类的返回实例,而不是反射类。我用了你的解决方案。谢谢。
class C {
    private $a;
    private $b;
    public function __construct(array $arguments) {
        foreach ($arguments as $argument) {
            if ($argument instanceof A) {
                $this->a = $argument;
            } elseif ($argument instanceof B) {
                $this->b = $argument;
            } else {
                throw new exception('Arguments are bad!');
            }
        }
    }
}
 class A {
     private $a;
     public addElement($element) {
         // add element to the array $a
     }
     public getElements() {
          return $a;
     }
 }