如何从子类访问父属性? PHP

时间:2013-06-03 19:56:18

标签: php class variables parent

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

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 的用法在这里是错误的,因为子类不扩展父类,但是如何访问它?

谢谢。

3 个答案:

答案 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;
    }
}