Type hints, Type safe

泊学实操视频 
泊学原文链接
PHP 7中最引人注目的新特性之一,无疑是Scalar type hints。我们可以在函数参数和返回值中使用scalar type hints,还可以指定scalar type的推导和匹配方式。

Scalar type hints

Type hints并不是什么新生事物,PHP 5.0第一次引入了type hints特性,允许我们指定函数的参数是一个特定class或interface类型。之后,在PHP 5.1中,我们可以指定参数是一个array type,在PHP 5.4中,我们可以指定参数是一个“可被调用(callable)”的类型(例如:function或Closure)。在经过了对RFC若干次的修改和讨论之后,PHP 7终于把scale type也加入到了type hint中。

PHP 7允许我们在type hints中使用下面这4种scalar type:

bool: true/false;
float: 表示浮点数类型;
int: 表示整数类型;
string: 表示字符串类型;
我们来看一个使用上面这些scalar type hints的例子:

<?php
function sendHttpResponse(int $statusCode, string $statusText) { } sendHttpResponse(200, "OK");
sendHttpResponse("404", "File not found");

对于上面的两个调用,是否满足sendHttpResponse的type hints,取决于我们对匹配方式的设置。

Coercive Type

这是PHP 7针对scalar type hints采取的默认方式,即尽可能尝试把参数转换成scalar type hints要求的类型。所以,在sendHttpResponse("404", "File not found")中,"404"会被转换成整数400,让函数得以正常执行。当然,方便总是有代价的,因为类型转换有时会导致精度丢失。我们来看一些常见的例子:

<?php

function coerciveInt(int $a) {
echo "a = ".$a;
} coerciveInt(1.5); // 1
coerciveInt("100.1"); // 100
coerciveInt("100int"); // 100 function coerciveFloat(float $a) {
echo "a = ".$a;
} coerciveFloat(1); // 1.0
coerciveFloat("3.14"); // 3.14
coerciveFloat("3.14PI"); // 3.14

在这里,要特别说一下bool类型,它和我们在C++中的处理逻辑类似,一切表达“空值”的概念,例如:0, 0.0, null, "0", ""(空字符串), [](空数组),$uninitializedVar(未经初始化的变量),都会被认为是false,除去这些情况之外的,则会被认为是true。

Strict Type

如果你不希望PHP 7执行上面的类型转换,要求类型严格匹配,你可以手动启用PHP 7的“严格模式”。在这个模式下,任何不严格匹配的类型都会导致抛出\TypeError异常。Strict type只能在web application的中使用,也就是说,如果你在编写一个library,你不能在你的代码里,开启strict type。

启用strict type很简单,在PHP代码中的第一行,写上declare(strict_types=1);。

*“PHP起始标记和declare(strict_types=1);之间,不能有任何内容,namespace必须紧跟在declare语句后面。”
特别提示*

我们来看一些例子,它们都会导致\TypeError异常:

<?php declare(strict_types=1);

function strictInt(int $a) {
echo "a = ".$a;
} strictInt(1.5); // \TypeError
strictInt("100.1"); // \TypeError
strictInt("100int"); // \TypeError function strictFloat(float $a) {
echo "a = ".$a;
} strictFloat(1); // \TypeError
strictFloat("3.14"); // \TypeError
strictFloat("3.14PI"); // \TypeError

Return Type Hints

在PHP 7,我们除了可以type hint函数参数之外,还可以type hint函数的返回值,像下面这样:

<?php

function divisible(int $dividend, int $divider): int {
return $dividend / $divider;
} divisible(6, 3);
divisible(6, 4);

Return type hints对类型的处理,和参数使用的规则是相同的。默认采用coersive type,当开启strict type之后,不满足约定的类型将会导致\TypeError异常。

原文:
https://segmentfault.com/a/1190000004150197

