具有构造函数的类和没有在此代码中调用函数的类之间的区别是什么?下面是我的示例代码
Class w / Constructor:
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;
}
}
没有构造函数的类:
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;
}
}
在具有构造函数的类中调用函数:
$db = new DatabaseConnection( "localhost", "dbname", "username", "password" )
$db->connect_database();
在没有构造函数的类中调用函数:
$db = new DatabaseConnection();
$db->connect_database( "localhost", "dbname", "username", "password" );
答案 0 :(得分:4)
从技术上讲,几乎所有在构造函数中完成的操作也可以在其他函数中完成。但是使用构造函数有一些优点。我认为一个巨大的好处在于语义。
当我说$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])
}
这里的要点是,您不希望在创建对象后调用其他connect
函数。当对象存在时,连接应该存在。您的API应尽可能清晰。从技术上讲,在构造函数或其他函数中执行工作之间可能没有区别,但确实存在语义差异。你应该有一个好的论据,不要在构造函数中做一些实际使用对象的所有函数所必需的东西。
实际回答你的问题。具有构造函数的类有4个成员变量,您可以确定创建该类对象的任何人都提供了这些值。设置这些值当然也可以由connect_database
完成。对于connect_database
,如果它使用成员变量或参数(它当然有一点点差异,那么访问成员变量与params不同,但这不应该是你的关注 - 特别是在这案件)。
但是,在您的特定代码示例中,根本不需要DatabaseConnection
类!你可以定义(第二个)函数并完成它。
答案 1 :(得分:0)
不需要显式定义构造函数;但是,所有类都必须有一个构造函数,如果你不提供任何构造函数,将生成一个默认的空构造函数。如果使用参数创建构造函数,则只需将它们传递给类中的字段。