2012-12-30 58 views
3

关于在类中使用全局函数的问题,我正在开发一个MVC系统。在类中使用全局函数是不好的做法吗?

下面的方法是调用类中的方法,如模型,我的问题是我有在那里的全局函数调用的重定向()我已经设定,在功能文件的视图类的一部分这是加载在我的引导文件中,因为所有的控制器都可能需要访问它,这是一种不好的做法,或者我最好将此作为控制器类的一种方法,因为所有控制器都扩展了父控制器。

public function post($slug){ 

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

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

或者静态类会更有意义吗?对于简单的重定向函数来说似乎有点过分了。

+0

这对我来说似乎很好。 – Dai

+0

定义'静态'类? – PeeHaa

+0

我在想一个静态类的方法,对于一个小方法来说似乎太多了。 – Dave

回答

6

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

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

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

它看起来像你的代码中有遵守这两条规则,所以它是完全可以接受的做到这一点。

编辑还有就是可测试性问题,因为你是引用了在由类要求(或应该是)一个全球性的功能,你不能嘲笑这个。例如,在您的重定向示例中,如果不触发重定向功能,则无法正确测试该类,并且不能使用函数的模拟版本来检测真正的重定向方法是否已被调用。

+0

这是真的,但作为一个简单的函数,我很满意。 – Dave

2

使用全局函数是不好的做法,因为它会让你的类无法测试。你应该把你想要的方法放到某个对象上,并把它作为它们的依赖项传递给类。

+0

,因为这很有意义,我认为这种情况下主控制器将是它的最佳位置。 我的初始认为视图可能需要它,我也注意到代码点火器使用全局函数重定向和base_url – Dave

0

正如你指出在评论这是一个很小的一个衬垫的方法,如果你使用PHP 5.3,而不是全球性会更好使用lambda函数,并传递它,而不是创建一个全新的类。

我会尝试和设计代码,所以依赖注入,也许暴露引导到控制器和存储拉姆达在那里然后只是把它在那里你想要的。

请参阅http://fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures lambda使用,DI示例也将提供一些洞察力,希望。

相关问题