避免始终将变量传递给类

时间:2012-05-12 14:07:09

标签: php oop static global-variables

我正在用PHP5创建一个Web应用程序。到目前为止,我有两个“全局”变量:$ input和$ sql。 $ input是来自$ _GET,$ _POST和$ _COOKIE的经过验证和清理的输入。 $ sql是我的mysql(i)类的一个实例。

几乎所有其他课程都需要这两个。通过将它们作为参数传递给每个类的__construct函数,可以相对容易地实现这一点。但这似乎......笨拙。除了更多类特定参数和潜在的未来全局变量之外,它还会进行笨拙的函数调用。

简单而且据我所知,noobie替代方案是使用global关键字。我不想那样做。我得到了全局变量的缺点,虽然在我的场景(小应用程序)中,它们并不重要。但是在再次使用它们之前明确地将它们标记为全局也是笨拙的。

我认为这是一种更优雅的方式:我有一个webapp类,我可以从中扩展所有其他类。这个webapp类包含我在多个其他类中需要的常用函数,但不保证单独的类。 如果我将$ input和$ sql作为静态变量存储在此webapp主类中,则可以在所有子类中访问它们。 但我明白静态变量与全局变量一样多,甚至更多。

这是真的吗? 我想我是其中一个过度思考一切的人,但我喜欢优雅的代码,这对我的(业余)眼睛看起来很优雅。

3 个答案:

答案 0 :(得分:2)

  

到目前为止,我有两个“全局”变量

呸!全球都很糟糕。 : - )

  

$ input是来自$ _GET,$ _POST和$ _COOKIE的验证和清理输入

为什么要做到全球化。当您真正要使用它时,只需消毒/标准化/无论如何。

  

$ sql是我的mysql(i)类的一个实例。

再次说明:没有必要让全球化。使用dependency injection

  

简单而且据我所知,noobie替代方案是使用global关键字。我不想那样做。

你是对的:你不想这样做。

  

我认为这是一种更优雅的方式:我有一个webapp类,我可以从中扩展所有其他类。

这听起来也不正确。一个类具有特定的功能(/责任)。

  

但我明白静态变量是不受欢迎的

静态东西只是具有不同名称的全局变量。

如果您希望让自己的生活更轻松,可以实施dependency injection container

答案 1 :(得分:-1)

http://php.net/manual/en/language.oop5.patterns.php

此链接描述了单例模式,它是提供类的单个全局实例的oo-way。我确信这很优雅,因为你会为了子类化而进行子类化,而不要求它们作为参数传递。 这就是我要做的事情:))

答案 2 :(得分:-1)

我个人会在这个例子中使用单身人士。单身人士可能会不满意,但在适当的情况下使用时他们完全没问题。

我会将您的“WebApp”类创建为单例,这意味着只要您需要这些变量,您就可以轻松访问“WebApp”。

如果你之前从未使用过单身,这里有一个例子:

class WebApp
{
    private static $instance = null;
    private $post_data = array();

    private function WebApp(){}

    public static function instance(){
        if(!isset(WebApp::$instance))
            WebApp::$instance = new WebApp();
        return WebApp::$instance;
    }
}

print_r(WebApp::instance()->post_data);