在PHP中的所有类中自动访问变量?

时间:2016-06-19 01:54:57

标签: php oop mysqli

我遇到了这个错误:

Notice: Undefined variable: mysqli in /path/to/component.php on line 24

这是在这段代码中:

class Component {
  public function foo() {
    // something using $mysqli;
  }
}

要解决此问题,我必须将global $mysqli添加到我的foo方法中 - 我理解这一点,但这对我来说并不实用,因为我更喜欢简单默认情况下,可以在所有类中访问$mysqli

这可能吗?

4 个答案:

答案 0 :(得分:1)

简短的回答是:不。没有办法改变PHP中范围的处理方式。

由于这可能对你没什么帮助,我会尝试解释一个更好的方法。

function add(x,y) return {x,x/2.0,y,y*y,x*y,x+y} end 关键字是PHP的特性之一。有些人认为这是愚蠢的,但它有一定的逻辑。编程中的许多模式都是关于保持依赖关系的显式。你班上发生的东西不应该取决于外面的世界状况。在您的情况下(或者使用global导入全局变量时,您将您的类与其所处的环境耦合。由于各种原因,这很糟糕。

如果您的类需要数据库连接,则应明确injecting依赖关系,而不是从全局范围隐式提取它。

如果类需要依赖项才能运行,那么注入它的明显位置是在构造函数中。

例如:

global

答案 1 :(得分:1)

对于某些项目,拥有一个数据库并与之建立连接是完全可以接受的。愿意从任何地方访问它而不使用令人讨厌的global或将其全部注入整个地方是完全合理的。

我做的一种方法就是在静态对象中建立连接,可以从项目的任何位置访问。我是如何工作的:

  1. 使用Composer自动加载我的课程而不必担心。这里有一些关于如何执行此操作的详细信息:Using Composer's Autoload
  2. 为数据库连接创建一个类。
  3. class Database
    {
        public static $connection;
    
        public static function connect($host, $user, $password, $database)
        {
            self:$connection = mysqli_connect($host, $user, $password, $database);
        }
    }
    
    1. 只要Composer包含您的Database::$connection课程,您现在就可以从任何地方访问Database。不需要全局...
    2. 静态类对于这些类型的用法非常有用。但是有些人不喜欢他们,因为他们更难以在some cases中进行测试。没有完美的解决方案,但在不惜一切代价避免不良模式的同时做有意义的事情。

答案 2 :(得分:0)

您可以将其发送到构造函数:

      class Component {

           protected $mysqli;

           public function Component($mysqli = null) {
                $this->mysqli = $mysqli;
           }  

          public function foo() {
             // something using $mysqli;
           }
      }

或在创建后通过其他类别设置它来设置:

     class Component {

         protected $mysqli;

         public function SetDBClass($mysqli) 
            {
                $this->mysqli = $mysqli;
            }  

     public function foo() 
        {
             // something using $mysqli;
         }
     }

答案 3 :(得分:0)

  1. 在声明变量之前使用global关键字
  2. 或者将它放入$ GLOBALS数组中。
    有关变量范围的更多信息,请查看以下链接:http://php.net/manual/en/language.variables.scope.php#language.variables.scope.global