现在,这是可能的了。
经过长时间的讨论,一个提案被批准,允许对标量函数参数和返回值进行类型提示。有关详细信息,请查看最高票数的投票结果。
标量类型提示包括声明函数参数和返回值的类型,可以是int、float、string和bool类型。这使得PHP运行时引擎能够检查传递给参数函数和返回值的值的类型是否符合预期类型,从而检测可能出现的编程错误。
对象、数组和可调用类型的类型提示已经允许在过去的PHP版本中使用。
当前实现引入了五个新的保留字:int、float、bool、string和numeric。它们以前不是保留字,因为强制转换是词法分析器中的特殊情况。
Example :
function test(float $a) {
var_dump($a);
}
test(1); // float(1)
test("1"); // float(1)
test(1.0); // float(1)
test("1a"); // E_RECOVERABLE_ERROR
test("a"); // E_RECOVERABLE_ERROR
test(""); // E_RECOVERABLE_ERROR
test(1.5); // float(1.5)
test(array()); // E_RECOVERABLE_ERROR
test(new StdClass); // E_RECOVERABLE_ERROR
你还可以选择在源文件中声明,以允许标量类型提示。它必须是你配置脚本的第一行,并且不能在同一文件的其他地方声明。
Like : declare(strict_types=1)
在运行时,当PHP引擎尝试返回一个值时,如果它与声明的类型不匹配,它将抛出致命错误,如下所示:
Fatal error: Argument 1 passed to increment() must be of the type integer, string given
通过这种新的声明特性,您可以编写更加健壮的应用程序,通过检测将错误类型的值传递给函数而引起的早期编程错误。
类型的自动转换也可能发生。例如,int类型参数可以自动转换为float类型参数。
function test(float $x){
var_dump($x);
}
test(10);
声明返回类型
我们可以在函数声明的最后一个括号和第一个方括号之间添加冒号,后跟期望的类型来声明返回类型。
对于不返回任何值的函数,在返回类型声明部分不应添加任何内容。
function mustReturnInt(): int { ... }
function mustReturnString(): string { ... }
function mustReturnBool(): bool { ... }
function mustReturnFloat(): float { ... }
function doesNotReturnAnything() { ... }
稍微复杂一些的示例
declare(strict_types=1);
class StrictTypesTestingClass {
public function returnSameInt(int $value): int { return $value; }
public function returnSameFloat(float $value): float { return $value; }
public function returnSameString(string $value): string { return $value; }
public function returnSameBool(bool $value): bool { return $value; } }
$check = new StrictTypesTestingClass(); // calls that work print $check->returnSameInt(10);
print $check->returnSameFloat(10.0);
print $check->returnSameString("test");
print $check->returnSameBool(true) ? 'true' : 'false'; // calls that throw exceptions
print $check->returnSameInt("10");
print $check->returnSameFloat("10.0");
print $check->returnSameString(10);
print $check->returnSameBool("true");
弱类型检查和类型转换的行为:弱类型检查模式可以与语句declare(strict_types=0);或没有严格类型声明一起使用。需要注意以下几点:
调用扩展或内置PHP函数的弱类型检查具有与以前PHP版本相同的行为。
新标量类型声明的弱类型检查规则大多与扩展或内置PHP函数相同。
NULL是一个特殊情况,为了与类、可调用项和数组的当前类型声明保持一致。默认情况下不接受NULL,除非它是一个参数,并明确给出了默认值NULL,例如:function sample(int $a = NULL);
这种方法有许多优点。您将获得类型安全。这意味着您最终可以对代码进行静态分析!您可以检测到错误,例如,您意外地从一个函数中取出一个字符串并将其作为整数传递给另一个函数。对于我这样每天使用PHP并将Java视为面向对象编程语言参考的开发人员而言,这是PHP的巨大进步。