上手并过渡到PHP7(2)——必须传递int, string, bool参数?没问题的更多相关文章

  1. 上手并过渡到PHP7(4)——取代fatal error的engine exceptions

    上手并过渡到PHP7 取代fatal error的engine exceptions 泊学原文链接泊学代码秀视频 自从PHP 4以来,PHP的错误处理几乎就是一成不变的.只不过在PHP 5.0里添加了 ...

  2. 上手并过渡到PHP7(1)——基于Homestead的PHP7和XDdebug环境

    PHP7 up and running 泊学实操视频泊学原文链接PHP7, Xdebug and Homestead 在经历了13个RC版本之后,PHP 7终于来了.在我们上手评估PHP 7的新特性之 ...

  3. 上手并过渡到PHP7(3)——Uniform Variable Syntax到底统一了什么

    PHP7 up and running 泊学原文链接泊学实操视频 Uniform Variable Syntax 在PHP 7提出Uniform Variable Syntax之前,我们大多数人可能都 ...

  4. 上手并过渡到PHP7(5)——轻量级“集合”迭代器-Generator

    轻量级“集合”迭代器-Generator泊学视频链接泊阅文档链接Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Gener ...

  5. Android java传递int类型数组给C

    接着前面的文章<Android java传递int类型数据给C><Android java传递string类型数据给C>,继续实践 实现public native int[] ...

  6. Android java传递int类型数据给C

    本文根据<Android jni简便开发流程>中的开发流程来实现一个java传递int类型数据给C 新建项目,进行简单的布局 <LinearLayout xmlns:android= ...

  7. Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装

    阅读目录 1. 通过HttpServletRequest获得请求参数和数据 2. 处理方法形参名==请求参数名 3. 如果形参名跟请求参数名不一样怎么办呢?用@RequestParam注解 4. 用实 ...

  8. 0056 Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装

    浏览器总会向服务器传递一些参数,那么Spring MVC如何接收这些参数? 先写个简单的html,向服务器传递一些书籍信息,如下: <!DOCTYPE html> <html> ...

  9. Shell脚本传递带有空格的参数[摘录自网络]

    参数处理 说明 $# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数 $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的ID号 $@ 与$#相同,但是使用时加引号,并在 ...

随机推荐

  1. WCF 的 WebGet 方式

    .NET 3.5以后,WCF中提供了WebGet的方式,允许通过url的形式进行Web 服务的访问.在以前的代码中,写过多次类似的例子,但总是忘记如何配置,现在将设置步骤记录如下: endpoint通 ...

  2. spring 4.0下集成webservice

    该教程使用的项目可参见: Intellij Idea下搭建基于Spring+SpringMvc+MyBatis的WebApi接口架构 具体源码请参见GitHub: https://github.com ...

  3. jquery中 $ 和 jQuery 及 $() 的区别

    用过jquery的人都知道,jquery有两种用法,一种是$,还有一种是jQuery,那么这两种方式在使用上有什么区别呢? 答案是这两种用法没什么区别,只是别名而已,用$要比jQuery简短一些.方便 ...

  4. Python学习笔记010——函数文档字符串

    函数文档字符串documentation string (docstring)是在函数开头,用来解释其接口的字符串.简而言之:帮助文档 包含函数的基础信息 包含函数的功能简介 包含每个形参的类型,使用 ...

  5. JMeter学习-内存溢出解决方法

    现象:使用jmeter进行压力测试时遇到一段时间后报内存溢出outfmenmory错误,导致jmeter卡死了 方法一: windows环境下,修改jmeter.bat: set HEAP=-Xms2 ...

  6. 卸载linux订阅包

    message日志信息: Oct :: oracledb1 rhsmd: In order for Subscription Manager to provide your system with u ...

  7. Intelligence System (hdu 3072 强联通缩点+贪心)

    Intelligence System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  8. VC编译错误: Nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12已经在dllmain.obj 中定义

    错误: Nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12已经在dllmain.obj 中定义 解决: 打开项目属性对话框, C/C++ -& ...

  9. Java学习笔记----main

    1.java中main方法是程序的入口方法.main还是必须的两个修饰符是public和static.举例 A:public static void main(String args[]) B:pub ...

  10. XILINX XST综合的选项的含义

    所谓综合,就是将HDL语言.原理图等设计输入翻译成由与.或.非门和RAM.触发器等基本逻辑单元的逻辑连接(网表),并根据目标和要求(约束条件)优化所生成的逻辑连接,生成EDF文件.完成了输入.仿真以及 ...