返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php中declare(strict_types=1)的有效范围是多少
  • 165
分享到

php中declare(strict_types=1)的有效范围是多少

2023-06-29 01:06:38 165人浏览 独家记忆
摘要

这篇文章主要介绍“PHP中declare(strict_types=1)的有效范围是多少”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php中declare(strict_types=1)的有效范围

这篇文章主要介绍“PHP中declare(strict_types=1)的有效范围是多少”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php中declare(strict_types=1)的有效范围是多少”文章能帮助大家解决问题。

关于declare(strict_types=1)的有效范围

declare(strict_type=1);是php7引入的严格类型检查模式的指定语法

单个文件时strict_types应写在哪里

基本语法

<?phpfunction add(int $a, int $b): int{    return $a + $b;}var_dump(add(1.0, 2.0));

在此状态下执行独立时,输出int(3)

我们提供的是double类型,但php7能很好的处理它,和php5时代没什么区别

做了如下变更

<?phpdeclare(strict_types=1);    //加入这句function add(int $a, int $b): int{    return $a + $b;}var_dump(add(1.0, 2.0));

TypeError产生,如下

PHP Fatal error:  Uncaught TypeError: Argument 1 passed to add() must be of the type integer, float given, called in /Users/hiraku/sandbox/stricttypes/A.php on line 9 and defined in /Users/hiraku/sandbox/stricttypes/A.php:4Stack trace:#0 /Users/hiraku/sandbox/stricttypes/A.php(9): add(1, 2)#1 {main}  thrown in /Users/hiraku/sandbox/stricttypes/A.php on line 4

strict_types不能写在脚本中间

declare语法不能写在脚本的中间,如下写法是错误的

<?phpfunction add(int $a, int $b): int{    return $a + $b;}declare(strict_types=1);var_dump(add(1.0, 2.0));

产生如下错误

PHP Fatal error:  strict_types declaration must be the very first statement in the script in /Users/hiraku/sandbox/stricttypes/A.php on line 7

Fatal error产生,这甚至不是Throwable,而是编译过程中产生的错误

同样,与上述例子相似的位置,也不能使用如下语法

