如何使用可选参数对PHP函数进行类型推断

时间:2015-07-28 08:40:19

标签: php ocaml type-inference

PHP的一点是,当使用带有可选参数的函数时,它没有特定的语法。这样:

foo(10);

可以是这个

function foo($a) {}

或者

function foo($a = 0) {}

或者

function foo($a, $b = 0, ...) {}

(甚至function foo() {},但暂时忽略了这一点。

那么我们如何在函数被定义之前使用函数来推断它?

一种解决方案是记录所有用法,直到定义出现,然后看看它们是否都可以统一。然后上面的例子将存储

int -> unit

以后检查它是否与

兼容
int -> (typ list) -> unit

或其他(其中typ list是可选参数列表)。

您认为这可行吗?还有其他传统方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

我不知道这回答了你的问题的程度,但是要详细说明我上面的评论,你可以使用PHP内置的反射类套件来帮助内省并获得有关函数的有用信息。他们的论点。

具体来说,我认为ReflectionFunctionReflectionParameter在您的情况下可能会有用,尽管有更多功能可能会有所帮助。

例如,这是一个非常简单的示例,您希望获得有关函数参数的一些信息:

<?php

// a simple function with an
// optional/default argument
function foo($a, $b = 0)
{
    return $a + $b;
}

// create a ReflectionFunction object
// passing the name of the function name.
// you can also pass a variable reference 
// to an anonymous function.
$refl = new ReflectionFunction('foo');

// iterate over the ReflectionFunction's
// parameter list to get a ReflectionParameter
// object for each of foo's arguments. here we're 
// just printing out a __toString() summary of each
// argument.
foreach ($refl->getParameters() as $param) {
    echo $param . PHP_EOL;
}

收率:

Parameter #0 [ <required> $a ]
Parameter #1 [ <optional> $b = 0 ]

如您所见,这个简单示例显示了有关foo参数列表的一些信息:参数号,必需/可选,var名称和默认值。

$paramReflectionParameter的一个实例,因此您可以调用一些方法来获取有关每个参数的更多信息,包括:

export
__construct
__toString
getName
isPassedByReference
canBePassedByValue
getDeclaringFunction
getDeclaringClass
getClass
isArray
isCallable
allowsNull
getPosition
isOptional
isDefaultValueAvailable
getDefaultValue
isDefaultValueConstant
getDefaultValueConstantName

希望这有帮助! :)

答案 1 :(得分:0)

你可能不得不插入&#34;弱&#34;键入变量并保留它们直到找到函数定义,或者首先构建一个完整的AST然后通过类型推断运行它并在有定义未知的函数时引发错误(我想知道你对内置函数怎么样,也许使用预烘焙型签名数据库?)。