PSR-1 2.3副作用规则示例


PSR-1 2.3 Side Effects Rule example

接下另一个问题。

在PSR-1指南中,第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";
}

关于这个规则需要理解的是声明执行之间的区别。您也可以将其视为加载代码与执行的代码。当加载代码时,您还不希望它执行任何操作。例如:

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

是的,您可以在函数内部使用include

就这个规则而言,只要在函数内部,你就可以做任何你想做的事情。简单地执行或包含一个声明函数的文件并不能在函数中运行代码。只有在其他文件中有对该函数的调用时,该函数才会运行。

规则中提到Include只是因为它有可能引起副作用。这与echo、sleep或任何其他在运行时具有可观察效果的代码没有什么不同。

正如警告所暗示的,您需要将功能分为两部分。假设您从导致此警告的某个文件MyFunctionality.php开始,例如:

<?php
namespace MyFunctionality;
require_once 'vendor/autoload.php';
class MyClass
{
    public static function someFunction()
    {
    }
}

将类放在自己的文件MyClass.php中:

<?php
namespace MyFunctionality;
class MyClass
{
    public static function someFunction()
    {
    }
}

然后从原始文件中加载:

<?php
namespace MyFunctionality;
require_once 'vendor/autoload.php';
require_once 'MyClass.php';