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. Java中堆内存和栈内存详解【转】

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  2. python学习笔记013——模块中的私有属性

    1 私有属性的使用方式 在python中,没有类似private之类的关键字来声明私有方法或属性.若要声明其私有属性,语法规则为: 属性前加双下划线,属性后不加(双)下划线,如将属性name私有化,则 ...

  3. 深度解析(一六)Floyd算法

    Floyd算法(一)之 C语言详解 本章介绍弗洛伊德算法.和以往一样,本文会先对弗洛伊德算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 弗洛伊德 ...

  4. Linux时间子系统(十二) periodic tick

    一.tick device概念介绍 1.数据结构 在内核中,使用struct tick_device来抽象系统中的tick设备,如下: struct tick_device {     struct ...

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

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

  6. WPF绑定时要绑定属性,不要绑定字段

    如题(就是加get;set;),绑定属性不出东西,不知道为什么...

  7. Zero Downtime Upgrade of Oracle 10g to Oracle 11g Using GoldenGate — 4

    Target Side Setup Install OGG on Target Side Creates required directories for OGG [oracle@vzwc1 ggs] ...

  8. [na]802.1x协议无线认证协议&dot1x有线认证实验

    以前搞无线时候,会涉及到无线client接入方式的认证协议. 认证方式+加密方式+有线的dot1x. 注:以前都是doc粘贴到博客的,加上没写博客的习惯,因此会比较乱. EAP(扩展认证协议)是什么? ...

  9. CCCallFunc和CCSequence

    class CC_DLL CCCallFunc : public CCActionInstant //<NSCopying> void Issue1305_2::onEnter() { A ...

  10. angular学习笔记(十九)-指令修改dom

    本篇主要介绍angular使用指令修改DOM: 使用angular指令可以自己扩展html语法,还可以做很多自定义的事情.在后面会专门讲解这一块的知识,这一篇只是起到了解入门的作用. 与控制器,过滤器 ...