PHP\[OOP\] - 如何手动调用类构造函数?

新手上路,请多包涵

请看下面的代码:

 01. class Test {
02.     public function __construct($param1, $param2, $param3) {
03.         echo $param1.$param2.$param3;
04.     }
05. }
06.
07. $params = array('p1','p2','p3');
08.
09. $ob = new Test;
10.
11. if(method_exists($ob,'__construct')) {
12.     call_user_func_array(array($ob,'__construct'),$params);
13. }

现在,问题是在第 09 行调用了 构造函数

但我想在第 11-13 行 手动 调用它

是否可以?如果那怎么办?有什么 想法 吗?

原文由 A.N.M. Saiful Islam 发布,翻译遵循 CC BY-SA 4.0 许可协议

回复
阅读 53
2 个回答

构造对象时无法阻止调用构造函数(代码中的第 9 行)。如果在您的 __construct() 方法中发生了一些您希望推迟到构建之后发生的功能,您应该将其移至另一个方法。该方法的一个好名字可能是 init()

为什么不这样做呢?

 class Test {
    public function __construct($param1, $param2, $param3) {
        echo $param1.$param2.$param3;
    }
}

$ob = new Test('p1', 'p2', 'p3');

编辑:我只是想到了一种可以防止构造函数被调用(某种程度上)的 hacky 方法。您可以子类 Test 并用一个空的、什么都不做的构造函数覆盖构造函数。

 class SubTest extends Test {
    public function __construct() {
        // don't call parent::__construct()
    }

    public function init($param1, $param2, $param3) {
        parent::__construct($param1, $param2, $param3);
    }
}

$ob = new SubTest();
$ob->init('p1', 'p2', 'p3');

如果您正在处理一些由于某种原因无法更改的代码并且需要解决编写不当的构造函数的一些烦人行为,这可能是有意义的。

原文由 Asaph 发布,翻译遵循 CC BY-SA 2.5 许可协议

请注意,如果构造函数(__construct 方法)包含通过引用传递的参数,则函数:

 call_user_func_array

将因错误而失败。

我建议你改用 Reflection 类;以下是您可以这样做的方法:

 // assuming that class file is already included.

$refMethod = new ReflectionMethod('class_name_here',  '__construct');
$params = $refMethod->getParameters();

$re_args = array();

foreach($params as $key => $param)
{
    if ($param->isPassedByReference())
    {
        $re_args[$key] = &$args[$key];
    }
    else
    {
        $re_args[$key] = $args[$key];
    }
}

$refClass = new ReflectionClass('class_name_here');
$class_instance = $refClass->newInstanceArgs((array) $re_args);

原文由 Sarfraz 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