<?phpdeclare(strict_types=1) {  //...}
PHP Fatal error:  strict_types declaration must not use block mode in /Users/hiraku/sandbox/stricttypes/A.php on line 2

两个文件时strict_types如何产生作用

如下代码

A.php脚本在开头声明严格模式

A.php脚本<?phpdeclare(strict_types=1);function add(int $a, int $b): int{    return $a + $b;}

A.phpB.php文件require,如下

B.php脚本<?phprequire 'A.php';var_dump(add(1.0, 2.0));    //注意这里键入的是1.0和2.0浮点数,而A.php声明需要int

执行结果

$ php B.phpint(3)

什么!!!!居然能够执行而不报错!!!!!
原来是B.php并没有声明strict_types,所以对于B脚本来说,是默认的松散模式

也就是说,对于strict_types有以下的行为

  • 不管怎么样,函数定义时的严格模式,行为并不会出现什么不同

  • 函数执行时的,严格模式会出现差异

  • declare(strict_types=1);的语法本身在A.php文件中完成,而被B.php文件require,而B.php并没有定义严格模式,那么执行require的文件(B.php)不会变成严格模式

上述解释就如如下代码所示,理论上A.php文件的严格模式已经关闭了,然而仅仅是B.php文件设定了declare(strict_types=1);,那么即使A.php没有设定严格模式,但A.phpB.php引用了,就对A.php使用严格模式

A.php<?phpfunction add(int $a, int $b): int{    return $a + $b;}
B.php<?phpdeclare(strict_types=1);require 'A.php';var_dump(add(1.0, 2.0));
$ php B.phpPHP Fatal error:  Uncaught TypeError: Argument 1 passed to add() must be of the type integer, float given, called in /Users/hiraku/sandbox/stricttypes/B.php on line 4 and defined in /Users/hiraku/sandbox/stricttypes/A.php:2

三个文件时declare(strict_types=1);的作用

在函数定义部分使用declare(strict_types=1);

再增加一个require,试试3个文件嵌套

C.php → B.php → A.php
C.php<?phprequire_once 'B.php';var_dump(add(1.0, 2.0));var_dump(add2(1.0, 2.0));
B.php<?phpdeclare(strict_types=1);    //在函数定义部分声明require_once 'A.php';function add2($a, $b){    return add($a, $b);}
A.php<?phpfunction add(int $a, int $b): int{    return $a + $b;}

执行结果如下

$ php C.php int(3)PHP Fatal error:  Uncaught TypeError: Argument 1 passed to add() must be of the type integer, float given, called in /Users/hiraku/sandbox/stricttypes/B.php on line 7 and defined in /Users/hiraku/sandbox/stricttypes/A.php:2
  • var_dump(add(1.0, 2.0)); 能正确执行

  • var_dump(add2(1.0, 2.0));产生TypeError错误

也就是说,declare(strict_types=1);会按照如下方式变化

  • 定义函数本身的文件,并不能产生效果

  • 在定义的函数中调用其它函数,严格模式能产生效果(B.php使用了strict_types=1,同时B.php调用了A.php,所以A.php能起作用)

在主体部分中指定strict_types

不在B.php中途位置指定strict_types,而在主要部分即C.php指定,strict模式对所有的都有效吗?然而,事实上strict模式只有在引用的地方有效

C.php → B.php → A.php
C.php<?phpdeclare(strict_types=1);    //主体部分声明require_once 'B.php';var_dump(add2(1.0, 2.0));
B.php<?phprequire_once 'A.php';function add2($a, $b){    return add($a, $b);}
A.php<?phpfunction add(int $a, int $b): int{    return $a + $b;}
$ php C.php int(3)
  • C.php中使用strict_types=1,因此add2(1.0,2.0)以严格模式执行,但是由于没有声明变量,所以没有任何效果

  • 另一方面,具有add2()定义的B.php处于非严格模式

总结

只有在写declare的文件的执行部分才会执行严格模式,该文件中调用的其它函数(其它文件中的函数)也会被影响

也就是说,哪个文件写了declare,哪个文件中的所有代码就需要检查,即使其中的代码来自其它文件,同时,即使这个需要检查的文件还被其它文件调用,也不改变该文件需要检查的事实

Foo.php<?php// 这个文件的strict有效declare(strict_types=1);class Foo{    private $bar;    public function __construct()    {        $this->bar = new Bar; // 执行严格模式    }    public function aaa()    {        $this->bar->aaa(); // 执行严格模式    }}
Bar.php<?php// 这个文件strict无效class Bar{    private $moo;    public function __construct()    {        $this->moo = new Moo; // 执行非严格模式    }    public function aaa()    {        $this->moo->aaa(); // 执行非严格模式    }}

关于“php中declare(strict_types=1)的有效范围是多少”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网PHP编程频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: php中declare(strict_types=1)的有效范围是多少

本文链接: https://lsjlt.com/news/321788.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • php中declare(strict_types=1)的有效范围是多少
    这篇文章主要介绍“php中declare(strict_types=1)的有效范围是多少”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php中declare(strict_types=1)的有效范围...
    99+
    2023-06-29
  • int32的取值范围是多少
    int32的取值范围是从-2的31次方到2的31次方减1,即-2147483648到2147483647。int32是有符号的整数类型,意味着它可以表示正数、负数和零,它使用1位来表示符号位,而剩余的31位用来表示数值。由于一位被用来表示符...
    99+
    2023-08-14
  • mysql中TINYINT取值范围是多少
    这篇文章主要介绍了mysql中TINYINT取值范围是多少的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql中TINYINT取值范围是多少文章都会有所收获,下面我们一起来看看吧。项目场景:最近在开发过程中...
    99+
    2023-07-05
  • mysql bigint的取值范围是多少
    在MySQL中,BIGINT是一种整数数据类型,可以存储范围较大的整数值。其取值范围为从-9,223,372,036,854,775...
    99+
    2024-04-09
    mysql
  • Java中protected的访问权限范围是多少
    在Java中,protected是一种访问修饰符,用于控制成员变量、方法和构造函数的访问权限。当使用protected修饰时,该成员...
    99+
    2023-10-23
    Java protected
  • C语言float的表示范围是多少
    在C语言中,float是一种单精度浮点数类型,它通常使用32位来存储数据。根据IEEE 754标准,float类型的表示范围大约是从...
    99+
    2023-10-21
    C语言
  • 数据库tinyint的取值范围是多少
    在大多数数据库管理系统中,tinyint是一个整数数据类型,通常占用1个字节(8位)。它的取值范围通常是从-128到127,或者从0到255,具体取决于数据库管理系统的实现。有些数据库管理系统也可以将tinyint定义为无符号整数,取值...
    99+
    2023-08-09
    数据库 tinyint
  • 电脑硬盘温度的正常范围是多少
    今天小编给大家分享一下电脑硬盘温度的正常范围是多少的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。如何查看硬盘温度?首先教大家...
    99+
    2023-06-28
  • 亚马逊服务器的使用范围是多少
    数据存储:亚马逊提供各种云存储服务,如Google Drive、Amazon Elastic Ledger等,用于存储和备份用户的数据。 应用程序服务器:亚马逊提供各种应用程序服务器,如Amazon Web Services(ECS)、A...
    99+
    2023-10-27
    亚马逊 服务器
  • 腾讯云服务器的使用范围是多少
    个人用户 腾讯云为个人用户提供了高质量的云计算服务。用户可以选择单租户或多租户模式,并可自定义自己的云服务器。该云服务还提供了云数据库(例如MySQL、MongoDB等),以满足用户的各种数据存储需求。此外,该云服务还支持云缓存、消息...
    99+
    2023-10-27
    腾讯 服务器
  • win8中SSD固态硬盘温度正常范围是多少
    这篇文章将为大家详细讲解有关win8中SSD固态硬盘温度正常范围是多少,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、固态硬盘温度多少算正常一般来说,固态硬盘的正常工作温度是0℃ ~ 70℃,大家可以在...
    99+
    2023-06-28
  • 亚马逊服务器的使用范围是多少啊
    除了服务外,亚马逊还提供了各种基础设施,例如机柜、网络、存储、数据中心、云计算等,以及各种工具和软件,用于管理、维护和扩展这些基础设施。亚马逊还可以提供客户支持和培训服务,以确保客户能够充分利用这些服务 ...
    99+
    2023-10-27
    亚马逊 服务器
  • 使用电脑时硬盘温度的正常范围是多少
    本篇内容主要讲解“使用电脑时硬盘温度的正常范围是多少”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用电脑时硬盘温度的正常范围是多少”吧!1.硬盘温度多少为正常范围硬盘的正常工作温度在40-50...
    99+
    2023-06-28
  • http代理的ip有效时长是多少
    这篇文章主要介绍“http代理的ip有效时长是多少”,在日常操作中,相信很多人在http代理的ip有效时长是多少问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”http代理的ip有效时长是多少”的疑惑有所帮助!...
    99+
    2023-06-25
  • php中的时间戳是多少位
    时间戳是指从1970年1月1日0时0分0秒到现在的秒数。在PHP中,通过time()函数可以获取当前系统时间戳,也可以通过strtotime()函数将时间字符串转换成时间戳。那么,PHP时间戳到底是多少位呢?PHP时间戳是一个10位的整数,...
    99+
    2023-05-14
    php时间戳 php
  • 是否有关于 Rebol 和 Red 中定义范围的总体解释
    在 Rebol 和 Red 中,定义范围是指在代码中创建和使用变量、函数和对象的可见性范围。它决定了在何处能够访问到特定的标识符,并...
    99+
    2023-09-26
    Rebol
  • 我们可以作为参数传递给 MySQL UNIX_TIMESTAMP 函数的日期时间值的范围是多少?
    我们可以作为参数传递给MySQL UNIX_TIMESTAMP函数的日期时间值的范围与TIMESTAMP数据类型的范围相同,即在“1970-01-01 00:00:01”到“2038-01-”之间19 08:44:07'。如果我们在 UNI...
    99+
    2023-10-22
  • PHP中的对象编程算法:函数是如何让你更有效率的?
    PHP是一种流行的编程语言,它支持多种编程范式,包括面向对象编程(OOP)。在OOP中,我们使用对象来表示现实世界中的实体,并使用方法来定义对象的行为。PHP中的对象编程算法是如何利用函数来提高代码效率的呢?让我们来一探究竟。 一、函数的...
    99+
    2023-10-10
    对象 编程算法 函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作