我在从子级别类访问顶级变量时遇到问题。 这是一个例子......
Application.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;
}
}
的configuration.php:
class Configuration {
var $dbhost = 'localhost';
}
database.php中:
class Database {
function __construct() {
echo parent::config->dbhost;
}
}
我很清楚, parent 的用法在这里是错误的,因为子类不扩展父类,但是如何访问它?
谢谢。
答案 0 :(得分: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
}
}
答案 1 :(得分: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;
}
}
这定义了一个子类,它是一个类型定义,它与基类具有相同的作用,但实现略有不同。这个实例仍然可以说是一个数据库......只是一种不同类型的数据库。
答案 2 :(得分: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;
}
}