当前位置: 首页 > 面试题库 >

如何在PHP中使用call_user_func_array调用构造函数

鲁展
2023-03-14
问题内容

如何使用call_user_func_array调用类的构造函数

这是不可能的:

$obj = new $class();
call_user_func_array(array($obj, '__construct'), $args);

因为如果构造函数具有参数,则 新的 将失败。

约束:我不控制必须实例化的类,也不能修改它们。

不要问我为什么要做这个疯狂的事情,这是一个疯狂的考验。


问题答案:

您可以像这样使用反射:

$reflect  = new ReflectionClass($class);
$instance = $reflect->newInstanceArgs($args);

从PHP 5.6.0起,也可以将...运算符用于此目的。

$instance = new $class(...$args);
if(version_compare(PHP_VERSION, '5.6.0', '>=')){
    $instance = new $class(...$args);
} else {
    $reflect  = new ReflectionClass($class);
    $instance = $reflect->newInstanceArgs($args);
}


 类似资料:
  • 问题内容: 在所有其他与super构造函数一起使用的语言中,都是隐式调用的。如何在Python中调用它?我希望这是行不通的。 问题答案: super()在新样式类中返回类似父对象的对象:

  • 我有课 我还有一个B级 lombok抛出错误,说它找不到()构造函数,显式调用它。我想让lombok做的是给类b提供注释,这样它就生成了以下代码: 我们在龙目岛有注释吗?

  • 问题内容: 构造函数何时被调用? 创建对象之前。 在对象创建期间。 创建对象之后。 问题答案: 分配对象内存,初始化具有初始值的字段变量,然后调用构造函数,但是其代码在对象超类的构造函数代码之后执行。

  • 我一直在学习一些关于如何创建会话对象的课程,效果很好,如果我把完整的代码放到一个PHP文件中,一切都很好! 我想做的是将其放在另一个模块(PHP文件)中,只需使用一行(或等效行)即可,例如

  • 问题内容: 我想为MySortedSet调用一个构造函数,该构造函数将Comparator c作为参数。我该如何修改呢? 问题答案: 如果要传递其他捕获的值作为参数,则不能使用方法引用。您将不得不使用lambda表达式来代替: =>

  • 我们目前使用Mockito+PowerMock作为我们的主要模仿框架,并且在开始将一些代码转移到Java8时遇到了一些问题。因此,我们决定将jMockit作为一种替代方案进行评估。我对嘲笑概念有相当好的理解,但我承认我对jMockit的经验非常有限。 然而,我在测试一些在我看来应该是非常基本的东西时遇到了问题:被测试的类在其构造函数中使用New创建其他类的实例。我想让这个新调用返回一个模拟实例。