我是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(){}
}
}
请指导我使用正确的补救措施代码段
答案 0 :(得分:0)
派生类构造函数不调用基础构造函数,因此$this->db
没有它应该具有的值。在PHP you must do this explicitly。
在这种特殊情况下,您应该完全删除派生的构造函数,因为它没有做任何事情。这将让PHP直接使用基础构造函数。
答案 1 :(得分: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);
了解依赖注入。这是处理需要访问数据库的类的有利方法。不要让所有类扩展数据库,只需在创建新类(需要db)时将datsbase对象作为参数传递。