PHP is_callable with Type Definitions

时间:2016-08-12 11:33:22

标签: php

一直在搜索PHP文档,这似乎不可能,但想检查一下。

说我有这样的功能:

class Utils {
  static function doSomething( Array $input ){
    ...
  }
}

是否可以使用像is_callable这样的内置PHP函数来检查函数是否存在以及函数中的类型定义是否接受我所拥有的变量。

所以:

$varA = array( 'a', 'b', 'c' );
$varB = 'some string';

$functionToCall = array( 'Utils', 'doSomething' );

is_callable( $functionToCall, $varA ) => true;
is_callable( $functionToCall, $varB ) => false;

当然is_callable不能像这样使用。但是可以在不使用Try Catch的情况下完成吗?

如果不是,那么这是最好的解决方法吗?

try {
  Utils::doSomething( 10 )
} catch (TypeError $e) {
  // react here
}

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用ReflectionClass访问ReflectionMethod

使用ReflectionMethod,您可以访问ReflectionParameter并检查参数的类型或类

AjaxOptions.OnSuccess

参考:reflectionparameterreflection

答案 1 :(得分:1)

您可以使用ReflectionFunction

function someFunction(int $param, $param2) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParams = $reflectionFunc->getParameters();
$reflectionType1 = $reflectionParams[0]->getType();
$reflectionType2 = $reflectionParams[1]->getType();

echo $reflectionType1;
var_dump($reflectionType2);

结果:

int
null

参考:http://php.net/manual/en/reflectionparameter.gettype.php

答案 2 :(得分:1)

听起来你正在从错误的角度接近这个。

在您的示例用例中,您似乎想要测试Utils::doSomething()方法是否存在并接受您希望接收的参数。

这样做的典型方法是使用界面。

在您的示例中,您将拥有如下界面:

interface utilsInterface
{
    public static function doSomething(Array $input);
}

然后可以简单地修改您的Utils类以实现此接口:

class Utils implements utilsInterface
{
     public static function doSomething(Array $input)
     {
          //....
     }
}

现在,您需要做的就是检查类是否符合您的要求,检查它是否实现了接口:

if (Utils::class instanceof utilsInterface) {
    // now we know that we're safe to call Utils::doSomething() with an array argument.
}