PHP 7 详解
  • 介绍
  • PHP 7 安装
  • PHP 7.0.x 新特性
    • OOP 特性
      • 类型声明
      • 命名空间与use关键词批量声明
      • 匿名类
      • Throwable 接口
    • 新增操作符
      • 太空飞船操作符(<=>)
      • null 合并运算符(??)
    • 统一变量语法
    • 其他特性和变更
      • 常量数组
      • Switch 中的多个default默认值
      • Session_start 函数中的参数数组
      • Unserialize 函数引入过滤器
      • 整数除法函数 intdiv()
      • 补充*其他特性和变更
    • 补充*新函数
    • 补充*新的全局常量
    • 补充*变更的函数
    • 补充*摒弃一些老式的写法
    • 补充*不向后兼容的变更
    • 补充*在SAPI模块的变化
    • 补充*PHP7底层性能优化
  • PHP 7.1.x 新特性
    • 新特性
      • 可为空(Nullable)类型
      • 对称阵列解构
      • Void 函数
      • 类常量访问权限控制
      • 多异常捕获处理
      • list()现在支持键名
      • 支持为负的字符串偏移量
      • 补充*其他特性与变更
    • 补充*新的函数
    • 补充*新增的全局常量
    • 补充:不向后兼容的变更
    • 补充*废弃的特性
    • 补充*变更的函数
    • 补充*其他的变更
  • PHP7 开发工具
    • Eclipse 安装与配置
  • PHP 标准规范及开发技巧
    • PHP 标准规范 - PSR
    • PHP 开发技巧
    • 面向对象编程的基本原则
  • PHP7调试与性能分析
    • 调试 - Xdebug安装配置
      • 使用Eclipse调试
    • 性能分析 - Xhprof
    • 性能分析 - Vld
  • 附录*Ubuntu环境php开发配置
  • 附录*使用php开发扩展
  • 附录*浏览器插件
  • 附录*第三方类库
  • 附录*小问题整理
  • 附录*资料*工具
  • 附录*Composer
  • 附录*前端
  • 附录*进程
  • 附录*PHP的ticks机制
  • 附录* 通过composer发布自己的包
  • 附录*字符编码问题
  • 附录*注释
Powered by GitBook
On this page
  • 形参类型声明:
  • 函数中,如下代码:
  • 对象的方法中,如下代码:
  • 返回类型声明:

Was this helpful?

  1. PHP 7.1.x 新特性
  2. 新特性

可为空(Nullable)类型

Previous新特性Next对称阵列解构

Last updated 6 years ago

Was this helpful?

官方解释:类型现在允许为空,当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是。可以通过在类型前面加上一个问号来使之成为可为空的。

大话解释:官方的中文翻译是有歧义的,经过测试正确的解释应该是:类型在7.0的时候,不能传入null值,也不能什么都不传,两种情况都会报错,7.1中加上一个问号问号来使之可以传入为null的类型,但是什么值都不传的情况仍然会报错

同时适用于函数和对象的方法中

形参类型声明:

函数中,如下代码:

function test(string $name)
{
    var_dump($name);
}

test('tpunt');
test(null); //此行会引发的错误
test(); //此行会引发的错误

对象的方法中,如下代码:

class Tests
{
    function test(string $name)
    {
        var_dump($name);
    }

}

$test = new Tests();
$test->test('tpunt');
$test->test(null); //由此会行引发的错误
$test->test(); //由此会行引发的错误

PHP7.0 中会报错.如下:

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be of the type string, null given, called in .....
TypeError: Argument 1 passed to test() must be of the type string, null given, called in ....

在PHP7.1当中只需要在类型前面加 ? 即可解决null 报错,什么值都不传的情况仍然会报错.

?string $name

结果

test(); //此行仍然会引发的错误
--------------------------
Fatal error: Uncaught TypeError: Argument 1 passed to test() must be of the type string, null given, called in .....
TypeError: Argument 1 passed to test() must be of the type string, null given, called in ....

进一步结果可以解决test()这种情况的报错,但是如果以上函数的参数定义为 ?Bar $bar = null 的形式,则第三种写法也是可行的。因为 = null实际上相当于 ? 的超集,对于可空类型的参数,可以设定 null 为默认值。

function test(?string $name = null)
{
    var_dump($name);
}

test('tpunt');
test(null); // ok
test(); // ok

以上代码即可解决.同样适用于对象的方法中的形参类型声明.

返回类型声明:

function answer1(): ?int  {
    return null; //ok
}
var_dump(answer1());

function answer2(): ?int  {
    return 42; // ok
}
var_dump(answer2());

function answer3(): ?int  {
    return ''; //由此会行引发的错误 
}
var_dump(answer3());

对象候总类方法的返回类型声明就不再举例了.

null