前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从今起尽量用严格模式编写php

从今起尽量用严格模式编写php

原创
作者头像
Tuesday
修改2019-07-31 11:11:15
2.2K0
修改2019-07-31 11:11:15
举报
文章被收录于专栏:Qampp知识库.Qampp知识库.
代码语言:javascript
复制
<?php declare(strict_types=1);

test('test');
strlen([]);

function test(int $p){
    return [];
}

// 错误异常示例.

declare(strict_types=1); php 7 开始, 将declare放每个php文件的顶行, 标明文件为严格模式.

这样你的代码就无比强壮兼容了. 注意,declare仅对当前文件生效, 所以每一个php文件都要写一次,

另外能否不处理错误, 继续执行呢? 答案是否定的.

示例

代码语言:javascript
复制
<?php declare(strict_types=1);

error_reporting(0); // 不显示错误.

strlen(3);

echo 'show href?';

即使配置了不显示错误, 代码也已经在strlen函数处中止.

所以强制兼容的做法是去掉 declare,继续采用非严格模式.

这时你可能会想着把所有函数换成任意类型参数. 比如示例.

代码语言:javascript
复制
<?php declare(strict_types=1);

test([]); 
function test($p){ // 任意类型.
    return strlen($p);  //但里面的操作不是任意的.
}

test函数现在不报错了, 但里面的strlen仍然会错误提示:

代码语言:javascript
复制
Fatal error: Uncaught TypeError: strlen() expects parameter 1 to be string, array given in D:\Qampp\htdocs\test.php:5 Stack trace: #0 D:\Qampp\htdocs\test.php(3): test(Array) #1 {main} thrown in D:\Qampp\htdocs\test.php on line 5

这此可以验证, 类型检查不是单单关注定义, 传入值本身的类型, 也会检查.

那这怎么解决呢? 待后续.

END

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档