2013-11-23 237 views
-1

这是我的文件库MySQLi连接ATM: - class.core.php - class.site.php - global.php访问从另一个类

我试图访问从核心数据库连接现场。我尝试了一切,没有任何工作。

class.core.php:

class Core { 

    public $db; 

    public $host = "localhost"; 
    public $username = "root"; 
    public $password = "***"; 
    public $dbname = "***"; 

    public function __construct() { 

     $this->db = new mysqli($this->host, $this->username, $this->password, $this->dbname); 
     if($this->db->connect_errno) { 

      echo $this->db->connect_error(); 

      die(); 

     } 

     return $this->db; 

    } 

} 

class.site.php:

class Site { 

    public $db; 

    public function __construct(Core $db) { 

     $this->db = $db->db; 

    } 

} 

global.php:

require_once("_classes/class.core.php"); 
require_once("_classes/class.site.php"); 

$core = new Core(); 
$site = new Site(); 

我需要的所有帮助我能。谢谢:)

+0

..或者你可以使用'global $ core'在两个构造函数 –

+0

中注入'MySQLi'实例。在Site对象的构造函数中,然后是'$ this-> db = $ core-> db;'... –

+0

@ user0000001为什么要引入全局变量?特别是因为通过执行'$ site = new Site($ core)'也可以达到同样的效果......'虽然这会严重违反[LoD](http://c2.com/cgi/wiki?LawOfDemeter) –

回答

1

我认为你错误地认为构造函数是如何工作的。首先,构造函数不返回任何东西,因此你不应该从构造函数中返回一些东西。我不知道(从来没有试过)返回任何东西,但在那里看起来很奇怪。

第二你几乎得到了依赖注入背后的想法...网站需要一个数据库,然后通过它的构造就像注入了DB:

$core = new Core(); 
$site = new Site($core->db); 

Becareful不要求太多了什么,而不是需要核心为您的网站的工作,需要替代的mysqli,因为你想要的东西多数民众赞成...

class Site { 
    public $db; 
    public function __construct(mysqli $db) { 
     $this->db = $db; 
    } 
} 

这将分离你的依赖一点,解开你的代码尽可能。

最后但并非最不重要的是,避免使用die()/ exit(),使用异常并干净地处理它们。对于用户而言,模具非常非人,并且看起来不太好。通过抛出异常并以美丽的方式处理异常,正确处理数据库问题等异常!

否则,没有理由您当前的代码将无法正常工作,这是别的东西不起作用,我们看不到它!

+0

是否有任何理由为什么你只做了一半-办法?我的意思是,你为什么要将数据库连接从'Core'实例中取出,而不是在外部创建数据库连接,然后在两个实例中注入数据库? –

+1

那就是用户已经拥有的。如果这正是他想要的,那么将数据库保持在核心的方式总是可以实现的,这不是一个非常糟糕的做法,只是创建一点点,但是在这种情况下,这么紧密耦合。 Mysqli类是通用的,所以在这种情况下紧密耦合非常低。 –

+1

考虑他的CORE课程是许多功能的水管工......并非一件坏事,即使在良好的拱门中也需要水管工 –