[英]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.