调用函数时带构造函数的类和不带构造函数的类的区别?

Mr.*_*mer 2 php web

在此代码中调用函数时,带构造函数的类和不带构造函数的类有什么区别?下面是我的示例代码

带构造函数的类:

    class DatabaseConnection
{
    public $database_host = "";
    public $database_name = "";
    public $database_username = "";
    public $database_password = "";

    public function __construct( $database_host, $database_name, $database_username, $database_password )
    {
        $this->$database_host = $database_host;
        $this->$database_name  = $database_name;
        $this->$database_username = $database_username;
        $this->$database_password  = $database_password;
    }

    public function connect_database()
    {
        $database_connection = null;

        try {
            $database_connection = new PDO( "mysql:host={$database_host};
                                            dbname={$database_name}",
                                            $database_username,
                                            $database_password );

            $database_connection->setAttribute( PDO::ATTR_ERRMODE,
                                                PDO::ERRMODE_EXCEPTION );
        } catch ( PDOException $pdo_exception ) {
            trigger_error( $pdo_exception,
                           E_USER_ERROR );
        }

        return $database_connection;
    }
}
Run Code Online (Sandbox Code Playgroud)

没有构造函数的类:

    class DatabaseConnection
{
    public function connect_database( $database_host, $database_name, $database_username, $database_password )
    {
        $database_connection = null;

        try {
            $database_connection = new PDO( "mysql:host={$database_host};
                                            dbname={$database_name}",
                                            $database_username,
                                            $database_password );

            $database_connection->setAttribute( PDO::ATTR_ERRMODE,
                                                PDO::ERRMODE_EXCEPTION );
        } catch ( PDOException $pdo_exception ) {
            trigger_error( $pdo_exception,
                           E_USER_ERROR );
        }

        return $database_connection;
    }
}
Run Code Online (Sandbox Code Playgroud)

在具有构造函数的类中调用函数:

$db = new DatabaseConnection( "localhost", "dbname", "username", "password" )

$db->connect_database();
Run Code Online (Sandbox Code Playgroud)

在没有构造函数的类中调用函数:

$db = new DatabaseConnection();

$db->connect_database( "localhost", "dbname", "username", "password" );
Run Code Online (Sandbox Code Playgroud)

Jak*_*umi 5

从技术上讲,几乎所有在构造函数中完成的事情也可以在其他函数中完成。不过,使用构造函数是有好处的。我认为一个巨大的好处在于语义。

构造函数的语义

当我说类似的话时$house = new House(),我确实希望有一个房子。我不希望有一个房子的骨架,所有的墙壁和屋顶都不见了。我不希望我需要打电话$house->build()$house->complete()在我创建它之后。因为如果我需要这样称呼它,它不是房子,而是房子的模板或设计或其他任何东西。

同样的逻辑适用于您的DatabaseConnection. 如果我必须打电话connect_database()(在您的两种情况中的任何一种情况下),我会争辩说,DatabaseConnection之前不是数据库连接,那么new DatabaseConnection([args])在您的情况下实际上意味着什么?它创建一个类的对象DatabaseConnection,可以-创建后-用于创建数据库连接。所以,从技术上讲,它是一个DatabaseConnector.

构造函数有很多优点,主要是当您对调用它的函数没有任何影响时。例如,假设您正在为名为 的函数编写数据库连接器getBlogEntry,因为您的博客是超级动态的。

var $connectionString = "mysql:localhost;someparams";

function getBlogEntry($request) {
    global $connectionString; // global is bad, but space is precious
    $db = new DatabaseConnection($connectionString);
    $db->query([query to fetch the current blog entry])
}
Run Code Online (Sandbox Code Playgroud)

这里的重点是,您不想connect在创建对象后调用不同的函数。当对象存在时,连接应该存在。您的 API 应尽可能清晰。从技术上讲,在构造函数中或在另一个函数中执行工作之间可能没有区别,但确实存在语义差异。你应该有一个很好的论据,不要在构造函数中做一些实际使用对象的所有函数所必需的事情。

回答问题

真正回答你的问题。带有构造函数的类有 4 个成员变量,您可以确定创建该类对象的人已经提供了这些值。设置这些值当然也可以由您的connect_database. 对于connect_database它来说,如果它使用成员 vars 或 params 并没有太大的区别(当然有一个小的区别,访问成员 vars 与 params 不同,但这不应该是你的问题 - 特别是在这种情况下)。

但是,在您的特定代码示例中,您根本不需要DatabaseConnection该类!您可以定义(第二个)函数并完成它。