[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;

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值