gpt4 book ai didi

php - 何时使用 call_user_func_array

转载 作者:可可西里 更新时间:2023-11-01 00:55:07 24 4
gpt4 key购买 nike

我在 stack 上阅读了其他答案关于使用 call_user_func_array 与仅调用函数有关,但我仍然无法收集何时应该使用前者。我知道当您不知道传递了多少个参数时,您可能想使用 call_user_func_array,因此您可以这样做:$args = func_get_args(); ... 但是如果要在函数中使用参数,您不总是需要知道参数吗?

以下两项工作,我假设第一项的开销较小。

$format = new Foo;
$method = 'somemethod';
$arg = 'somevalue';
if (method_exists($format, $method)) {
return $format->$method($arg);
}

对比

return call_user_func_array(array($format, $method), array($arg));

什么时候才能真正受益于使用 call_user_func_array

最佳答案

call_user_func_array 非常有用的例子

假设您想要访问一个对象,但是通过静态方法,如下所示:

Helper::load();

好吧,这本身是行不通的,因为如果您查看具体类,它没有静态方法:

class Helper {

public function load()
{
// Do some loading ...
}

public function aFunctionThatNeedsParameters( $param1, $param2 )
{
// Do something, and $param1 and $param2 are required ...
}
}

所以在第二个类中,我们可以做这样的事情,因为上面的 Helper 类被加载到依赖注入(inject)容器中(请注意,这两个 Helper 类的名称相同,但会在不同的命名空间中):

class Helper extends DIContainer {

public static $helper_instance = NULL;

public static function get_instance()
{
if( is_null( self::$helper_instance ) )
{
self::$helper_instance = parent::$container['helper'];
}

return self::$helper_instance;
}

public static function __callStatic( $method, $params )
{
$obj = self::get_instance();

return call_user_func_array( [ $obj, $method ], $params );
}
}

问题是,可能还有其他方法需要参数,即使我们的加载方法没有任何参数。

所以在这种情况下我们可以使用Helper::load(),也可以使用Helper::aFunctionThatNeedsParameters( $param1, $param2 )

我认为这在知道静态类通常不合适的 PHP 框架中被大量使用,但他们希望能够像静态类一样调用方法。我希望这是有道理的。

关于php - 何时使用 call_user_func_array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47963744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com