我正在用PHP5创建一个Web应用程序。到目前为止,我有两个"全局"变量:$input和$sql。$input是来自 _GET 美元、_POST 美元和 _COOKIE 美元的经过验证和清理的输入。$sql是我的 mysql(i( 类的一个实例。
几乎所有其他班级都需要这两个。通过将它们作为参数传递给每个类的__construct函数,可以相对容易地实现这一点。但这似乎...笨拙。随着更多特定于类的参数和潜在的未来全局变量,它使得函数调用变得笨拙。
据我所知,简单且菜鸟的替代方案是使用全局关键字。我不想那样做。我了解全局变量的缺点,尽管在我的场景(小应用程序(中它们并不重要。但是,在再次使用它们之前明确地将它们标记为全局也是笨拙的。
我想一种更优雅的方式:我有一个 webapp 类,我从中扩展所有其他类。这个 webapp 类包含我在多个其他类中需要的常见函数,但不能保证单独的类。如果我在此 Web 应用程序大师类中将$input和$sql存储为静态变量,则可以在所有子类中访问它们。但我知道静态变量与全局变量一样不受欢迎,如果不是更多的话。
这是真的吗?我想我是那些过度思考一切的人之一,但我喜欢优雅的代码,这在我(业余(眼中看起来很优雅。
到目前为止,我有两个"全局"变量
呸!全局变量不好。:-)
$input是经过验证和净化的输入,价格为 _GET 美元、_POST 美元和 _COOKIE 美元
你为什么要把它变成全球性的。只需在您真正要使用它时对其进行消毒/标准化/任何操作。
$sql是我的 mysql(i( 类的一个实例。
再说一遍:没有必要把它变成全球性的。使用依赖注入。
据我所知,简单且菜鸟的替代方案是使用全局关键字。我不想那样做。
你是对的:你不想那样做。
我想一种更优雅的方式:我有一个 webapp 类,我从中扩展所有其他类。
这听起来也不是很正确。类具有特定的功能(/责任(。
但我知道静态变量同样令人皱眉
静态的东西只是具有不同名称的全局变量。
如果你确实想让你的生活更轻松,你可以实现一个依赖注入容器。
http://php.net/manual/en/language.oop5.patterns.php
此链接描述了单例模式,它是提供类的单个全局实例的 oo-way。我相信这已经足够优雅了,否则你会为了子类而进行子类化,并且不需要它们作为参数传递。这就是我会做的:)
我个人会在这个例子中使用单例。单例可能会皱眉,但是在正确的情况下使用时,它们完全没问题。
我会将您的"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);