资讯专栏INFORMATION COLUMN

谈谈 PHP 中的类型约束

libxd / 3216人阅读

摘要:但是在以来,在面向对象中,为方法带来了类型约束,然而这些都非常的鸡肋,从文档上可以看到。支持对象接口支持数组支持匿名函数类型约束不能用于标量类型如或。它的运作方式,是在中设置一个标志位,让函数调用和返回类型检查符合类型约束。

起点

众所周知,PHP 是弱类型语言,与其他强类型语言项目,在这方面会有很多的坑,但是已经发展到 PHP 7 之后,PHP 也对类型约束有了所指,并且在许多流行框架中被大量使用比如Laravel,因为这确确实实在软件开发过程中无论是运行,还是 IDE 的代码提示都能为我们带来极大的便利,下面就一步步来看看 PHP 中的类型约束。

早期的约束

虽然 PHP 是隐式转换,但是在实际开发中也会存在一些无法转换的窘境,当然这些问题我们在开发阶段很容易发现,但是如果是一些动态的内容导致不可控就会呈现在用户面前,也就是 BUG ,在 PHP 中有一批以 is_* 开头的方法用来做一些简单类型判断(这其中一些方法也是新方法没有翻译的基本都是)。

is_array — 检测变量是否是数组

is_bool — 检测变量是否是布尔型

is_callable — 检测参数是否为合法的可调用结构

is_countable — Verify that the contents of a variable is a countable value

is_double — is_float 的别名

is_float — 检测变量是否是浮点型

is_int — 检测变量是否是整数

is_integer — is_int 的别名

is_iterable — Verify that the contents of a variable is an iterable value

is_long — is_int 的别名

is_null — 检测变量是否为 NULL

is_numeric — 检测变量是否为数字或数字字符串

is_object — 检测变量是否是一个对象

is_real — is_float 的别名

is_resource — 检测变量是否为资源类型

is_scalar — 检测变量是否是一个标量

is_string — 检测变量是否是字符串

is_a — 如果对象属于该类或该类是此对象的父类则返回 TRUE

is_subclass_of — 如果此对象是该类的子类,则返回 TRUE

在 PHP 5 之前,如果我们要做类型约束,那么就必须用到这些,这些方法对参数进行复杂的判断,并处理错误返回给调用者。

但是在 PHP 5 以来,在面向对象中,为方法带来了类型约束,然而这些都非常的鸡肋,从文档上可以看到。

PHP 5 支持 对象接口

PHP 5.1 支持 数组

PHP 5.4 支持匿名函数

类型约束不能用于标量类型如 int 或 string。Traits 也不允许。

在 PHP 5 中其实光是第一条,就够大部分场景使用,但是也有一些知名问题,比如最后一条的 不支持标量类型 ,也就是说支持不是很全面,而且还有一种情况没有考虑 那就 null 虽然 null 是一个特殊类型,但是有时候当数据不可控时也会出现,而且,在 PHP 5 阶段,类型约束并没有被很好的使用,或许是那个时候并不是那么的重视,毕竟弱类型是 PHP 的一大特点,但也是致命伤,甚至很多时候被强类型语言牵着鼻子走。

PHP 7

PHP 7 相对于先前的PHP版本可谓是焕然一新。

错误与异常的处理

标量类型声明

返回值类型声明

可为空(Nullable)类型 (PHP 7.1)

Void 函数

比较扎眼的就是完善了对类型限制的支持,补上了之前的短缺,包括标量类型返回值类型,而且,在 PHP 7.1 中还加入了严格类型验证

强制类型验证 strict_types/declare()指令

默认情况下,所有的PHP文件都处于弱类型校验模式。新的declare指令,通过指定strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句;0表示弱类型校验模式。

declare(strict_types=1)必须是文件的第一个语句。如果这个语句出现在文件的其他地方,将会产生一个编译错误,块模式是被明确禁止的。

类似于encoding指令,但不同于ticks指令,strict_types指令只影响指定使用的文件,不会影响被它包含(通过include等方式)进来的其他文件。该指令在运行时编译,不能修改。它的运作方式,是在opcode中设置一个标志位,让函数调用和返回类型检查符合类型约束。

举个

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31198.html

相关文章

  • 谈谈在编程过程中的工程化思维

    摘要:工程化的思维可以在项目起手的阶段大致构建出整个框架,然后逐步的去添加功能。工程化的思维可以快速的解决问题,从面到点,而不是从点到线。 任何计算机语言都是工具,都是用来解决问题。所有的现代编程语言都有相同之处,基本类型值(string number boolean......),引用类型值(数组,对象,函数,类),语句(if,switch,while,do while......),甚至...

    cnio 评论0 收藏0
  • 谈谈在编程过程中的工程化思维

    摘要:工程化的思维可以在项目起手的阶段大致构建出整个框架,然后逐步的去添加功能。工程化的思维可以快速的解决问题,从面到点,而不是从点到线。 任何计算机语言都是工具,都是用来解决问题。所有的现代编程语言都有相同之处,基本类型值(string number boolean......),引用类型值(数组,对象,函数,类),语句(if,switch,while,do while......),甚至...

    FreeZinG 评论0 收藏0
  • 浅谈PHP类型约束

    摘要:但是在的高版本语法中起,在某些特定场合,针对某些特定类型,也是可以进行语法约束的。注意在以前,类型约束不能用于标量类型如或。这意味着严格声明标量是基于文件可配的。这个指令不仅影响参数的类型声明,也影响到函数的返回值声明。 前言 众所周知,在 强类型 语言中,类型约束 是语法上的要求,即:定义一个变量的时候,必须指定其类型,并且以后该变量也只能存储该类型数据。 而我们的PHP是弱类型语言...

    forsigner 评论0 收藏0
  • PHP 类型约束

    摘要:导语所谓类型约束,即定义一个变量的时候,必须指定其类型,并且以后该变量也只能存储该类型数据。当类型约束为接口时,可以传入实现接口的类或。参考资料类型约束标量类型声明。 导语 所谓类型约束,即定义一个变量的时候,必须指定其类型,并且以后该变量也只能存储该类型数据。PHP 虽然是弱类型语言,但是在 PHP 5 已经支持类型约束,包括对象、接口、数组,在 PHP 7 之后支持标量类型约束,下...

    funnyZhang 评论0 收藏0

发表评论

0条评论

libxd

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<