我是OOP的新手。最初我是在类中和构造函数之外定义变量并为它们赋值,但是在今天的Java课程中,我被告知这是不好的风格,应该避免。
这是我模拟的原始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?
答案 0 :(得分:9)
嗯,它还没有运行。您需要更改变量,使它们与您的连接参数匹配:
$dbHost = "localhost";
应该是
$this->dbHost = 'localhost';
我通常不会将我的登录参数放在课堂内。我会在创建对象时将它们传递给构造函数。使用外部配置文件,以便您可以在多个版本上实际使用此类。 :)
更新::
好的,所以这里有一些小OOP配置的金块可以帮助你构建一个动态的数据库类。
签出http://redbeanphp.com/它将允许您进行伪造的ORM风格的数据建模。超级易于安装,并且非常容易使您的数据库正常运行。 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' );
希望指出你正确的方向!祝好运!
答案 1 :(得分:8)
首先:这是没有意义的。
您正在为10年以上的mysql_*
函数创建一个对象包装器。不再维护此php扩展,并且弃用过程为already begun。您不应该在2012年将此API用于任何新项目。
相反,您应该学习如何使用PDO或MySQLi并使用prepared statements。
那说..让我们来看看你的代码:
$this->connection = mysql_conn...
的内容。而是将它存储在局部变量中,在构造函数完成后,您“松散”。private
变量用于所有内容。它们对于扩展原始类的类是不可见的。除非是故意的,否则您应该为此选择protected
。or die('..')
位。如果连接失败,请不要停止整个应用程序。相反,你应该抛出exception,然后可以在构造函数之外处理。答案 2 :(得分:0)
由于您只将它们用于__construct
方法,因此您不需要它们作为类属性。只有$connection
必须保留以供以后使用imho。
最好不要给这些参数赋予任何默认值,但让它们从外部设置。
$db = new DatabaseConnection("localhost", "user", "password", "db");
他们已经有大量的PHP工具,找到它们,阅读它们并从中学习。首先,使用PDO,Java中的真实情况在PHP中并不总是如此。
答案 3 :(得分:0)
后者可能更好,但需要调整:将一些参数传递给构造函数,即连接信息。
您的第一个示例仅在您拥有一个数据库连接时才有用,并且只有在您对连接值进行硬编码时才会有用(您不应该这样)。第二个例子,如果你添加say,$name
参数作为参数,可以用来连接到多个数据库:
我是OOP的新手。最初我是在类中和构造函数之外定义变量并为它们赋值,但是在今天的Java课程中,我被告知这是不好的风格,应该避免。
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());
}
}
因此,使用此样式,您现在可以使用更有用的类。
答案 4 :(得分:0)
这是我的,它运作得相当好:
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
文件,位于服务器上受密码保护的文件夹中,并且只包含在每个类中文件。这也将在尝试另一个连接之前检查连接是否已打开。如果已经建立了一个,它将打开的连接传递给方法。
答案 5 :(得分:-2)
<?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();
?>