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. iOS 即时通讯,从入门到 “放弃”?

    原文链接:http://www.jianshu.com/p/2dbb360886a8 本文会用实例的方式,将 iOS 各种 IM 的方案都简单的实现一遍.并且提供一些选型.实现细节以及优化的建议. — ...

  2. ExpandoObject与DynamicObject的使用

    using ImpromptuInterface; using System; using System.Dynamic; namespace ConsoleApp2 { class Program ...

  3. Android 手机上获取物理唯一标识码

    唯一标识码这东西在网络应用中非常有用,例如检测是否重复注册之类的. import android.provider.Settings.Secure;private String android_id ...

  4. SQL 错误 823 I/O error (bad page ID) detected during read【修复方法】

    今天一个数据库损坏了,不管对 该表 查询.修改.添加 都会出错, 错误信息如下: I/O error (bad page ID) detected during read at offset 0x00 ...

  5. navicat 快速复制表所有字段

    查询-新建查询-查询创建工具-选择表-全选字段-查询编辑器

  6. 如何用 LaTeX 撰写博士学位论文?

    如何用 LaTeX 撰写博士学位论文? 序 一直觉得有必要写这样一篇文章,因为学位论文从格式上说更像一本书,与文章 的排版不同,不仅多出目录等文章没有的部分,而且一般要设置页眉页脚方便阅 读查找.学校 ...

  7. 微服务之springcloud技术栈

    一.微服务架构图: 二.技术介绍:(技术选型随着代码的编写会完成) 关于技术选型,我盗了一张微服务技术栈的图,如下:原文:http://www.jianshu.com/p/2da6becfb019 我 ...

  8. SourceInsight自定义常用快捷键

    1.快速显示文件大纲,类似于eclipse中的Ctrl+O: “Options”-"Key Assignments"-"Symbol: Browse Local File ...

  9. C++程序文件链接

    1.什么是转换单元程序中的每个.cpp文件和它包含的所有头文件称为一个转换单元.编译器处理每个转换单元,生成二进制对象文件,用扩展名.obj来标识.链接器将对象文件组合起来,生成一个可执行文件,用扩展 ...

  10. Spring 是如何解决并发访问的线程安全性问题的

    springmvc的controller是singleton的(非线程安全的),这也许就是他和struts2的区别吧!和Struts一样,Spring的Controller默认是Singleton的, ...