扩展类的变量(PHP)

时间:2015-09-28 19:16:10

标签: php

我试图用构造函数中的变量扩展一个类。这是一个小例子。

我的index.php包含以下代码。

<?php

namespace System;

require_once 'App/Config.php';

spl_autoload_register(function($class) use ($config) {
  require_once $config['app']['root'] . '/' . $class . '.php';
});

$app = new App($config);
$app->Start();

?>

一切正常。现在我在类App的构造函数中传递了配置文件。

<?php

namespace System;
use System\Librarys\Database;

class App
{
  protected $config;
  protected $connection;

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

  public function getConnection()
  {
    $this->connection = new Database;
    $this->connection = $this->connection->Connect();

    return $this->connection;
  }

  public function Start()
  {
    echo 'test';
  }

  public function __destruct()
  {
    $this->config     = null;
    $this->connection = null;
  }
}

?>

好的,一切都好!但现在,我想建立数据库连接。我扩展了应用程序&#34;数据库类中的类。如下所示:

<?php

namespace System\Librarys;
use System\App;

class Database extends App
{
  public function __construct()
  {
    parent::__construct(??? HOW DO I GET THE VARIABLE FROM THE "APP" CLASS ???);

    var_dump($this->config);
  }
}

?>

现在,如果我在var_dump()上执行$this->config,则返回null。这很清楚,因为我没有在父构造函数中传递$config var。但是我该怎么做?我想在App类中设置所有变量,以便我可以扩展它,并且不需要将变量传递给其他类。

2 个答案:

答案 0 :(得分:1)

我不清楚为什么你在Database课上没有使用相同的构造函数。 代码如下:

public function __construct($config)
{
   parent::__construct($config);
}

然后在App班级

$this->connection = new Database($this->config);

顺便说一句,如果您不打算向Database构造函数添加更多代码,那么您实际上并不需要它。

P.S。 我在你的代码中看到了糟糕的类设计。您可能正在使用App类进行全局配置,并且数据库连接是其中的一部分。因此,您需要创建一个可以处理所有数据库操作的类。然后,您只需在App的实例中使用它。例如:

class DB {
    function connect() { /* Some code */ }
    // More functions
}

class App {
    protected $db;
    // contructorts etc
    function run() {
        $this->db = new DB(/* some config */);
        // use it
    }
}

答案 1 :(得分:0)

当您在__construct()上致电Database时,您无法从$this->config获取App,因为它尚未设置。

您必须先在构造函数中设置变量才能使用它。

class Database extends App
{
    public function __construct()
    {
        parent::__construct("localhost");
        var_dump($this->config); // $this->config is now "localhost"
    }
}