1

首先:这个问题不是重复的。这就是为什么。我之前关于该主题的问题已作为(所有事情的)副本关闭。那一点帮助都没有——我什么都不懂。我对 OOP 完全陌生——我需要一个适合我理解水平的答案——我不知道链接问题的答案在说什么。仅仅因为这个问题看起来很相似,提问者可能不是——我在之前的问题中特别要求对我的理解水平给出一个“可以理解的”答案。所以,我会再问一次(如果需要,我会再问一次)。开始:


总体而言,我对 PHP 还是比较陌生,对面向对象的 PHP 还是比较陌生,在过去一周内才刚刚开始自学,我仍然无法掌握一些概念,例如继承和什么是类抽象——一些由于我一直在使用 PDO 处理我的数据库连接和查询一段时间,因此我已经能够相当快地掌握它,但除此之外我仍然是 OOPHP 的新手,所以如果我的问题请多多包涵似乎有点“基本”。

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

尝试 {
    $dbh = new PDO(conn. data here);
} 捕捉(PDOException $e){
    回声 $e->getMessage();
}

因此,据我了解,在执行此代码时,$dbh现在将其实例化为 PDO 对象。在我的 init.php 文件的底部有很多需要链接到函数文件,例如user.func.php,images.func.php等。

问题是每当我需要从我的一个函数内部查询数据库时,我需要先声明$dbh为全局,然后才能对其进行操作,如下所示:

功能我的功能{
    全球 $dbh; // 问题来了!

    尝试 {
        $stmt = $dbh->prepare(这里有一些 SQL);
        $stmt->执行();
    } 抓住 {
        // ETC。
    }
}

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

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

不太确定如何替换我对全局变量的使用,因此绝对感谢我能理解的帮助!

4

2 回答 2

1

在非常广泛的术语中-您在这里询问范围 有一些特定的理论,在继续编写代码之前了解这些理论会很有用。我知道它有时看起来很有吸引力,但退一步学习一些理论在这里真的很有用。

您链接到的答案直接跳转到解释依赖注入,但这可能是一个更好的起点(如何向 5 岁的孩子解释依赖注入?)特别是这条评论:https ://stackoverflow.com/a /1639321/181707

最后——我建议你看一些处理这些东西的简单框架——并从阅读源代码中学习。

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

http://pimple.sensiolabs.org/

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

于 2013-03-27T05:38:23.280 回答
-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 !我想你可能想研究一下 Model-View-Controller 框架。我从 cakephp.org 上的博客教程开始,您可以在 youtube 上查看 jream,这是一个创建 MVC 的教程http://www.youtube.com/playlist?list=PL7A20112CF84B2229

于 2013-03-27T05:46:58.100 回答