在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会将其突出显示,以便更容易理解。

PhpStorm: 'void' function 'a' result used

此外,类似于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有趣的知识留在那就好了……忘记了也没关系。

void, void, void, void, void, void, void, void, void, void, void, void...

[追記] 在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不就行了吗?为什么会有这样的类型转换?

好吧,我不知道……以前我这样抱怨的时候,好像有人给我一个令人满意的解释,但我已经不记得了,所以这可能是一件无关紧要的事情。

注释

2017年4月2日19:51:47发布
广告
将在 10 秒后关闭
bannerAds