1

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

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

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

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

真的吗?我想我是那些想太多所有事情的人之一,但我喜欢优雅的代码,这在我(业余)眼中看起来很优雅。

4

3 回答 3

2

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

呸!全局变量很糟糕。:-)

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

你为什么要把它变成全球性的。只需在您真正要使用它时进行消毒/标准化/任何事情。

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

再说一遍:没有必要把它变成全球性的。使用依赖注入

据我了解,简单且 noobie 的替代方法是使用 global 关键字。我不想那样做。

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

我想一种更优雅的方式:我有一个 webapp 类,我从中扩展了所有其他类。

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

但我知道静态变量同样不受欢迎

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

如果你确实想让你的生活更轻松,你可以实现一个依赖注入容器

于 2012-05-12T14:10:12.417 回答
-1

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

此链接描述了单例模式,它是提供类的单个全局实例的OO方式。我敢肯定这已经足够优雅了,因为否则你会为了子类化而进行子类化,而不是要求它们作为参数传递。这就是我会做的:)

于 2012-05-12T14:12:11.743 回答
-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);
于 2012-05-12T14:14:51.430 回答