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

PHP中是否需要析构函数?

PHP中是否需要析构函数?,php,Php,我的PHP数据库类如下所示。是否认为使用析构函数是最佳实践 <?php class Database{ private $host; private $username; private $password; private $database; private $conn; public function __construct($host, $username, $password, $database){ $this

我的PHP数据库类如下所示。是否认为使用析构函数是最佳实践

<?php
class Database{
    private $host;
    private $username;
    private $password;
    private $database;

    private $conn;

    public function __construct($host, $username, $password, $database){
        $this->host = $host;
        $this->username = $username;
        $this->password = $password;
        $this->database = $database;

        $this->connect();
    }
    public function connect(){
        try{
            
            $this->conn = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->database, $this->username, $this->password);

        } catch(PDOException $e){
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }
    }
    public function runSQL($query, $params=null){
        try {
            $statement = $this->conn->prepare($query);
            $statement->execute($params);
            return true;
        } catch (PDOException $e) {
            print "Error" . $e->getMessage();
        }
    }
    
    public function close(){
        $this->conn = null;
    }

    /*
        // is this needed??
        function __destruct() {
            $this->conn->close();
        }

    */
}
?>
在不包含析构函数的情况下,一切正常,但我担心这是否容易受到内存泄漏的影响


提前感谢:)

通常,除非您有特定的原因,否则不需要在PHP中定义析构函数或显式关闭连接

在PHP最常见的用例CGI web服务中,进程只在单个HTTP请求的范围内运行。在请求结束时,所有资源都被垃圾收集,因此所有连接都被隐式关闭,就好像您调用了它们各自的
close()

例如,如果您正在编写一个持久的、长期运行的守护进程,那么您可能有理由担心打开的连接。但是,未设置或超出范围的资源最终将被垃圾收集,并且任何连接资源都将被隐式关闭

如果我必须为析构函数做一个斯特劳曼参数,假设应用程序需要通过原始TCP套接字与服务对话,并且为了优雅地关闭连接,需要发出最后的命令,那么我将编写一个析构函数,如:

public函数uuu destruct(){
$this->conn->send(“退出”);
$this->conn->close();
}
即使在这种情况下,对于大多数设计良好的服务来说,这也不会是一个问题,因为从另一端关闭的连接非常清楚地表明会话已经结束


这并不是说你不能或不应该显式地关闭连接或编写析构函数,只是在绝大多数情况下,这种方式或那种方式都没有多大区别。

到数据库的连接应该可以用于所有要运行的查询。可能是整个请求的单例对象。对于一个查询,关闭它,然后再次打开新的查询,这是没有好处的。MySQL(例如)的连接会自动关闭,不管您是否显式关闭它。一旦不再需要连接(不再需要查询!),就立即关闭连接,以便将其免费提供给任何其他应用程序。始终在释放实例时(最晚发生垃圾回收时)调用析构函数。释放资源是一个很好的实践,但在OOP中,这是自动发生的,PDO是。因此,如果您的代码结束,它将被清理。因此,你不需要关闭它。“我不会在这里出错吗?”不会,因为没有调用析构函数。但是,如果您调用了
unset($db)
,您会调用它。在该特定代码中,变量
$db
在全局级别的作用域中,因此一旦函数运行,它将保持在作用域中。也就是说,析构函数在PHP代码中非常少见。肯定有用例,但它们通常非常具体,您将知道何时真正需要它们。
$db = new Database( [configuration here]);

function one($db) {
    $sql = " ...";
    return $db->runSQL($sql;
}

function two($db) {
    $sql = " ...";
    return $db->runSQL($sql);
}


// this should be fine
$x = one($db);

// if the destruct is in place,
//  wouldn't I get an error here?
$y = two($db);