0

我有一个名为 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
    ...
  }
}

请阻止我,我已经在互联网上搜索了很长时间。谢谢。

4

5 回答 5

8

尝试这样的事情,它使用依赖注入设计模式。

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从未使用适当的对象实例化。

于 2012-06-15T14:20:38.817 回答
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
    ...
  }
}
于 2012-06-15T14:22:10.860 回答
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();

所以,我说将您的数据库连接逻辑声明为静态的。这将非常容易访问

于 2012-06-15T14:26:19.020 回答
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();
    ...
  }
}
于 2012-06-15T14:22:13.560 回答
1

您不能为属性分配这样的值。
创建一个构造函数并在那里分配默认值

于 2012-06-15T14:22:41.117 回答