[英]What does E_STRICT do?
我真的很想确保我们的代码库没有错误,这些错误会被PHP的内置错误检查所警告,但我想确切地看到E_STRICT强制执行的操作。 通过扩展,什么是PHP的“严格标准”? 我看了,但找不到一份全面的清单。
我从经验中得知的一些严格的标准:
我所知道的关于E_STRICT的是它警告可能会破坏兼容性的代码,但我不确定具体是什么意思。
有没有关于此信息的好资源?
E_STRICT
和“严格标准”是一回事。 ( 它们在PHP 7中删除了 。)
该文档目前没有E_STRICT
特定警告列表,但我们可以通过搜索PHP源来合理地构建一个警告。
下面的列表(我认为从PHP 5.6开始就是准确的)是在Unix系统上通过以下方法形成的:
克隆PHP Git repo:
git clone https://github.com/php/php-src
签出版本5.6.0:
cd php-src git checkout PHP-5.6.0
搜索包含E_STRICT
所有C文件(包含.h
和.c
扩展名的文件):
grep --include=*.[ch] -rl . -e E_STRICT
手动查看每个(21)匹配的文件,找到发出E_STRICT
警告的代码,试图推断出发出警告的情况(我不是C程序员,但要好好猜测一下这些东西,特别是在代码中引用你的人类可读错误消息)然后在交互式PHP shell上测试它们以确保我是对的。
鉴于上述方法略显粗糙,并且依赖于E_STRICT
可以在所有发出E_STRICT
警告的地方的源代码中找到的假设,我可能错过了一些东西 - 但希望至少接近是一个全面的清单。
不带参数调用mktime()
php> mktime();\n PHP严格标准:mktime():您应该使用time()函数\n 而是在第1行的php shell代码中
使用资源作为数组索引
php> $ file_pointer = fopen('/ dev / null','r');\n php> $ array = [3,4,5,6];\n php> $ array [$ file_pointer];\n PHP严格标准:资源ID#2用作偏移量,强制转换为整数(2)\n 在第1行的php shell代码中
将UTF-8以外的多字节编码传递给htmlentities
php> htmlentities('qwertyuiop',0,'BIG5');\n PHP严格标准:htmlentities():只有基本实体替换\n 支持UTF-8以外的多字节编码; 功能是\n 相当于第1行的php shell代码中的htmlspecialchars
php> abstract class Foo {static abstract function bar(); }\n PHP严格标准:静态函数Foo :: bar()不应该是抽象的\n 第1行的php shell代码
使用__construct
方法和以类命名的旧式构造函数声明一个类
php> class MyClass {\n php { function MyClass(){}\n php { function __construct(){}\n php { }\n PHP严格标准:重新定义已定义的类构造函数\n 第3行的php shell代码中的MyClass
在没有下一个结果准备的Mysqli连接对象上调用mysqli_next_result
或mysqli::next_result
php> $ conn = mysqli_connect('127.0.0.1','root');\n php> mysqli_multi_query($ conn,“SELECT'first'; SELECT'second';”);\n php> echo mysqli_use_result($ conn) - > fetch_row()[0];\n 第一\n php> mysqli_next_result($ conn);\n php> echo mysqli_use_result($ conn) - > fetch_row()[0];\n 第二\n php> mysqli_next_result($ conn);\n PHP严格标准:mysqli_next_result():没有下一个结果集。\n 请调用mysqli_more_results()/ mysqli :: more_results()来检查是否\n 在第1行的php shell代码中调用此函数/方法
覆盖子类中的方法,以便为其父级中的同一方法获取不同数量的参数
php> class A {public function foo($ x){}}\n php> class B扩展A {public function foo(){}}\n PHP严格标准:B :: foo()的声明应与之兼容\n 第1行的php shell代码中的A :: foo($ x)\n php> class C扩展A {public function foo($ x,$ y){}}\n PHP严格标准:C :: foo()的声明应与之兼容\n 第1行的php shell代码中的A :: foo($ x)
相应地,声明特征和使用它的类中的相同属性。 这个实际上很好地记录了 :
如果特征定义了属性,则类无法定义具有相同名称的属性,否则将发出错误。 如果类定义兼容(相同的可见性和初始值)或其他致命错误,则为
E_STRICT
。示例#12冲突解决
<?php trait PropertiesTrait { public $same = true; public $different = false; } class PropertiesExample { use PropertiesTrait; public $same = true; // Strict Standards public $different = true; // Fatal error } ?>
严格模式警告的示例:
php> trait PropertiesTrait {\n php { public $ same = true;\n php { }\n php> class PropertiesExample {\n php { 使用PropertiesTrait;\n php { public $ same = true;\n php { }\n PHP严格标准:PropertiesExample和PropertiesTrait定义\n PropertiesExample的组合中的相同属性($ same)。 这有可能\n 考虑使用访问器,不兼容,提高可维护性\n 相反的方法。 类由第4行的php shell代码组成
静态调用非静态方法
php> class Foo {function bar(){}}\n php> Foo :: bar();\n PHP严格标准:不应该调用非静态方法Foo :: bar()\n 静态地在第1行的php shell代码中
非静态地引用静态属性
php> class Cow {static public $ noise ='moo'; }\n php> $ cow = new Cow;\n php> $ cow-> noise =“MOOOOO”;\n PHP严格标准:访问静态属性Cow :: $ noise为非静态\n 在第1行的php shell代码中
通过引用直接传递函数调用的结果。
php> function foo(){return 1; }\n php> 功能栏(&$ some_arg){}\n php> bar(foo());\n PHP严格标准:只有变量应该通过php中的引用传递\n 第1行的shell代码\n php> $ var =&foo();\n PHP严格标准:只应通过引用分配变量\n 第1行的php shell代码
请注意,通过引用传递其他非变量(如文字或常量)是致命错误而不是E_STRICT
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.