簡體   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