如何在PHP中使用两个变量调用静态方法

如何在PHP中使用两个变量调用静态方法,php,reflection,static,Php,Reflection,Static,我有两个变量: $a = 'some_class'; $b = 'some_method'; 我想做的是这样的事情(方法是静态的): 可能吗?我已经尝试了反射类,但是我不能调用静态方法…这应该可以做到 call_user_func(array($a, $b)); 这应该可以 call_user_func(array($a, $b)); 这将适用于您:$a::$b() 示例: <?php class A { public static function b() {

我有两个变量:

$a = 'some_class';
$b = 'some_method';
我想做的是这样的事情(方法是静态的):

可能吗?我已经尝试了反射类,但是我不能调用静态方法…

这应该可以做到

call_user_func(array($a, $b));
这应该可以

call_user_func(array($a, $b));

这将适用于您:
$a::$b()

示例:

<?php

class A {
    public static function b()
    {
        echo 'Done!', PHP_EOL;
    }
}

$class  = 'A';
$method = 'b';

$class::$method(); // Shows:  Done!

这将对您有效:
$a::$b()

示例:

<?php

class A {
    public static function b()
    {
        echo 'Done!', PHP_EOL;
    }
}

$class  = 'A';
$method = 'b';

$class::$method(); // Shows:  Done!
如何调用静态方法,3个选项
您有几个选择:

代码 当你用这些选项调用它时会发生什么 使用回溯代码编写代码,以便您可以看到PHP中的幕后情况:

代码 调用用户函数(数组($class,$method),$arg); eval($指挥部); 正如您所看到的,第一种方法没有中间的步骤,它直接进行调用,而其他两个选项作为一个函数自己进行调用

实际上差别不大,但在优化这样一个过程时可能有意义。

如何调用静态方法,3个选项 您有几个选择:

代码 当你用这些选项调用它时会发生什么 使用回溯代码编写代码,以便您可以看到PHP中的幕后情况:

代码 调用用户函数(数组($class,$method),$arg); eval($指挥部); 正如您所看到的,第一种方法没有中间的步骤,它直接进行调用,而其他两个选项作为一个函数自己进行调用

实际上差别不大,但在优化这样一个过程时可能会有意义。

您必须在var的末尾添加()才能将其变成一个方法。 $a::$b()不是$a::$b

PHP

static return
30
必须将()添加到var的末尾,才能将其转换为方法。 $a::$b()不是$a::$b

PHP

static return
30

这些选择有什么好处吗?我是说,不包括评估选项。call_user_func比::好还是反之亦然?或者这只是一种偏好?所有这些都可以工作,所以对于功能而言,我们没有什么不同。然后是eval()一个,只是不要使用。理由充分。那么为什么可以使用call_user_func(),它允许灵活的参数数量。这对于某些用途来说是很好的,但在你的情况下不是很有用。在我看来,它又回到了时尚。主要区别在于eval和call_user_func都是程序跟踪中的一个单独步骤,而$class::$method只调用它。上载了带有回溯的新代码,以便您可以看到发生的主要区别。因此,在调用同一个类时,$a::$b()似乎比调用_user_func更高效,但效率很低。我期望性能,但没有对性能进行基准测试。为了便于阅读,如果真的需要,我建议使用$a::$b()。更具体地说:一般来说,不需要调用灵活的类名,但在某些情况下需要调用灵活的类名。我将把它放在一个方法中,并向其中添加足够的检查和调试技巧,这样您就可以简单地调试使用哪个参数调用哪个类和方法。这很棘手,因为您无法通过搜索找到对该方法的所有调用,例如,因为它是动态生成的。这些选项都不允许使用
$reflectionMethod->setAccessible(true)实现覆盖可访问性$reflectionMethod->invoke($obj)。提问者用“反思”来标记他们的问题。这些选项有什么好处吗?我是说,不包括评估选项。call_user_func比::好还是反之亦然?或者这只是一种偏好?所有这些都可以工作,所以对于功能而言,我们没有什么不同。然后是eval()一个,只是不要使用。理由充分。那么为什么可以使用call_user_func(),它允许灵活的参数数量。这对于某些用途来说是很好的,但在你的情况下不是很有用。在我看来,它又回到了时尚。主要区别在于eval和call_user_func都是程序跟踪中的一个单独步骤,而$class::$method只调用它。上载了带有回溯的新代码,以便您可以看到发生的主要区别。因此,在调用同一个类时,$a::$b()似乎比调用_user_func更高效,但效率很低。我期望性能,但没有对性能进行基准测试。为了便于阅读,如果真的需要,我建议使用$a::$b()。更具体地说:一般来说,不需要调用灵活的类名,但在某些情况下需要调用灵活的类名。我将把它放在一个方法中,并向其中添加足够的检查和调试技巧,这样您就可以简单地调试使用哪个参数调用哪个类和方法。这很棘手,因为您无法通过搜索找到对该方法的所有调用,例如,因为它是动态生成的。这些选项都不允许使用
$reflectionMethod->setAccessible(true)实现覆盖可访问性$reflectionMethod->invoke($obj)。提问者用“反思”来标记他们的问题。
hello world with argument: stack
Array
(
    [0] => Array
        (
            [file] => folder/test.php
            [line] => 19
            [function] => doThis
            [class] => test
            [type] => ::
            [args] => Array
                (
                    [0] => stack
                )

        )

    [1] => Array
        (
            [file] => folder/test.php
            [line] => 31
            [function] => runTest
            [args] => Array
                (
                )

        )

)
hello world with argument: stack
Array
(
    [0] => Array
        (
            [function] => doThis
            [class] => test
            [type] => ::
            [args] => Array
                (
                    [0] => stack
                )

        )

    [1] => Array
        (
            [file] => folder/test.php
            [line] => 22
            [function] => call_user_func
            [args] => Array
                (
                    [0] => Array
                        (
                            [0] => test
                            [1] => doThis
                        )

                    [1] => stack
                )

        )

    [2] => Array
        (
            [file] => folder/test.php
            [line] => 31
            [function] => runTest
            [args] => Array
                (
                )

        )

)
hello world with argument: stack
Array
(
    [0] => Array
        (
            [file] => folder/test.php(26) : eval()d code
            [line] => 1
            [function] => doThis
            [class] => test
            [type] => ::
            [args] => Array
                (
                    [0] => stack
                )

        )

    [1] => Array
        (
            [file] => folder/test.php
            [line] => 26
            [function] => eval
        )

    [2] => Array
        (
            [file] => folder/test.php
            [line] => 31
            [function] => runTest
            [args] => Array
                (
                )

        )

)
<?php

$a = 'some_class';
$b = 'some_method';
$c = 'double';

echo $a::$b();
echo "<br>";
echo $a::$c(15);


class some_class{

    public static function some_method(){
        return "static return";
    }

    public static function double($int){
        return $int*2;
    }
}

?>
static return
30