在构造函数中使用可变数量的参数动态调用类编辑:

2022-08-30 21:31:16

我知道可以调用具有可变数量参数的函数,其call_user_func_array()在这里找到 -> http://php.net/manual/en/function.call-user-func-array.php 。我想做的几乎是相同的,但我想调用一个PHP类,而不是一个函数,它的构造函数中参数数量可变。

它的工作方式如下,但我不知道参数的数量,所以我不知道如何实例化类。

<?php
//The class name will be pulled dynamically from another source
$myClass = '\Some\Dynamically\Generated\Class';
//The parameters will also be pulled from another source, for simplicity I
//have used two parameters. There could be 0, 1, 2, N, ... parameters
$myParameters = array ('dynamicparam1', 'dynamicparam2');
//The instantiated class needs to be called with 0, 1, 2, N, ... parameters
//not just two parameters.
$myClassInstance = new $myClass($myParameters[0], $myParameters[1]);

答案 1

您可以使用反射类执行以下操作

$myClass = '\Some\Dynamically\Generated\a';
$myParameters = array ('dynamicparam1', 'dynamicparam2');

$reflection = new \ReflectionClass($myClass); 
$myClassInstance = $reflection->newInstanceArgs($myParameters); 

PHP 手册: http://www.php.net/manual/en/reflectionclass.newinstanceargs.php

编辑:

在 php 5.6 中,你可以通过参数解压缩来实现这一点

$myClass = '\Some\Dynamically\Generated\a';
$myParameters = ['dynamicparam1', 'dynamicparam2'];

$myClassInstance = new $myClass(...$myParameters); 

答案 2

当函数 args > 2 时,我经常实现这种方法,而不是以必须按特定顺序排列的参数的圣诞节列表结束,我只是传入一个关联数组。通过传入关联数组,我可以检查必需和可选的参数,并根据需要处理缺失值。像这样:

class MyClass
{
    protected $requiredArg1;
    protected $optionalArg1;

    public function __construct(array $options = array())
    {
        // Check for a necessary arg
        if (!isset($options['requiredArg1'])) {
            throw new Exception('Missing requiredArg1');
        }

        // Now I can just localize
        $requiredArg1 = $options['requiredArg1'];
        $optionalArg1 = (isset($options['optionalArg1'])) ? $options['optionalArg1'] : null;

        // Now that you have localized args, do what you want
        $this->requiredArg1 = $requiredArg1;
        $this->optionalArg1 = $optionalArg1;            
    }
}

// Example call
$class = 'MyClass';
$array = array('requiredArg1' => 'Foo!', 'optionalArg1' => 'Bar!');

$instance = new $class($array);

var_dump($instance->getRequiredArg1());
var_dump($instance->getOptionalArg1());

我强烈建议使用关联数组,但是可以使用0索引数组。在构造数组时,您必须非常小心,并考虑有意义的索引,否则您将传入一个带有偏移参数的数组,并对您的函数造成严重破坏。


推荐