【问题标题】:Best practice for global variables in an object -对象中全局变量的最佳实践 -
【发布时间】:2015-05-06 14:37:55
【问题描述】:

我有一个关于 PHP OOP 最佳实践的问题,与在方法中使用全局变量有关。我知道我在做的是不正确的,但我不确定应该怎么做。

我们正在使用这个数据库类:https://github.com/joshcam/PHP-MySQLi-Database-Class/blob/master/MysqliDb.php

我们在每个页面都需要的config.php 文件中使用以下代码行创建对象。 $db = new MysqliDb(host,user,pwd,dbname);

但是,如果我们希望访问数据库,我们所有类中的每个方法都必须使用global $db。这是不好的做法吗?如果是这样,应该怎么做?我们的类所有都应该扩展数据库类(MysqlDb)吗?

【问题讨论】:

  • 我不确定它是否适用于您的情况,但可以通过 PHP 类型提示将 $db 对象作为参数传递给另一个类的构造函数/函数:stackoverflow.com/questions/5724677/…。使用它,您可以将 $db 声明为其他类的私有变量/对象,并通过这些类的构造函数启动它。然后这些类的所有函数都可以访问 $db 对象,而不必在每个函数/方法中将其声明为全局变量。
  • 将 $db 注入到所有类的构造函数中,并将其设置为该类的属性,以便所有方法都可以使用它(依赖注入)
  • @MarkBaker 您认为我的评论与您的​​建议指向相同吗?我自己对依赖注入的概念不是很清楚。我们说的是同一件事吗?
  • 为什么不使用任何注册表模式?
  • 这很有意义(将其添加到构造函数中)。仍然可以使用global $db 来完成吗?这可能有点偏离主题,并且是我自己受过教育的,但是如果变量被标记为公共而不是私有会受到什么影响?这会导致它与其他类发生冲突吗...?

标签: php oop php-mysqlidb


【解决方案1】:

mysqli-db 有一个MysqliDb::getInstance() 静态调用来获取一个初始化的对象。所以你在 config.php 中使用new() 初始化它,然后使用MysqliDb::getInstance() 来获取一个对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-19
    • 2018-06-16
    • 2012-07-31
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2011-03-17
    相关资源
    最近更新 更多