[php7系列]--php7里的返回类型声明和标量类型声明及不要用isset判断数组是否定义某个KEY-最好使用array_key_exists

一、[php7系列]--php7里的返回类型声明和标量类型声明

    php7里增加了返回类型声明和标题类型声明,可以理解为对一个方法的输入输出进行了类型验证,在PHP7之前,方法里的数组、对象参数是有类型声明的,但其它的整数、字符串等类型声明没有。这次在PHP7里也加上了。返回类型声明,之前的版本里都没有,这次都全部加上。

    返回类型声明的示例如下:

function getDoctor() : Doctor { return 'here:this is string,not a class!'; 
} 
$doctor = getDoctor();

     如果在PHP7下运行会报错:TypeException: Return value of getDoctor() must be an instance of Doctor, string returned,即上面的方法要求了返回类必须是Doctor的实例化的类,而当前方法返回的是字符串。所以报错。

    参数类型声明(标量类型声明)也差不多,在原来的类、数组的基础上增加:int、float、string和bool四个类型,需要注意的是虽然PHP7使用了标题类型声明,但并非是强制使用,有一个strict_types/declare()指令,可以声明是采用弱类型校验模式(可当做不检验,和PHP7之前的版本一样)和严格类型校验模式(根据类型声明严格检验)。

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

declare(strict_types=1); #declare(strict_types=1)必须是文件的第一个语句,否则会产生一个编译错误。

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

    新增的这些类型声明定义对性能并没有提升, 相反引入了严格的类型检查, 在正常的情况下反而会加大runtime的开销,见鸟哥在知乎上的回复:这个特性的本意也不是为了性能考虑,当然,  类型提示会对类型推断起到帮助作用, PHP 7.1中已经加入了"类似"JIT的技术(type specifical opcode handler), 比如 如果类型推断出$a 是int , $b 是int, 那么 $a+$b 就可以使用ZEND_ADD_LONG handler, 从而间接的提高性能.但是, 总的来说, 这个特性的最初出发点, 并不是为了性能。

    我觉得这是一个很好的改变,特别是返回类型的要求,因为在程序开发中,有时我们预期返回一个数组,但是写的时候可能不注意,在某些case的时候直接返回了false之类的,而在处理时又未加上数组判断,导致线上某些CASE下出现了问题。所以还是挺有作用。当然也不建议所有的地方都有必要这样使用。

二、不要用isset判断数组是否定义某个KEY-最好使用array_key_exists

    (publish:June 16, 2017 -Friday) 之前没有碰到这个小问题,习惯了判断数组中有没有某个键值时,总是用isset($array[$key]).但今天在测试一个项目时发现这个判断离奇地不起作用了。影响代码:

if(isset($array[$key])) unset($array[$key]));

    就是这么一句简单的代码,作用是避免将这个字段抛到接口层。后来发现这个数据从数据库里取出来,其值为null;其实我非常讨厌null这个东西,因为总会有奇怪的事情发生。但是后端内容控制后台是别的同事开发,我也提过null这个东西,但人家就那样。得了吧,我们就前端控制。很多地方对输出字段进行判断,如果值为空(包含null),我们就把值置成空字符串,否则接口里会直接显示null的。严重甚至导致APP端上崩溃。不过在处理了这么多地方后原来还有这么一个小坑。

    问题找到了就没有啥了,原因就是isset判断数组是否有某个KEY时,如果值为NULL,是不会返回TRUE的。

#数据库表里的字段
$hello  = null;
$arr = array('hellos' => null);#变量值为null或者数组某个KEY对应的值为NULL。isset返因的都是false;如下
if(isset($hello)) echo 'yes hello;<br>';
else echo 'no hello;<br>';
if(isset($arr['hellos'])) echo 'yes hellos;<br>';
else echo 'no hellos;<br>';

    那怎么判断是否定义了某个变量呢(值为null)和某个数组的KEY呢(KEY对应的值为NULL)。数组的方法里实际有这么一个方法:array_key_exists,对于变量,可以去取全局已定义变量数组来判断,程序如下:

