【问题标题】:How to access an object from another class?如何从另一个类访问对象?
【发布时间】:2011-04-18 17:15:33
【问题描述】:

我有一个数据库类,用于进行选择、更新、删除MySQL 查询。

现在,我想在另一个类中创建一个 MySQL 查询,但是如果我在 index.php 中定义 $db = new DB();,我不能在另一个类中使用 $db var。如果我想进行查询,是否必须一遍又一遍地定义变量$db?或者有没有办法让$db var 带有一个对象全局变量?

【问题讨论】:

    标签: php class


    【解决方案1】:

    最干净的方法是aggregate injecting 它需要的数据库类。所有其他方法,例如使用global 关键字或使用static 方法,更不用说单例了,都在您的类和全局范围之间引入了紧密耦合,这使得应用程序更难测试和维护。做吧

    // index.php
    $db  = new DBClass;               // create your DB instance
    $foo = new SomeClassUsingDb($db); // inject to using class
    

    class SomeClassUsingDb
    {
        protected $db;
        public function __construct($db)
        {
            $this->db = $db;
        }
    }
    

    如果需要依赖项为实例创建有效状态,请使用Constructor Injection。如果依赖项是可选的或需要在运行时可互换,请使用 Setter Injection,例如

    class SomeClassUsingDb
    {
        protected $db;
        public function setDb($db)
        {
            $this->db = $db;
        }
    }
    

    【讨论】:

    • 我究竟如何使用 $db var than? $this->db->select(); ?
    • @Mike 是的,就像这样。或者通过一个吸气剂(如果你写了一个)
    【解决方案2】:

    您可能想要singleton。这为您提供了一种在代码中的任何位置获取 DB 实例的方法。然后在任何你想查询的地方,先查询$db = DB::getInstance();

    另一种方法是dependency injection,它将一个数据库实例传递给所有需要的类。

    【讨论】:

    • 可以在此处找到 php 中的单例模式示例:weberdev.com/get_example-4002.html
    • 要使一个对象全局可用,您只需要一个静态方法来实例化它。它不必是单例。两者都很臭,所以依赖注入是要走的路。
    【解决方案3】:

    使用魔法函数__autoload()

    【讨论】:

      【解决方案4】:

      首先将您的数据库类设为singleton。然后在您的新课程中,您可以执行以下操作:

      class myNewClass{
        private $_db;
      
        public function  __construct(){
           $this->_db = DB::getInstance();
        }
      }
      

      【讨论】:

        【解决方案5】:

        在一个类上定义它(单独的PHP 文件)。然后在需要 var 的每个 PHP 文件中都需要它。

        【讨论】:

          【解决方案6】:

          在您的index.php 文件中使用

          require_once('path_to_file_with_class.php');
          

          你也可以使用include_once,如果'path_to_file_with_class.php'文件不可用,它会给你一个警告而不是一个错误。

          【讨论】:

            【解决方案7】:

            您可以在 index.php 文件中将其定义为全局,并在类构造函数中也放入 $this->db &= $GLOBALS['db'];

            【讨论】:

              猜你喜欢
              • 2013-09-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多