Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于刚接触面向对象PHP的人来说,避免在PHP中使用全局数据库处理程序变量?_Php_Oop_Class_Global Variables_Database Connection - Fatal编程技术网

对于刚接触面向对象PHP的人来说,避免在PHP中使用全局数据库处理程序变量?

对于刚接触面向对象PHP的人来说,避免在PHP中使用全局数据库处理程序变量?,php,oop,class,global-variables,database-connection,Php,Oop,Class,Global Variables,Database Connection,第一:这个问题不是重复的。原因如下。我先前关于这个话题的问题是以所有事物的重复而结束的。这一点帮助都没有——我一点都不懂。我对OOP完全陌生——我需要一个适合我理解水平的答案——我不知道链接问题的答案是什么。只是因为问题看起来很相似,提问者可能不是——我在之前的问题中特别要求对我的理解水平给出一个“可理解”的答案。所以,如果需要的话,我会一次又一次地问。下面是: 总体而言,我对PHP还是相当陌生的,甚至对面向对象的PHP也比较新,在过去的一周里,我才开始学习PHP,我仍然无法掌握一些概念,比如继

第一:这个问题不是重复的。原因如下。我先前关于这个话题的问题是以所有事物的重复而结束的。这一点帮助都没有——我一点都不懂。我对OOP完全陌生——我需要一个适合我理解水平的答案——我不知道链接问题的答案是什么。只是因为问题看起来很相似,提问者可能不是——我在之前的问题中特别要求对我的理解水平给出一个“可理解”的答案。所以,如果需要的话,我会一次又一次地问。下面是:

总体而言,我对PHP还是相当陌生的,甚至对面向对象的PHP也比较新,在过去的一周里,我才开始学习PHP,我仍然无法掌握一些概念,比如继承和什么是类抽象——其中一些概念我已经能够很快掌握,因为我已经使用PDO处理了一段时间的数据库连接和查询,但除此之外,我仍然是OOPHP的新手,所以如果我的问题看起来有点“基本”,请耐心听我说

我在每个网页的顶部都有一个初始化文件init.php,其中包括使用PDO连接到MySQL数据库的文件:

try { $dbh = new PDO(conn. data here); } catch(PDOException $e) { echo $e->getMessage(); } 现在,问题不在于我对为什么我必须宣布自己是一名全球公民的理解——我了解那么多,而在于我如何才能避免它。我读过一些关于为什么要避免全局性的答案,我只是不知道如何避免

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


不太确定如何替换我对全局变量的使用,所以帮助我理解是非常感谢的

用非常宽泛的术语——你在这里问的是 在开始编写代码之前,了解一些特定的理论是非常有用的。我知道它有时看起来很吸引人,但退一步学习一些理论在这里真的很有用

您链接到的答案直接跳到了解释依赖项注入,但这可能是一个更好的地方,尤其是开始这个评论:

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

超级简单的依赖性注射容器是Pimple:


快速浏览一下简介-它并不可怕,应该可以帮助您了解相关概念。

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

<?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的教程。

你不理解问题的答案并不意味着你的问题不是重复的。然而,你现在至少有一个答案可以帮助你前进。“祝你好运!”瓦斯科海特说的没错,但即便如此,我的问题和他的问题之间的关系充其量也似乎很微妙。我想知道如何在我的代码中停止在函数中使用全局变量,他想知道如何正确设置PDO连接。如果有人能告诉我他的问题如何回答我的问题,我将不胜感激!谢谢。我投了反对票,因为您建议将$dbh变量放入全局范围。这是不好的做法,也是OP特别想要避免的。很好的答案。这里很好地描述了PHP如何处理作用域
<?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();