#判断数组有没有定义KEY:
if(array_key_exists('hellos', $arr)) echo 'yes hellos key;<br>';
else echo 'no hellos key;<br>';#is_null无论是没定义或者值为null都认为是null;有点像用isset判断是否定义数组的KEY一样
if(is_null ($hello)) echo '---yes $hello is null;<br>';
if(is_null ($hello22)) echo '---yes $hello22 is null;<br>';#判断定义了一个null变量
$vars = (array)get_defined_vars();
if(array_key_exists('hello', $vars)  && !isset($hello) ) echo 'yes $hello is null;<br>';

输出结果:

no hello;
no hellos;
yes hellos key;
---yes $hello is null;
---yes $hello22 is null;
yes $hello is null;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【海贼王航海日志:前端技术探索】HTML你学会了吗?(一)

目录 1 -> HTML概念 2 -> HTML结构 2.1 -> 认识HTML标签 2.2 -> HTML文件基本结构 2.3 -> 标签层次结构 3 -> 快速生成代码框架 4 -> HTML常见标签 4.1 -> 注释标签 4.2 -> 标题标签 4.3 -> 段落标签 4.4 -> 换行标签 4.5 ->…

ES(ElasticSearch)倒排索引

目录 正排与倒排索引 1.正排索引 作用&#xff1a; 优点&#xff1a; 缺点&#xff1a; 2.倒排索引 原理&#xff1a; 倒排索引的构建流程&#xff1a; 倒排索引的搜索流程&#xff1a; 优点&#xff1a; 缺点&#xff1a; 3. 应用场景 倒排索引中有几个非常重要的概念…

【二叉树的锯齿形层序遍历】python刷题记录

R2-树与二叉树篇 层序遍历双端队列deque # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def zigzagLevelOr…

【读代码】高斯掩模

目录 问题&#xff1a; 主要功能&#xff1a; 问题&#xff1a; 看不懂实现的功能 主要功能&#xff1a; 从输出张量中提取与边界框对应的区域&#xff0c;并计算该区域与高斯核之间的均方误差&#xff08;MSE&#xff09;损失 例子 假设我们有以下输入&#xff1a; boxe…

我的创作纪念日(一)——Giser?Noder?不如“Computer”

目录 Giser&#xff1f;Noder&#xff1f;不如“Computer” 一、根源&#xff1a;保持学习习惯的刚需 二、机缘&#xff1a;processOn的另类替代 三、日常&#xff1a;对技术栈丰富的思考 四、成就&#xff1a;保持心态健康的活着 五、憧憬&#xff1a;能一直心态健康的活…

前端实现【 批量任务调度管理器 】demo优化

一、前提介绍 我在前文实现过一个【批量任务调度管理器】的 demo&#xff0c;能实现简单的任务批量并发分组&#xff0c;过滤等操作。但是还有很多优化空间&#xff0c;所以查找一些优化的库&#xff0c; 主要想优化两个方面&#xff0c; 上篇提到的&#xff1a; 针对 3&…

CSS技巧专栏:一日一例 14-纯CSS实现模拟水波波动填充按钮特效

CSS技巧专栏:一日一例 14-纯CSS实现模拟水波波动填充按钮特效 大家好,今天介绍一个在网上很常见的模拟水波波动要灌满按钮的动画效果,效果下面图所示。 本例图片 案例分析 我们沿着Z轴从上到下数一下一共有几个层: 文字层:白色文字阴影的黑色文字,当鼠标移动上来时候…

黑马点评--给店铺类型查询添加缓存

controller/ShopTypeController.java /*** 店铺分类查询&#xff0c;用于展示首页头部店铺分类* return*/GetMapping("list")public Result queryTypeList() {return typeService.queryList();} service/IShopTypeService.java Result queryList(); service/impl/S…

fatal: Could not read from remote repository. 解决方法

问题描述&#xff1a; Git : fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists。 解决方法&#xff1a; 当在网上尝试大量方法仍然失败的时候&#xff0c;不妨试试这个方法。 在 github 上&…

探索 Redis 不同集群架构的性能与应用

1. 引言 Redis的集群配置成为了提高数据可靠性和服务可用性的关键。本文将带领大家了解Redis的四种主要集群架构&#xff0c;并重点分析哨兵模式和Redis Cluster架构和优势。 2. Redis的四种集群架构 2.1 单实例Redis 使用单个 Redis 实例提供服务。适用于小规模应用&#…

