避免在PHP中使用全局数据库处理程序变量,对于面向对象的PHP新手?

时间:2013-03-27 05:23:11

标签: php oop class global-variables database-connection

首先:此问题重复。这就是原因。我之前关于这个主题的问题被关闭为this(所有事情)的副本。这对任何事都没有帮助 - 我不明白该死的事。我对OOP完全不熟悉 - 我需要根据我的理解水平量身定做的答案 - 我不知道相关问题的答案是在谈论什么。仅仅因为出现的问题是相似的,提问者可能不会 - 我在前一个问题中特别要求对我的理解水平提出'可理解'的答案。所以,我会再问一次(如果需要的话,我会再问)。这是:


我仍然是PHP总体上相当新的,甚至更新的面向对象的PHP,刚刚开始在过去一周内开始自我教育,我仍然无法掌握一些概念,如继承和什么类抽象是的 - 其中一些我已经能够合理地快速恢复,因为我一直在使用PDO来处理我的数据库连接和查询一段时间,但是否则我仍然是OOPHP的新手,所以请耐心等待如果我的问题看起来有点'基本'。

我的每个网页顶部都需要一个初始化文件(init.php),除其他外,它使用PDO连接到MySQL数据库:

try {
    $dbh = new PDO(conn. data here);
} catch(PDOException $e) {
    echo $e->getMessage();
}

因此,据我所知,在执行此代码时,$dbh现在被实例化为PDO对象。在init.php文件的底部,需要链接到函数文件,例如user.func.phpimages.func.php等。

问题是每当我需要从我的一个函数中查询数据库时,我需要在我能够操作之前将$dbh声明为全局,如下所示:

function myFunction {
    global $dbh; // Here's the problem!

    try {
        $stmt = $dbh->prepare(Some SQL here);
        $stmt->execute();
    } catch {
        // etc. 
    }
}

现在,问题不在于我对为什么的理解我必须声明为全局 - 我理解的很多,但我怎么能避免它。我已经阅读了一些关于为什么要避免全局变量的StackOverflow答案,我只是不确定如何。

如何从代码中删除global $dbh?我是否会创建一个数据库处理程序类并在每次实例化它时将我的连接设置传递给构造函数方法并使用它? (似乎有点多余)。

不确定如何替换我对全局变量的使用,所以我能理解的帮助绝对值得赞赏!

2 个答案:

答案 0 :(得分:1)

从广义上讲 - 你在这里问Scope 在编写代码之前,有一些特定的理论可供理解。我知道它有时看起来很有吸引力,但退一步学习一些理论在这里真的很有用。

您链接的答案直接跳到解释依赖注入,但这可能是一个更好的起点(How to explain dependency injection to a 5-year-old?)此评论特别是:https://stackoverflow.com/a/1639321/181707

最后 - 我建议您查看一些处理其中一些内容的简单框架 - 并从阅读源代码中学习。

一个超级简单的依赖注入容器是Pimple:

http://pimple.sensiolabs.org/

快速浏览一下介绍 - 它并不可怕,应该可以帮助你理解所涉及的概念。

答案 1 :(得分:-1)

您可以通过扩展类来避免冗余使用代码。新类从扩展类中获取所有公共和受保护的函数。

<?php
//$dbh stuff up here

class Main{
   public $dbh;
   function __construct() { //this magic function runs when the class is initiated.
       global $dbh;
       $this->dbh = $dbh;
       //dbh will be accessible for this whole class using $this->dbh 
   }
}

class imageClass extends Main{
    public function test(){
       if (isset($this->dbh){
           echo "it works";
       }
    }
}

class userClass extends Main{
   function __construct(){
       //this construct function overwrites the construct function in main so dbh
       //will not be accessible in this class
   }
}

imageFunc::test();

如果您对不重用代码如此关注,为什么要在每个页面的顶部使用init.php !! 我想你可能想看看模型 - 视图 - 控制器框架。我从cakephp.org上的博客教程开始,您可以在youtube上查看jream,这是一个创建MVC http://www.youtube.com/playlist?list=PL7A20112CF84B2229的教程。