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. 【jQuery】将form表单通过ajax实现无刷新提交

    //将form转换为AJAX提交 function ajaxSubmit(url,frm,fn){ var dataPara=getFormJson(frm); $.ajax({ url:url, t ...

  2. Unix环境高级编程(一)文件I/O

    Unix系统中大多数文件I/O只需用到五个函数:open.read.write.lseek.close.本章说介绍的I/O是不带缓冲的,即:每个read和write都调用内核中的一个系统调用.不是IS ...

  3. HDU 3849 By Recognizing These Guys, We Find Social Networks Useful(双连通)

    HDU 3849 By Recognizing These Guys, We Find Social Networks Useful pid=3849" target="_blan ...

  4. IndexOf、LastIndexOf、Substring的用法及C# foreach 中获取索引index的方法

     String.IndexOf String.IndexOf 方法 (Char, Int32, Int32)报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检查指定数量的字符位置 ...

  5. vue开发环境搭建win10

    需要安装nodejs, webpack@2.2.1, babel-cli,  vue-cli 1 安装nodejs 现在版本默认会安装nodejs 和 npm包 和 配置环境 2 检查是否安装成功,在 ...

  6. DOA——ESPRIT算法

    相位phei = 2*pi*f*d*sind(theta),因此理论上来讲测向的算法都可以用来测频. ESPRIT:Estimating signal parameters viarotational ...

  7. Redis安装(源码安装)

    安装环境(redis3.0以上才支持集群部署) 1.服务器环境:linux Centos release 6.8 2.Redis版本(2.8.13)下载地址:http://download.redis ...

  8. 【转】用SQL实现树的查询

    树形结构是一类重要的非线性结构,在关系型数据库中如何对具有树形结构的表进行查询,从而得到所需的数据是一个常见的问题.本文笔者以 SQL Server 2000 为例,就一些常用的查询给出了相应的算法与 ...

  9. [javase学习笔记]-6.3 对象的内存体现

    这一节我们来简单的看一看对象在内存中是什么样子呢,怎样体现. 我们以上一节的測试代码为例. 我们在函数的内存分配分析过.当该代码执行时,首先会载入主函数在栈内存中为main函数分配一个空间: 然后执行 ...

  10. 通过GUID生成可持久化的PID

    byte[] buffer = Guid.NewGuid().ToByteArray(); ); GUID是微软针对UUID的实现,直接生成会大于long类型的最大长度. 但只要转换一下即可