论文阅读:Deformable DETR: Deformable Transformers for End-to-End Object Detection

论文阅读&#xff1a;Deformable DETR: Deformable Transformers for End-to-End Object Detection Deformable DETR: 基于稀疏空间采样的注意力机制&#xff0c;让DCN与Transformer一起玩&#xff01; - 知乎 (zhihu.com) 【Deformable DETR 论文源码解读】Deformable Trans…

The Llama 3 Herd of Models.Llama 3 模型第1,2,3部分全文

现代人工智能(AI)系统是由基础模型驱动的。本文提出了一套新的基础模型,称为Llama 3。它是一组语言模型,支持多语言、编码、推理和工具使用。我们最大的模型是一个密集的Transformer,具有405B个参数和多达128K个tokens的上下文窗口。本文对Llama 3进行了广泛的实证评价。我们…

【error】AttributeError: module ‘cv2.dnn‘ has no attribute ‘DictValue‘(库冲突)

conda list conda remove opencv pip uninstall opencv-python conda list pip 同时卸载两个库 pip uninstall opencv-contrib-python opencv-python 没有and 直接写库名 module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法_module cv2.dnn has no attribute d…

Linux - 环境变量、程序地址空间、进程地址空间及Linux2.6内核进程调度队列

目录 环境变量 基本概念 常见环境变量 查看环境变量的方法 测试PATH 测试HOME 测试SHELL 和环境变量相关的命令 环境变量的组织方式 通过代码获取环境变量 通过系统调用获取环境变量 程序地址空间 进程地址空间 Linux2.6内核进程调度队列 一个CPU拥有一个runqueue 优先级 活…

谈一谈爬虫开发工程师

爬虫就只是抓数据的吗&#xff1f;并不是&#xff0c;爬虫工程师的工作不再仅仅是抓取数据&#xff0c;还需要处理其他各种复杂问题&#xff0c;今天我们就来聊聊爬虫开发工程师。 一、 爬虫开发工程师工作内容 爬虫开发工程师是负责编写和维护网络爬虫程序的专业人员。他们的…

【多模态大模型】 ALBEF in NeurIPS 2021

一、引言 论文&#xff1a; Align before Fuse: Vision and Language Representation Learning with Momentum Distillation 作者&#xff1a; Salesforce Research 代码&#xff1a; ALBEF 特点&#xff1a; 该方法使用ViT进行图像特征提取&#xff0c;提出将BERT分两部分&am…

Cocos Creator2D游戏开发(3)-飞机大战(1)-背景动起来

资源见: https://pan.baidu.com/s/1cryYNdBOry5A4YEEcLwhDQ?pwdzual 步骤 1, 让背景动起来 2, 玩家飞机显现,能操控,能发射子弹 3.敌机出现 4. 碰撞效果(子弹和敌机,敌机和玩家) 5. 积分和游戏结束 6. 游戏存档,对接微信小游戏,保存历史最高分 7. cocos发布到微信小游戏 资源…

探索Python的进度条神器:tqdm

文章目录 探索Python的进度条神器&#xff1a;tqdm一、背二、tqdm简介三、安装tqdm四、tqdm的五个简单使用示例五、tqdm在不同场景下的应用六、常见问题及解决方案七、总结 探索Python的进度条神器&#xff1a;tqdm 一、背 景&#xff1a;为什么选择tqdm&#xff1f; 在Python…

苦学Opencv的第十四天:人脸检测和人脸识别

Python OpenCV入门到精通学习日记&#xff1a;人脸检测和人脸识别 前言 经过了十三天的不懈努力&#xff0c;我们终于也是来到了人脸检测和人脸识别啦&#xff01;相信大家也很激动吧。接下来我们开始吧&#xff01; 人脸识别是基于人的脸部特征信息进行身份识别的一种生物识…

Spring 常用的三种拦截器详解

前言 在开发过程中&#xff0c;我们常常使用到拦截器来处理一些逻辑。最常用的三种拦截器分别是 AOP、 Interceptor 、 Filter&#xff0c;但其实很多人并不知道什么时候用AOP&#xff0c;什么时候用Interceptor&#xff0c;什么时候用Filter&#xff0c;也不知道其拦截顺序&am…