Php 防止类数据继承
我有一个数据库抽象层,它从一个基类开始,如下所示:Php 防止类数据继承,php,oop,class,class-design,Php,Oop,Class,Class Design,我有一个数据库抽象层,它从一个基类开始,如下所示: class DB { function DB() { $this->host = "xxx"; $this->db = "xxx"; $this->user = "xx"; $this->pass = "xx"; $this->dbh = mysql_connect($this->host, $this->user, $this->pass);
class DB {
function DB() {
$this->host = "xxx";
$this->db = "xxx";
$this->user = "xx";
$this->pass = "xx";
$this->dbh = mysql_connect($this->host, $this->user, $this->pass);
mysql_select_db($this->db);
// etc
}
}
class DBI extends DB {
// etc
}
现在,我希望子类继承数据库句柄,而不是凭据。我尝试过(在DBI类中):
但这扼杀了把手;不知道为什么。还尝试:
class DBI extends DB {
var $host ='';
var $db ='';
var $user ='';
var $pass ='';
}
毫无效果
所以我想知道我是否应该做的只是将数据库连接从类中移开?只需启动带有连接的类文件,并将其保持在该状态
意见?如果不希望子类继承属性,可以将其声明为私有。这仅适用于PHP 5:
class DB {
private $host = "xxx";
private $db = "xxx";
private $user = "xx";
private $pass = "xx";
function DB() {
$this->dbh = mysql_connect($this->host, $this->user, $this->pass);
mysql_select_db($this->db);
// etc
}
}
然而,我不推荐这种方法。数据库设置最好存储在配置文件中。这样,在应用程序之间重用代码就更容易了
将配置变量设置为名为
config.php
的文件中的数组,然后将该数组用作需要它的函数中的全局数组,这仍然很常见。然而,如果可能的话,远离环球也是一个好主意。例如,对于如何管理配置类,有一些很好的设计。您可以从他们的做法中获得一些好的想法。如果您不希望子类继承属性,可以将其声明为private。这仅适用于PHP 5:
class DB {
private $host = "xxx";
private $db = "xxx";
private $user = "xx";
private $pass = "xx";
function DB() {
$this->dbh = mysql_connect($this->host, $this->user, $this->pass);
mysql_select_db($this->db);
// etc
}
}
然而,我不推荐这种方法。数据库设置最好存储在配置文件中。这样,在应用程序之间重用代码就更容易了
将配置变量设置为名为
config.php
的文件中的数组,然后将该数组用作需要它的函数中的全局数组,这仍然很常见。然而,如果可能的话,远离环球也是一个好主意。例如,对于如何管理配置类,有一些很好的设计。你可以从他们的做法中得到一些好主意。那么不要让他们成为成员变量
<?php
class DB
{
var $dbh;
function DB()
{
$this->dbh = mysql_connect( "xxx", "xxx", "xx" );
mysql_select_db( "xx", $this->dbh );
// etc
}
}
class DBI extends DB {
// etc
}
那就不要让它们成为成员变量
<?php
class DB
{
var $dbh;
function DB()
{
$this->dbh = mysql_connect( "xxx", "xxx", "xx" );
mysql_select_db( "xx", $this->dbh );
// etc
}
}
class DBI extends DB {
// etc
}
为什么不通过构造函数传入数据库设置:
function DB($host, $db, $user, $pass) {
$this->host = $host;
$this->db = $db;
$this->user = $user;
$this->pass = $pass;
$this->dbh = mysql_connect($this->host, $this->user, $this->pass);
mysql_select_db($this->db);
}
那你就可以了
function DBI() {
parent::DB('xxx', 'xxx', 'xxx', 'xxx');
}
(在PHP4和PHP5中,父构造函数都不会被隐式调用。这就是为什么您的句柄在
DBI
子类中被“杀死”的原因;它永远不会被初始化。但您真正需要的是切换到PHP5:)为什么不通过构造函数传入数据库设置:
function DB($host, $db, $user, $pass) {
$this->host = $host;
$this->db = $db;
$this->user = $user;
$this->pass = $pass;
$this->dbh = mysql_connect($this->host, $this->user, $this->pass);
mysql_select_db($this->db);
}
那你就可以了
function DBI() {
parent::DB('xxx', 'xxx', 'xxx', 'xxx');
}
(在PHP4和PHP5中,父构造函数都不会被隐式调用。这就是为什么您的句柄在
DBI
子类中被“杀死”的原因;它永远不会被初始化。不过,您真正需要的是切换到PHP5:)最后,最简单的方法就是将连接移出类。如果我用连接启动类文件,那么句柄可用于所有类,而不将$dbh作为类属性。最后,最简单的方法就是将连接移出类。如果我用连接启动类文件,那么句柄对所有类都可用,而不将$dbh作为类属性。当我这样做并转储子对象时,我仍然会得到值,只是标记为private:Incentive对象([table]=>membership\incentivesV2[changedVals]=>Array()[connectionError]=>[host:private]=>xxx[db:private]=>xxx[user:private]=>xxx[pass:private]=>xxx[dbh]=>Resource id#4)不要将var_dump的输出与实际的类成员可见性混淆。是的,数据在那里,但是DBI
的实例无法读取DB
中声明为私有的变量。当我这样做并转储子对象时,我仍然会得到值,只是标记为私有:激励对象([表]=>成员资格激励v2[changedVals]=>数组()[connectionError]=>[host:private]=>xxx[db:private]=>xxx[user:private]=>xxx[pass:private]=>xxx[dbh]=>资源id#不要将var_dump的输出与实际的类成员可见性混淆。是的,数据在那里,但是DBI
的实例无法读取DB
中声明为私有的变量