我有一个名为DBhelper的类,现在我创建了一个名为UserManager的新类。 我需要UserManager具有GetUserId()和CheckValidation()等功能。所以我需要DBhelper来处理这些数据库操作。但我发现它不能像这样工作:
require_once('DBhelper.php');
class User{
public $databaseHelper = new DBhelper();//syntax error
public $DB = $databaseHelper->connectDB();//syntax error
public function GetUserId(){
$this->databasesHelper->RunSql();//syntax error
...
}
public function CheckValidation(){
$this->databasesHelper->RunSql();//syntax error
...
}
}
请停止我,我已经在互联网上搜索了很长时间。感谢。
答案 0 :(得分:8)
尝试这样的事情,它使用dependency injection设计模式。
class User {
private $db;
public function __construct(DBHelper $db) {
$this->db = $db->connectDB();
}
public function GetUserId(){
$this->db->RunSql();
}
}
以下是实例化的方法:
// Assuming: require( 'DBhelper.php');
$dbh = new DBHelper();
$user = new User( $dbh);
另外,要触摸您的错误,这些都是错误(注意它们不是语法错误,因为它们在语法上是正确的):
public $databaseHelper = new DBhelper();//syntax error
public $DB = $databaseHelper->connectDB();//syntax error
因为您无法将成员变量初始化为非静态值。因此,由于在编译时不知道这些值,所以这是一个错误。
同样,这些电话:
$this->databasesHelper->RunSql();//syntax error
无效,因为$databasesHelper
从未使用适当的对象进行实例化。
答案 1 :(得分:2)
您需要在构造函数或其他适当的方法中实例化您的实例变量。你不能像你那样声明和实例化一个实例变量。
您的代码应该更像这样:
require_once('DBhelper.php');
class User{
public $databaseHelper;
public $DB;
public function User(){
$this->databaseHelper = new DBHelper();
$this->DB = $this->databaseHelper->connectDB();
}
public function GetUserId(){
$this->databaseHelper->RunSql();//syntax error
...
}
public function CheckValidation(){
$this->databaseHelper->RunSql();//syntax error
...
}
}
答案 2 :(得分:1)
您可能不希望在类之外公开数据库类,并且可以在构造函数中实例化它们。更好的事情,你可以将它们传递给构造函数,这样User类甚至不需要知道如何实例化它们 - 食物链上方的东西可以处理它们的创建(特别是如果你以后会有另一个像User这样的类需要它它们)。
class User{
private $databaseHelper;
private $DB;
public function __construct() {
$this->databaseHelper = new DBhelper();
$DB = $databaseHelper->connectDB();
}
public function GetUserId(){
$this->databasesHelper->RunSql();
...
}
public function CheckValidation(){
$this->databasesHelper->RunSql();
...
}
}
答案 3 :(得分:1)
你不能为自己指定类似的价值 创建一个构造函数并在那里指定默认值
答案 4 :(得分:1)
我也做了和你一样的事情。但我已将我的db类声明为以下内容;
public class MySqlDatabase
{
private static $connection;
public static function openConnection()
{
self::$connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS);
if(!self::$connection)
{
throw new Exception("Connection failed to database");
}
mysql_select_db(DB_NAME, self::$connection);
}
public static function closeConnection()
{
if(isset(self::$connection))
{
mysql_close(self::$connection);
}
}
public static function executeQuery($query)
{
$result = mysql_query($query, self::$connection);
if(!$result)
{
throw new Exception("Query execution failed. " . $query);
}
return $result;
}
}
在我的另一个班级里面,我这样叫他们;
MySqlDatabase::openConnection();
MySqlDatabase::executeQuery();
MySqlDatabase::closeConnection();
所以,我说是将数据库连接逻辑声明为静态。这将非常容易访问