繁体   English   中英

E_STRICT做什么?

[英]What does E_STRICT do?

我真的很想确保我们的代码库没有错误,这些错误会被PHP的内置错误检查所警告,但我想确切地看到E_STRICT强制执行的操作。 通过扩展,什么是PHP的“严格标准”? 我看了,但找不到一份全面的清单。

我从经验中得知的一些严格的标准:

  • 警告静态调用非静态方法
  • 警告不兼容的子类函数签名
  • 警告不要通过引用分配值

我所知道的关于E_STRICT的是它警告可能会破坏兼容性的代码,但我不确定具体是什么意思。

有没有关于此信息的好资源?

E_STRICT和“严格标准”是一回事。 它们在PHP 7中删除了 。)

该文档目前没有E_STRICT特定警告列表,但我们可以通过搜索PHP源来合理地构建一个警告。

下面的列表(我认为从PHP 5.6开始就是准确的)是在Unix系统上通过以下方法形成的:

  1. 克隆PHP Git repo:

     git clone https://github.com/php/php-src 
  2. 签出版本5.6.0:

     cd php-src git checkout PHP-5.6.0 
  3. 搜索包含E_STRICT所有C文件(包含.h.c扩展名的文件):

     grep --include=*.[ch] -rl . -e E_STRICT 
  4. 手动查看每个(21)匹配的文件,找到发出E_STRICT警告的代码,试图推断出发出警告的情况(我不是C程序员,但要好好猜测一下这些东西,特别是在代码中引用你的人类可读错误消息)然后在交互式PHP shell上测试它们以确保我是对的。

鉴于上述方法略显粗糙,并且依赖于E_STRICT可以在所有发出E_STRICT警告的地方的源代码中找到的假设,我可能错过了一些东西 - 但希望至少接近是一个全面的清单。

PHP中导致E_STRICT警告的事情

  1. 不带参数调用mktime()

      php> mktime();\n PHP严格标准:mktime():您应该使用time()函数\n 而是在第1行的php shell代码中 
  2. 使用资源作为数组索引

      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代码中 
  3. 将UTF-8以外的多字节编码传递给htmlentities

      php> htmlentities('qwertyuiop',0,'BIG5');\n PHP严格标准:htmlentities():只有基本实体替换\n 支持UTF-8以外的多字节编码;  功能是\n 相当于第1行的php shell代码中的htmlspecialchars 
  4. 声明一个抽象的 静态方法

      php> abstract class Foo {static abstract function bar();  }\n PHP严格标准:静态函数Foo :: bar()不应该是抽象的\n 第1行的php shell代码 
  5. 使用__construct方法和以类命名的旧式构造函数声明一个类

      php> class MyClass {\n php { function MyClass(){}\n php { function __construct(){}\n php { }\n PHP严格标准:重新定义已定义的类构造函数\n 第3行的php shell代码中的MyClass 
  6. 在没有下一个结果准备的Mysqli连接对象上调用mysqli_next_resultmysqli::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代码中调用此函数/方法 
  7. 覆盖子类中的方法,以便为其父级中的同一方法获取不同数量的参数

      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) 
  8. 相应地,声明特征和使用它的类中的相同属性。 这个实际上很好地记录了

    如果特征定义了属性,则类无法定义具有相同名称的属性,否则将发出错误。 如果类定义兼容(相同的可见性和初始值)或其他致命错误,则为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代码组成 
  9. 静态调用非静态方法

      php> class Foo {function bar(){}}\n php> Foo :: bar();\n PHP严格标准:不应该调用非静态方法Foo :: bar()\n 静态地在第1行的php shell代码中 
  10. 非静态地引用静态属性

      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代码中 
  11. 通过引用直接传递函数调用的结果。

      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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM