2014-09-26 40 views
1

繼此從other questionPSR-1 2.3副作用規則示例

PSR-1 Guidelines,部分2.3副作用規則限制使用include並在同一文件中聲明的功能,例如:

<?php 
// side effect: loads a file 
include "file.php"; 

// declaration 
function foo() 
{ 
    // function body 
} 

但是你可以一個include函數內部文件?

例如

<?php 
// declaration 
function foo() 
{ 
    // side effect: loads a file 
    include "file.php"; 
} 
+1

是的,你可以,但比你只能在該方法中使用它。 – 2014-09-26 12:15:00

+0

根據描述,規則是基於文件的,而不是基於功能。 - 一個文件 - 不應該有副作用。所以爲了我的理解,你的第二個代碼示例不應該被使用。編碼OOP可以完全避免這種情況,因爲在自動加載器外沒有任何包含。 – DanFromGermany 2014-09-26 12:15:05

+0

這裏是我的困惑來了 - 第一個評論說它確定,第二個評論說它不是 – icc97 2014-09-26 12:19:12

回答

4

瞭解有關此規則的事情是聲明執行之間的差異。您也可以考慮將其作爲加載的代碼與執行的代碼。當你加載的代碼,你不會期望它任何東西只是尚未。例如:

require_once 'utility_functions.php'; 

包含此文件是因爲要使用該文件中的某個實用程序函數。您需要需要包含此文件以使用其中的任何功能,您不能包含該文件。但是,如果該文件關閉併產生一些副作用,只需將其包括在內,就會進入深處的兔子洞。例如,說文件總是改變你的錯誤報告設置。這將是非常煩人的。每當您包含此文件時,您都必須重置錯誤報告:

require_once 'utility_functions.php'; 
error_reporting(E_ALL); 
ini_set('error_display', false); 

這顯然是瘋狂和潛在問題的根源。

另一方面,一旦你執行代碼,你期望代碼執行某事,甚至可能有副作用。你可以用控制代碼執行,不像文件只是被包含在內。

require_once 'utility_functions.php'; 

utility_do_something(); // side effects here are OK and/or expected 
+0

我在回顧這個答案,並從你的網站上看到,我剛剛發現了你的[Kunstube-Router](https:// github .com/deceze/Kunststube-Router /),更具體的是[RouteFactory.php](https://github.com/deceze/Kunststube-Router/blob/master/RouteFactory.php)。這包含'require ...; class RouteFactory {...}' - 我做了幾次類似的事情。但據我所知,違反這一方會影響規則。正確? – icc97 2014-10-20 19:23:36

+1

嗯,是的,那個庫在這個意義上並不是PSR兼容的。我當時不想指定自動加載器的使用,但我還沒有來解決它的更新問題。 – deceze 2014-10-21 04:10:24

+0

好吧,太好了,至少我明白什麼是/不符合要求:) – icc97 2014-10-21 11:42:50