在具有已定义命名空间的类方法中调用mysqli-object方法

时间:2016-07-26 12:04:10

标签: php oop mysqli

我有两个班级('数据库'和' app')。 '应用'扩展'数据库&#39 ;; 这两个类都有命名空间' cms'。

问题是我想调用存储在类'数据库'的属性中的mysqli对象的close()方法。当我尝试调用该方法时,我收到错误:

  

调用未定义的方法cms \ _database :: close()

我知道为了在当前使用不同命名空间时调用属于PHP的基本命名空间的函数,你可以添加一个" \"在那个功能面前。但是你怎么能用mysqli_object的方法做类似的事情(比如$this->connection->close())?我的整个方法是错误的(如果是的话我应该做什么)?

我在析构函数中尝试过类似的东西

call_user_method("close", $this->connection);

但我得到一个错误,表示"关闭"不能被召唤。

我的代码如下:

的index.php

<?php
    use cms\app;

    require_once "class.database.php";
    require_once "class.app.php";

    $app = new app();
?>

class.app.php

<?php
namespace cms;

use cms\database;

class app extends database {
    public $connection;

    public function __construct(){
        $this->connection = new database();
    }
}

?>

class.database.php

<?php
namespace cms;

class database {
    public $connectionData = array (
        "server" => "localhost",
        "user" => "root",
        "password" => ""
    );
    public $connection;

    public function __construct() {
        $this->connection = mysqli_connect(
            $this->connectionData["server"],
            $this->connectionData["user"],
            $this->connectionData["password"]
        );
    }

    public function __destruct() {
        call_user_method("close", $this->connection);
    }
}

?>

很抱歉这篇文章很长,并提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您的问题不是命名空间。在cms\database中,您将$this->connection定义为mysqli个对象。因此析构函数想要在其上调用$this->connection->close()。直截了当,简单明了。

cms\app现在会覆盖此内容,并将$this->connection定义为cms\database个对象。继承的析构函数仍然想在其上调用$this->connection->close()。好吧,cms\database没有方法close,正如错误所说的那样。

您的问题是:

  1. 您将__construct覆盖为$this->connection,而不是将其定义为__construct。只需不要覆盖parent::__construct和/或至少致电$this->connection,不要将cms\app重新定义为其他对象。
  2. 您的cms\database正在延长app。从表面上看,这并没有多大意义。 您的database a database?你能用app的实例替换app的任何实例吗?这在逻辑上是否有意义?可能不是。看起来extend database看起来不应该opacity: 0。如果你摆脱那种奇怪的关系,你的问题也将得到解决。然后查看Dependency Injection