我正在用PHP5创建一个Web应用程序。到目前为止,我有两个“全局”变量:$ input和$ sql。 $ input是来自$ _GET,$ _POST和$ _COOKIE的经过验证和清理的输入。 $ sql是我的mysql(i)类的一个实例。
几乎所有其他课程都需要这两个。通过将它们作为参数传递给每个类的__construct函数,可以相对容易地实现这一点。但这似乎......笨拙。除了更多类特定参数和潜在的未来全局变量之外,它还会进行笨拙的函数调用。
简单而且据我所知,noobie替代方案是使用global关键字。我不想那样做。我得到了全局变量的缺点,虽然在我的场景(小应用程序)中,它们并不重要。但是在再次使用它们之前明确地将它们标记为全局也是笨拙的。
我认为这是一种更优雅的方式:我有一个webapp类,我可以从中扩展所有其他类。这个webapp类包含我在多个其他类中需要的常用函数,但不保证单独的类。 如果我将$ input和$ sql作为静态变量存储在此webapp主类中,则可以在所有子类中访问它们。 但我明白静态变量与全局变量一样多,甚至更多。
这是真的吗? 我想我是其中一个过度思考一切的人,但我喜欢优雅的代码,这对我的(业余)眼睛看起来很优雅。
答案 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);