[英]How to type-infer PHP-functions with optional arguments
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
是可选参数的列表)。
您认为这可行吗? 还有其他常规方法可以解决此问题吗?
我不知道这在多大程度上可以回答您的问题,但是要详细说明我在上面的评论,您可以使用PHP的内置反射类套件来帮助内省和获取有关函数及其参数的有用信息。
具体来说,我认为ReflectionFunction
和ReflectionParameter
在您的情况下可能会有用,尽管还有很多功能可能会有所帮助。
例如,这是一个非常简单的示例,您想在其中获得有关函数参数的一些信息:
<?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
的参数列表的一些信息:参数编号,必需/可选,变量名和默认值。
$param
是ReflectionParameter
一个实例,因此可以调用一堆方法来获取有关每个参数的更多信息,包括:
export
__construct
__toString
getName
isPassedByReference
canBePassedByValue
getDeclaringFunction
getDeclaringClass
getClass
isArray
isCallable
allowsNull
getPosition
isOptional
isDefaultValueAvailable
getDefaultValue
isDefaultValueConstant
getDefaultValueConstantName
希望这可以帮助! :)
您可能必须插入“弱”类型变量并保留它们,直到找到函数定义为止,或者首先构建完整的AST,然后通过类型推断对其进行运行,如果存在定义不明的函数,则会引发错误(我想知道您如何处理内置函数,也许使用预烘焙的类型签名数据库?)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.