【问题标题】:PSR-1 2.3 Side Effects Rule examplePSR-1 2.3 副作用规则示例
【发布时间】:2014-11-21 10:45:21
【问题描述】:

从此other question继续。

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";
}

【问题讨论】:

  • 是的,你可以,但你只能在那个方法中使用它。
  • 根据描述,该规则是基于文件的,而不是基于函数的。 -a 文件- 不应该有副作用。因此,据我了解,不应使用您的第二个代码示例。编码 OOP 可以完全避免这种情况,因为您在自动加载器之外没有任何包含。
  • 这就是我的困惑所在 - 第一条评论说没关系,第二条评论说它不是
  • @icc97 只需单独的函数声明和包含。 include(config file);第二个include(function declarations file)...

标签: php standards psr-1


【解决方案1】:

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

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

【讨论】:

  • 我指的是这个答案并从您的网站继续关注,我刚刚发现了您的Kunstube-Router,更具体地说是RouteFactory.php。其中包含require ...; class RouteFactory{...} - 我已经做过很多次类似的事情了。但据我所知,违反这一方影响规则。对吗?
  • 嗯,是的,从这个意义上说,那个库并不是真正符合 PSR 的。我当时不想规定使用自动加载器,而且我还没有来更新它。
  • 好的,太好了,至少我更了解什么是合规/不合规:)
【解决方案2】:

是的,您可以在函数中使用 include。

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

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

【讨论】:

    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2021-11-01
    • 2013-11-12
    • 2013-05-30
    • 1970-01-01
    相关资源
    最近更新 更多