代码之家  ›  专栏  ›  技术社区  ›  Philipp

是否可以确定“可调用”是函数还是类方法?

php
  •  0
  • Philipp  · 技术社区  · 6 年前

    在PHP中 callable 是普通函数或类方法。

    我想检查一个可调用的是(1)一个简单的函数还是(2)一个类方法。如果它是一个类方法,如何找到可调用的类名?

    // The function:
    function callable_type( $var ) {
        if ( ! is_callable( $var ) ) {
            return 'no callable';
        }
    
        $type_info = ... how to check the exact type?
    
        return $type_info;
    }
    
    // Test:
    function fn_a() {}
    class Cls {
        function fn_b() {}
        static function fn_c() {}
    }
    
    $callable1 = 'fn_a';
    $callable2 = array( new Cls, 'fn_b' );
    $callable3 = 'Cls::fn_c';
    
    echo callable_type( $callable1 ); // echo 'function'
    echo callable_type( $callable2 ); // echo 'method of Cls'
    echo callable_type( $callable3 ); // echo 'method of Cls'
    

    这有可能吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   tkausl    6 年前

    is_callable 将可调用名称作为字符串作为第三个参数(它是一个引用)返回,我们可以使用它来解析名称。如果它包含 :: ,它是一个类方法,否则是一个自由函数:

    function callable_type( $var ) {
        if ( ! is_callable( $var, false, $name) ) {
            return 'no callable';
        }
    
        if($name === "Closure::__invoke")
            return "Closure";
    
        $name = explode("::", $name);
    
        if(count($name) === 1)
            return "Free function '" . $name[0] . "'";
    
        return "Class method '" . $name[1] . "' of class '" . $name[0] . "'";
    }
    

    用于以下输入:

    function fn_a() {}
    class Cls {
        function fn_b() {}
        static function fn_c() {}
    }
    
    $callable1 = 'fn_a';
    $callable2 = array( new Cls, 'fn_b' );
    $callable3 = 'Cls::fn_c';
    
    echo callable_type( $callable1 ) . "\n";
    echo callable_type( $callable2 ) . "\n";
    echo callable_type( $callable3 ) . "\n";
    echo callable_type(function() {}) . "\n";
    

    输出:

    Free function 'fn_a'
    Class method 'fn_b' of class 'Cls'
    Class method 'fn_c' of class 'Cls'
    Closure
    
    推荐文章