我是OOP的新手。起初,我在类内和构造函数外定义变量并为其赋值,但在今天的Java OOP课程后,我被告知这是一种糟糕的风格,应该避免。
这是我模拟的原始PHP数据库连接类:
class DatabaseConnection {
private $dbHost = "localhost";
private $dbUser = "root";
private $dbPass = "";
private $dbName = "test";
function __construct() {
$connection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass)
or die("Could not connect to the database:<br />" . mysql_error());
mysql_select_db($this->dbName, $connection)
or die("Database error:<br />" . mysql_error());
}
}
以上内容可以吗?还是以下是更好的方法?
class DatabaseConnection {
private $dbHost;
private $dbUser;
private $dbPass;
private $dbName;
function __construct() {
$this->dbHost = "localhost";
$this->dbUser = "root";
$this->dbPass = "";
$this->dbName = "test";
$connection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass)
or die("Could not connect to the database:<br />" . mysql_error());
mysql_select_db($this->dbName, $connection)
or die("Database error:<br />" . mysql_error());
}
}
我应该关注什么来确保我正确理解OOP?
首先:这毫无意义。
您正在为已有10多年历史的mysql_*
函数创建一个对象包装器。不再维护这个php扩展,并且弃用过程已经开始。2012年,您不应将此API用于任何新项目。
相反,您应该学习如何使用PDO或MySQLi,并使用准备好的语句。
话虽如此。。让我们看看你的代码:
- 构造函数应该接收创建新实例所需的所有参数,参数不应该在类定义中硬编码。如果您需要同时使用两个数据库,该怎么办
- 创建连接时,应将其存储在对象的范围变量中。类似
$this->connection = mysql_conn...
的东西。相反,您将其存储在局部变量中,在构造函数完成后立即"松散" - 不应该对所有内容都使用
private
变量。它们对于将扩展原始类的类是不可见的。除非是有意的,否则您应该为此选择protected
or die('..')
位最多。如果连接失败,请不要停止整个应用程序。相反,您应该抛出一个异常,然后可以在构造函数之外进行处理
嗯,它还不会完全运行。您需要更改变量,使其与您的连接参数匹配:
$dbHost = "localhost";
应该是
$this->dbHost = 'localhost';
我通常根本不会把我的登录参数放在类中。我会在创建对象时将它们传递到构造函数中。使用外部配置文件,这样您就可以在多个生成中实际使用此类。:)
更新::
好的,这里有一些OOP配置的金块,可以帮助您构建一个动态数据库类。
结账http://redbeanphp.com/它将允许您进行psuedoORM风格的数据建模。安装起来超级容易,数据库启动和运行起来也非常容易。http://redbeanphp.com/manual/installing
创建一个包含常量、模板设置、通用函数和AUTOLOADER等内容的配置文件。在版本控制的环境中工作时,配置文件是关键。:)
将数据库类构建为抽象类http://php.net/manual/en/language.oop5.abstract.php
abstract class Database { public function update() { } public function deactivate() { } public function destroy() { } //etc. } class MyAppObject extends Database { }
将所有类文件放入库文件夹,然后将配置文件放入该库。现在,为了让你的生活更轻松,你可以使用自动加载器功能,在需要的时候让你的类变得生动起来,而不必包括任何特定的类。见下文:
//note: this is never explicitly instantiated //note: name your files like this: MyAppObject.class.php function my_fancypants_autoloader( $my_class_name ) { if( preg_match( "%^_(Model_)%", $my_class_name ) ) return; require_once( "$my_class_name.class.php" ); } spl_autoload_register( 'my_fancypants_autoloader' );
- 现在,您所要做的就是在.php文件中包含一个配置文件来访问您的类
希望这能为你指明正确的方向!祝你好运
由于您只在__construct
方法中使用它们,因此不需要将它们作为类属性。只有$connection
必须保留以备日后使用。
最好不要给这些参数提供任何默认值,而是让它们从外部设置。
$db = new DatabaseConnection("localhost", "user", "password", "db");
他们已经有很多PHP工具,找到它们,阅读它们,并从中学习。首先,使用PDO,在Java中正确的东西在PHP中并不总是正确的。
后者可能更好,但需要进行调整:将一些参数传递给构造函数,即连接信息。
只有当你有一个数据库连接,并且你很乐意对连接值进行硬编码(你不应该这样做)时,你的第一个例子才有用。第二个例子,如果添加一个$name
参数作为参数,则可以用于连接多个数据库:
我是OOP新手。起初,我在类内和构造函数外定义变量并为其赋值,但在今天的Java OOP课程后,我被告知这是一种糟糕的风格,应该避免。
class DatabaseConnection {
private $dbHost;
private $dbUser;
private $dbPass;
private $dbName;
function __construct($config) {
// Process the config file and dump the variables into $config
$this->dbHost = $config['host'];
$this->dbName = $config['name'];
$this->dbUser = $config['user'];
$this->dbPass = $config['pass'];
$connection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass)
or die("Could not connect to the database:<br />" . mysql_error());
mysql_select_db($this->dbName, $connection)
or die("Database error:<br />" . mysql_error());
}
}
因此,使用这种样式,您现在有了一个更有用的类。
这是我的,它运行得很好:
class Database
{
private static $_dbUser = 'user';
private static $_dbPass = 'pwd';
private static $_dbDB = 'dbname';
private static $_dbHost = 'localhost';
private static $_connection = NULL;
/**
* Constructor
* prevents new Object creation
*/
private function __construct(){
}
/**
* Get Database connection
*
* @return Mysqli
*/
public static function getConnection() {
if (!self::$_connection) {
self::$_connection = @new mysqli(self::$_dbHost, self::$_dbUser, self::$_dbPass, self::$_dbDB);
if (self::$_connection -> connect_error) {
die('Connect Error: ' . self::$_connection->connect_error);
}
}
return self::$_connection;
}
}
通过使__construct
为空,它可以防止从任何地方实例化新类。然后,使函数静态,所以现在我需要做的就是Database::getConnection()
,这都在include
文件中,在服务器上受密码保护的文件夹中,并且只包含在每个类文件中。这也将在尝试另一个连接之前检查一个连接是否已经打开。如果已经建立了一个,它会将打开的连接传递给该方法。
<?php
class config
{
private $host='localhost';
private $username='root';
private $password='';
private $dbname='khandla';
function __construct()
{
if(mysql_connect($this->host,$this->username,$this->password))
{
echo "connection successfully";
}
}
function db()
{
mysql_select_db($this->$dbname);
}
}
$obj=new config();
?>