在PHP中,void是什么意思?
在PHP的上下文中,”void”一词以几种不同的意义被使用。
简直void是什么意思
void(ボイド)是在编程语言中用于表示”什么也没有”这种意义的类型的名称。它通常作为原始类型的关键字或保留字使用。
(从维基百科1中引用的无效(计算机))
在C语言中,我们可以使用void f(void)这样的语法来描述一个“不接收参数并且不返回参数”的函数的原型。
PHP手册中的void
PHP:在本文档中,关于伪类型和变量的说明可以在手册中找到。
当返回值的类型为void时,表示返回值没有意义。如果在参数列表中使用void,则表示该函数不接受参数。
具体来说,如下所示。
标题
(PHP 4,PHP 5,PHP 7)
header – 发送原始的HTTP头信息
说明
void header ( string $string [, bool $replace = true [, int $http_response_code ]] )
(PHP:引用自手册的标头)
这意味着header()函数的执行结果不返回任何值。
换句话说,执行诸如 $result = header($str); 或 var_dump(header($str)); 这样的操作是毫无意义的。虽然毫无意义,但这些返回值实际上是NULL。
get_defined_vars 函数能够以数组的形式返回所有已经定义过的变量。
说明
array get_defined_vars ( void )
(PHP:get_defined_vars – 手册引用)
这次的参数是 (void)。这不表示期望特殊参数,而表示列表的内容为空,也就是说参数不接收任何内容。对于这样的函数,虽然传入参数通常不会引发错误,但却是毫无意义的。
在PHPDoc中的void
这是一种类似于PHP手册中的@return标签的伪类型。
没有返回值的函数,在PHPDoc类型注释中,可以按以下方式书写。
/**
* @return void
*/
function hoge()
{
echo "hoge";
}
与其说是后续的类型声明,PHPDoc在运行时没有任何影响。实际上,它只是普通的注释行,所以在PHP 7.1以下版本也可以自然地使用。
PHP7.1版本中的`void`类型声明
在PHP7中,可以在返回值中进行类型声明;然而,在PHP7.1中,这一功能得到了进一步增强,现在还可以使用void关键字进行声明。
function hoge(): void
{
echo "hoge";
}
这个类型声明的特点是返回值会导致错误。
<?php
function a(): void
{
echo "a";
if (false) {
return true;
}
}
a();
// Fatal error: A void function must not return a value in /in/ZidNI on line 7
这个特点让人感到安心,即使是在不实际执行的处理中,只需在return语句中写入返回值,就能捕捉到错误。
没有参数的返回不会有问题。
function b(): void
{
if (foo()) {
return;
}
bar();
buz();
return; // 省略可能
}
工具支援
当你试图使用返回值为空的函数的返回值时,PhpStorm会将其突出显示,以便更容易理解。

此外,类似于Phan的独立静态分析工具也能够检测到这个问题。
funcs.php:8 PhanTypeVoidAssignment Cannot assign void return value
在PHP中,是使用PHPDoc还是类型声明来写代码?
只需要一个选项,用中国人的方式改写:关于PHPDoc形式的类型注释`@return void`以及PHP 7.1形式的类型声明`void`的选择,只需要根据”代码是否只用于PHP 7.1及以上版本”来决定,不会有任何问题。
刚才介绍的两个工具,PhpStorm和Phan,对于这两种写法都认为是一样的,所以无论用哪个写都是一样的。对于void类型声明,推荐使用PHP 7.1,因为它可以在定义时轻松检测到返回值错误,而无需额外安装特殊工具。
可以写两种形式,但只是冗长而已,所以没有写两种的好处。只需要写其中一种就可以了。如果明确不会在PHP 7.1以下版本中运行代码,那么统一使用void类型声明会更简洁。
如果你想要在广泛应用的库中支持PHP7.1以下的版本,建议使用PHPDoc格式的@return void进行编写。
无论如何都没关系
PHP测验:在以下内容中,哪一行是检测到语法错误的最顶部行?? pic.twitter.com/zwHXYaYuti— nya-n (@tadsan) February 15, 2018
<?php
namespace
{
const void = null; // 1
goto void;
function void( // 2
$void = void // 3
): void // 4
{
var_dump(void);
return void; // 5
}
}
namespace void
{
void:
void(void);
}
void被添加到PHP7.1中作为伪类型名,并用于其他保留字。
PHP 7.0.0 及以后版本,这些关键字可以作为属性和常量的名称使用。同时,它们还可以作为类、接口和特性的方法名称使用。
与 PHP 7.0 中作为方法允许使用的关键字列表不同,“其他保留字” 只是无法作为类名(包括特征和接口),但可以正常定义为函数名、方法名、命名空间、常量名和 goto 标签等符号。
这样做并没有特别的好处,所以请将PHP有趣的知识留在那就好了……忘记了也没关系。

[追記] 在PHP中没有void转型/运算符。
此外,某些编程语言(如JavaScript)存在void运算符。JavaScript的void运算符对操作数的表达式进行求值并得到其值,但该值会被丢弃,不返回任何值。这类似于在C语言中用void类型进行强制转换来明确丢弃值(例如,(void)printf(“Hello”))的情况。
在PHP中,没有适用于这种用途的(void)选项。取而代之的是,存在(unset)类型转换。这将将任何值转换为null。
Psy Shell v0.8.17 (PHP 7.1.14 — cli) by Justin Hileman
>>> (unset)[]
=> null
>>> (unset)fopen('php://stdout', 'w');
=> null
>>> $a = "AAAAA";
=> "AAAAA"
>>> (unset)$a
=> null
>>> $a
=> "AAAAA"
>>> unset($a)
>>> $a
PHP Notice: Undefined variable: a on line 1
需要注意的是,(unset)函数会无论传入什么值都返回null,但并不会将变量恢复为未定义状态。而是使用unset($v)来实现。
这有什么翻译的价值呢?直接写null不就行了吗?为什么会有这样的类型转换?
好吧,我不知道……以前我这样抱怨的时候,好像有人给我一个令人满意的解释,但我已经不记得了,所以这可能是一件无关紧要的事情。