0

我是 php oop 的新手,所以有点挣扎。

我有一个数据库连接类即:

  class config{

   protected $HOST = "localhost";
   protected $USERNAME = "something" ;
   protected $PASSWORD = "something";
   protected $DATABASE = "something";

// Constructor - open DB connection
function __construct() {

try {
    $this->db = new mysqli($this->HOST, $this->USERNAME, $this->PASSWORD, $this-
    >DATABASE);
    $this->db->autocommit(FALSE);
    }
catch(Exception $e)
    {   
    if($this->db->connect_errno > 0){

    echo 'Caught exception: ',  $e->getMessage(), "\n";
    }
    }

    }

   // Destructor - close DB connection
     function __destruct() {
    $this->db->close();
    }


 }

 $api = new Config();

现在我有另一个班级,我需要从中执行一些任务......但我得到了致命错误。

二等:

  class Myclass extends config {

   function __construct(){}

   public function myfunction()
   {
    try{


     $stmt = $this->db->stmt_init();   /* Error here : Fatal error: Call to a member                 
                                          function stmt_init() on a non-object */
 $query = "SELECT ABC FROM table " ;

 $stmt = $this->db->prepare($query); /* Error here : Fatal error: Call to a member                 
                                          function prepare() on a non-object   */
      }
     catch(){}

   }

   }

请用适当的补救代码段指导我

4

2 回答 2

0

您的派生类构造函数没有调用基构造函数,因此$this->db没有它应该具有的值。在 PHP中,您必须明确地执行此操作

在这种特殊情况下,您应该完全删除派生构造函数,因为它没有做任何事情。这将让 PHP 直接使用基本构造函数。

于 2013-06-24T12:28:15.907 回答
0

在您的子类中,您需要调用父构造函数。当子类被实例化时,PHP 不会自动调用父构造函数。

 class Myclass extends config {

     function __construct($h, $u, $p, $d){ parent::__construct($h, $u, $p, $d); }

此外,您在父类中没有$db属性,因此添加

 class config{

   protected $db;
   protected $HOST = "localhost";
   protected $USERNAME = "something" ;
   protected $PASSWORD = "something";
   protected $DATABASE = "something";

编辑:依赖注入方法:

class config{
   public $HOST = "localhost";
   public $USERNAME = "something" ;
   public $PASSWORD = "something";
   public $DATABASE = "something";
}

class Myclass
{
   protected $db;

   function __construct($db)
   {
      $this->db = $db;
   }

   public function myfunction()
   {
       // do whatever with $this->db
   }
}

$config = new Config();

try
{
    $db = new mysqli($config->HOST, $config->USERNAME, $config->PASSWORD, $config->DATABASE);
    $db->autocommit(FALSE);
}
catch(Exception $e)
{   
    if($db->connect_errno > 0){
        echo 'Caught exception: ',  $e->getMessage(), "\n";
    }
}

$myclass = new Myclass($db);

看看依赖注入。这是处理需要访问数据库的类的有利方法。无需让所有类都扩展数据库,只需在创建新类(需要数据库)时将 datsbase 对象作为参数传递。

于 2013-06-24T12:28:33.730 回答