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
是可选参数列表)。
您认为这可行吗?还有其他传统方法可以解决这个问题吗?
答案 0 :(得分:0)
我不知道这回答了你的问题的程度,但是要详细说明我上面的评论,你可以使用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
参数列表的一些信息:参数号,必需/可选,var名称和默认值。
$param
是ReflectionParameter
的一个实例,因此您可以调用一些方法来获取有关每个参数的更多信息,包括:
export
__construct
__toString
getName
isPassedByReference
canBePassedByValue
getDeclaringFunction
getDeclaringClass
getClass
isArray
isCallable
allowsNull
getPosition
isOptional
isDefaultValueAvailable
getDefaultValue
isDefaultValueConstant
getDefaultValueConstantName
希望这有帮助! :)
答案 1 :(得分:0)
你可能不得不插入&#34;弱&#34;键入变量并保留它们直到找到函数定义,或者首先构建一个完整的AST然后通过类型推断运行它并在有定义未知的函数时引发错误(我想知道你对内置函数怎么样,也许使用预烘焙型签名数据库?)。