Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 防止类数据继承_Php_Oop_Class_Class Design - Fatal编程技术网

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
中声明为私有的变量