我有两个班级('数据库'和' 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);
}
}
?>
很抱歉这篇文章很长,并提前感谢您的帮助。
答案 0 :(得分:2)
您的问题不是命名空间。在cms\database
中,您将$this->connection
定义为mysqli
个对象。因此析构函数想要在其上调用$this->connection->close()
。直截了当,简单明了。
cms\app
现在会覆盖此内容,并将$this->connection
定义为cms\database
个对象。继承的析构函数仍然想在其上调用$this->connection->close()
。好吧,cms\database
没有方法close
,正如错误所说的那样。
您的问题是:
__construct
覆盖为$this->connection
,而不是将其定义为__construct
。只需不要覆盖parent::__construct
和/或至少致电$this->connection
,不要将cms\app
重新定义为其他对象。cms\database
正在延长app
。从表面上看,这并没有多大意义。 您的database
a database
?你能用app
的实例替换app
的任何实例吗?这在逻辑上是否有意义?可能不是。看起来extend database
看起来不应该opacity: 0
。如果你摆脱那种奇怪的关系,你的问题也将得到解决。然后查看Dependency Injection。