繁体   English   中英

如何使用可选参数键入PHP函数

[英]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的内置反射类套件来帮助内省和获取有关函数及其参数的有用信息。

具体来说,我认为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的参数列表的一些信息:参数编号,必需/可选,变量名和默认值。

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM