【问题标题】:Is it bad practice to use a global function inside a class ?在类中使用全局函数是不好的做法吗?
【发布时间】:2012-12-30 23:37:55
【问题描述】:

关于在类中使用全局函数的问题,我正在研究 MVC 系统。

以下方法是类的一部分,它调用类中的方法,例如模型和视图我的问题是我在那里有一个名为 redirect() 的全局函数加载到我的引导文件中,因为所有控制器都可能需要访问它,这是一种不好的做法,还是我最好将其作为控制器类的方法,因为所有控制器都扩展了父控制器。

public function post($slug){

  if(!$slug){ redirect('blog'); }

  $data = $this->model->getPost($slug);
  $this->view->render('blog/single', $data);
}

还是静态类更有意义?对于一个简单的重定向功能来说,这似乎有点过头了。

【问题讨论】:

  • 我在想一个带有静态方法的类对于一个小方法来说似乎太多了。
  • 它只是一个标题位置吗?
  • 是的:函数重定向($url){ header('location: '.DIR.$url);出口; }
  • @Dave:虽然如果您有一个包含全局方法的静态类,那么您的redirect() 方法可能不会是该类的唯一方法?
  • 按照目前的情况,虽然我也有 slug 功能..

标签: php class function model-view-controller global


【解决方案1】:

全局函数不一定是坏习惯。有两点需要注意:

命名:您应该确保函数的名称避免冲突并且与其相关的内容很明显。您的重定向功能,预计它会执行请求重定向。相反,如果您的方法与其他更具体的方法相关,则需要通过添加一些上下文信息来明确情况。

状态:全局函数应该是无状态的。这意味着该函数应始终为给定的输入提供相同的结果。如果它根据一天中的时间、某些变量的值等做不同的事情……那么通常这是不好的。这可能看起来像是一个明显的陷阱,但这个问题还有更微妙的版本。这条规则的明显例外实际上是请求一天中的时间......

看起来你的代码符合这两个规则,所以这样做是完全可以接受的。

编辑存在可测试性问题,因为您引用了类所需(或应该)的全局函数,您不能模拟它。例如,在您的重定向示例中,如果不触发重定向函数,您将无法正确测试该类,并且您无法使用该函数的模拟版本来检测是否会调用真正的重定向方法。

【讨论】:

  • 确实如此,但作为一个简单的功能我很满意。
【解决方案2】:

使用全局函数是不好的做法,因为它会使您的类无法测试。您应该将所需的方法放在某个对象上,并将其作为依赖项传递给类。

【讨论】:

  • 因为这是有道理的,我认为这种情况下主控制器将是它的最佳位置。我最初认为视图可能需要它,我也注意到代码点火器使用全局函数进行重定向和 base_url
【解决方案3】:

正如您在 cmets 中指出的那样,它是一种微小的单行方法,如果您使用 PHP 5.3,而不是全局,最好使用 lambda 函数并将其传入,而不是创建一个全新的类。

我会尝试设计代码以便注入依赖项,并可能将引导程序暴露给控制器并在其中存储一个 lambda,然后在你想要的地方调用它。

请参阅http://fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures 了解 lambda 的使用,DI 示例也有望提供一些见解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    相关资源
    最近更新 更多