Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.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_Constructor_Destructor - Fatal编程技术网

PHP _;构造函数&__析构函数问题

PHP _;构造函数&__析构函数问题,php,constructor,destructor,Php,Constructor,Destructor,我一直在尝试学习PHP面向对象的一面,我想知道: 如果我使用_构造函数打开与数据库的连接,使用该类中的函数(例如insert),那么定义的_析构函数会在执行方法“insert”后关闭连接吗 class data(){ function __constructor { // connect to db } function insert($data){ // mysql_query(...) } function __destructor { //

我一直在尝试学习PHP面向对象的一面,我想知道:

如果我使用_构造函数打开与数据库的连接,使用该类中的函数(例如insert),那么定义的_析构函数会在执行方法“insert”后关闭连接吗

class data(){
  function __constructor {
    // connect to db
  }

  function insert($data){
    // mysql_query(...)
  }

  function __destructor {
    // close connection to db
  }
}

$obj = new db();
$obj->insert('mumbo jumbo');
或者与数据库的连接是否仍处于打开状态?
因为我读到只有当对象被销毁时,析构函数才会运行。但是如何销毁对象呢?

在PHP中,对象超出范围时会被销毁。这通常是脚本停止执行或在脚本中创建的函数结束时,但您可以使用以下方法在代码的早期销毁对象:

unset($my_variable);  

因此,为了回答您的问题,您应该可以允许析构函数在大多数情况下为您处理关闭DB的操作,特别是在使用小脚本时

是的,只要对构造函数和析构函数使用正确的名称,而不是现有的名称,就可以正常工作。

一旦不再引用该对象,就会销毁该对象,例如,通过
unset()
-ting保存该对象的最后一个变量,或者当脚本执行终止时


顺便说一句,神奇的方法被命名为
\uuu construct
\uu destruct
,没有尾随的
-或

顺便说一句,构造函数和析构函数被称为u construct和u destruct

__当不再引用
db
时,将调用析构函数。通常,当对象超出范围时会发生这种情况,但如果保存了对它的其他引用,则不会发生这种情况。您可以使用删除对
db
的引用

unset($obj);

同样,如果您在任何地方存储了$obj。

请记住,PHP还支持到数据库的持久连接,这意味着即使您的对象已被破坏,到DB的连接仍然是“在后台”打开的,并且在调用相应的pconnect(或PDO模拟)时将被重用下一次。

请注意,如果
$my\u variable
是指向对象的最后一个对象,则该行只会导致对象被释放,并调用其析构函数。为了澄清这一点,如果您使用mysql\u pconnect(),PHP支持持久连接,这通常是不赞成的。所有其他mysql连接方法,AFAIK,在脚本完成执行后自动关闭。哦,除了mysql\u pconnect之外,还有其他方法,如pg\u pconnect、sybase\u pconnect等,这是世界上进行连接池的更好方法,你完全正确。我只是觉得这是一个适当的地方来提及它,因为问题是关于“关闭数据库连接”。我想你的意思是$obj=new data(),而不是db(),因为你调用了你的类数据。您提到了持久连接——您使用的是什么mysql连接方法?我认为mysql_pconnect()是实例化mysql持久连接的唯一方法。不要把我上面的代码看得太重,我只是想表达我的观点。我上面的主要问题是通过在必要时打开和关闭与DB的连接来实现安全连接,因为有些方法可以提高网站的安全性和性能。。。