1

我在从子级类访问顶级变量时遇到问题。这是一个例子......

应用程序.php:

class Application {
    var $config;
    var $db;

    function __construct() {
        include_once('Configuration.php');
        include_once('Database.php');
        $this->config   = new Configuration;
        $this->db       = new Database;
    }
}

配置.php:

class Configuration {
    var $dbhost = 'localhost';
}

数据库.php:

class Database {
    function __construct() {
        echo parent::config->dbhost;
    }
}

我很清楚,这里使用类是错误的,因为子类没有扩展父类,但是我如何访问它呢?

谢谢你。

4

3 回答 3

1

您应该创建一个Base在其构造中创建$db链接的类。然后让所有需要数据库访问的类扩展该类。您在此处使用“父类”的命名不正确。

class Base {
   private $db;   // Make it read-only

   function __construct() {
      $this->db = DB::connect();    // It's a good practice making this method static
   }

   function __get($property) {
      return $this->$property;
   }
}

class Application {
    public $config;

    function __construct() {
        parent::__construct();

        require_once 'Configuration.php';
        require_once 'Database.php';
        $this->config   = new Configuration();
    }

    function random_function() {
       $this->db(....)    // Has full access to the $db link
    }
}
于 2013-06-03T20:00:37.220 回答
0

父表示法用于访问对象层次结构中对象的父级。您在这里所做的是试图联系来电者,而不是父母

这样做的方法是将配置实例传递给数据库对象。

    class Database {
          protected $config;

          public function __construct(Configuration $config){
                $this->config = $config;
          }

          public function connect(){
                //use properties like $this->config->username to establish your connection. 
          }
    }

当您扩展一个类并创建一个子类来调用父类上的方法时,使用父表示法。

    class MySuperCoolDatabase extends Database {
          protected $is_awesome; 

          public function __construct(Configuration $config){
               // do all the normal database config stuff
               parent::__construct($config);
               // make it awesome
               $this->is_awesome = true;
          }
    }

这定义了一个子类,它是一个类型定义,其作用与基类相同,但实现略有不同。这个实例仍然可以说是一个数据库......只是一种不同类型的数据库。

于 2013-06-03T20:01:01.953 回答
0

好吧,尽管我认为 Orangepills 的答案更好。如果您不想使用它并且由于所有变量都是公共的,您可以像这样简单地传递变量:

class Application {
    var $config;
    var $db;

    function __construct() {
        include_once('Configuration.php');
        include_once('Database.php');
        $this->config   = new Configuration;
        $this->db       = new Database($this->config->dbhost);
    }
}

class Configuration {
    var $dbhost = 'localhost';
}

class Database {
    function __construct($dbhost) {
        echo $dbhost;
    }
}
于 2020-10-16T23:54:06.280 回答